LSA – Скрытый семантический анализ – как закодировать его в PHP?

Я хотел бы реализовать скрытый семантический анализ (LSA) в PHP, чтобы узнать темы / теги для текстов.

Вот что я думаю, что мне нужно делать. Это верно? Как я могу закодировать его в PHP? Как определить, какие слова выбрать?

Я не хочу использовать внешние библиотеки. У меня уже есть реализация для сингулярного декомпозиции значений (SVD) .

  1. Извлеките все слова из данного текста.
  2. Вес слов / фраз, например, с tf-idf . Если взвешивание слишком сложно, просто возьмите количество вхождений.
  3. Создайте матрицу: столбцы – это некоторые документы из базы данных (чем больше, тем лучше?), Строки – это все уникальные слова, значения – это числа вхождений или веса.
  4. Разделяйте сингулярную декомпозицию (SVD).
  5. Используйте значения в матрице S (SVD) для уменьшения размера (как?).

Я надеюсь, что вы можете мне помочь. Заранее большое спасибо!

    Ссылки LSA:

    • Статья Ландауера (соавтор) о LSA
    • руководство пользователя R-project lsa

    Вот полный алгоритм. Если у вас есть SVD, вы больше всего там. В приведенных выше документах это лучше, чем у меня.

    Предположения:

    • ваша функция SVD даст сингулярные значения и особые векторы в порядке убывания. Если нет, вам нужно сделать больше акробатики.

    M : corpus matrix, w (слова) по d (документы) (w строк, d столбцов). Это могут быть сырые подсчеты, или tfidf или что угодно. Стоп-слова могут быть или не быть устранены, и может произойти возникновение (Ландауэр говорит, что держит стоп-слова и не имеет значения, но да, чтобы tfidf).

    U,Sigma,V = singular_value_decomposition(M) U: wxw Sigma: min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values V: dxd matrix Thus U * Sigma * V = M # you might have to do some transposes depending on how your SVD code # returns U and V. verify this so that you don't go crazy :) 

    Тогда редуктивность …. фактическая статья LSA предлагает хорошее приближение для основания – сохранить достаточно векторов, чтобы их сингулярные значения составляли более 50% от общего числа сингулярных значений.

    Более сукцинивно … (псевдокод)

     Let s1 = sum(Sigma). total = 0 for ii in range(len(Sigma)): val = Sigma[ii] total += val if total > .5 * s1: return ii 

    Это вернет ранг нового базиса, который раньше был min (d, w), и теперь мы будем аппроксимировать с помощью {ii}.

    (здесь, '-> простое, а не транспонированное)

    Мы создаем новые матрицы: U ', Sigma', V ', с размерами wx ii, ii x ii и ii x d.

    В этом суть алгоритма LSA.

    Эта результирующая матрица U '* Sigma' * V 'может использоваться для поиска улучшенных косинусов, или вы можете выбрать, например, верхние 3 слова для каждого документа в нем. Является ли этот yeild больше, чем простой tf-idf, является предметом некоторых дебатов.

    Для меня LSA плохо работает в реальных наборах данных из-за многозначности и наборов данных со слишком большим количеством тем. Это математическая / вероятностная основа необоснованна (она предполагает нормальные-иш (гауссовские) распределения, которые не имеют смысла для подсчета слов).

    Ваш пробег определенно изменится.

    Пометка с использованием LSA (один метод!)

    1. Построить размерно-уменьшенные матрицы U 'Sigma' V 'с использованием SVD и эвристической редукции

    2. Рукой взгляните на матрицу U и придумайте термины, описывающие каждую «тему». Например, если самыми большими частями этого вектора были «Бронкс, Янки, Манхэттен», то «Нью-Йорк» мог бы быть хорошим для него. Храните их в ассоциативном массиве или списке. Этот шаг должен быть разумным, так как число векторов будет конечным.

    3. Предполагая, что у вас есть вектор (v1) слов для документа, тогда v1 * t (U ') даст самые сильные «темы» для этого документа. Выделите 3 наивысших значения, затем укажите их «темы», которые были вычислены на предыдущем шаге.

    Этот ответ не относится непосредственно к вопросу о плакатах, а к метаму вопросу о том, как делать сообщения для автотага. ОП упоминает Именованное распознавание сущностей, но я считаю, что они означают нечто большее по линии автомата. Если они действительно означают NER, тогда этот ответ – это hogwash 🙂

    Учитывая эти ограничения (600 пунктов / день, 100-200 символов / элементов) с различными источниками, здесь приведены некоторые параметры пометки:

    1. Рукой. Аналитик мог легко сделать 600 из них в день, возможно, через пару часов. Возможно, что-то похожее на Механический тур Амазонки, или заставить пользователей сделать это. Наличие некоторого количества «помеченных вручную», даже если это всего лишь 50 или 100, будет хорошей основой для сравнения того, что вы получили от автогенерированных методов.

    2. Уменьшение размерности, использование LSA, Тема-модели (Скрытое распределение Дирихле) и т. Д. … Я действительно плохо повезло с LSA в реальных наборах данных, и я не удовлетворен его статистической основой. LDA я нахожу намного лучше и имеет невероятный список рассылки , который лучше всего думает о том, как назначать темы текстам.

    3. Простая эвристика … если у вас есть актуальные новости, а затем используйте структуру новостной статьи . Сосредоточьтесь на первом предложении, выбросьте все общие слова (остановите слова) и выберите лучшие 3 существительные из первых двух предложений. Или, черт возьми, возьмите все существительные в первом предложении и посмотрите, откуда это вы. Если все тексты написаны на английском языке, сделайте часть анализа речи на всем шебанге и посмотрите, что из этого вы получите. Со структурированными элементами, такими как новостные отчеты, LSA и другие независимые от заказа методы (tf-idf) выдают много информации.

    Удачи!

    (если вам нравится этот ответ, возможно, задайте вопрос, чтобы он соответствовал ему)

    Все выглядит правильно, вплоть до последнего шага. Обычным обозначением для SVD является то, что он возвращает три матрицы A = USV *. S – диагональная матрица (что означает весь нуль от диагонали), который в этом случае в основном дает оценку того, насколько каждый размер захватывает исходные данные. Цифры («сингулярные значения») опускаются, и вы можете найти отсев для того, сколько измерений полезно. В противном случае вам нужно просто выбрать произвольное число N для определения количества измерений.

    Здесь я немного расплывчатый. Координаты терминов (слов) в пространстве с уменьшенной размерностью находятся либо в U, либо в V, я думаю, в зависимости от того, находятся ли они в строках или столбцах входной матрицы. Сразу же, я думаю, координаты для слов будут строками U. то есть первая строка U соответствует первой строке входной матрицы, то есть первому слову. Затем вы просто берете первые N столбцов этой строки в качестве координаты слова в сокращенном пространстве.

    НТН

    Обновить:

    Этот процесс пока не дает вам точно узнать, как выбрать теги. Я никогда не слышал, чтобы кто-либо использовал LSI для выбора тегов (алгоритм машинного обучения может быть более подходящим для задачи, например, деревья решений). LSI говорит вам, схожи ли два слова. Это далеко от назначения тегов.

    Есть две задачи: а) каков набор тегов для использования? б) как выбрать лучшие три тега ?. Я не очень понимаю, как LSI поможет вам ответить (a). Вы можете выбрать набор тегов вручную. Но, если вы используете LSI, теги, вероятно, должны быть словами, которые встречаются в документах. Затем для (b) вы хотите выбрать теги, которые ближе всего к словам, найденным в документе. Вы можете экспериментировать с несколькими способами его реализации. Выберите три тега, которые наиболее близки к любому слову в документе, где близость измеряется по сходству косинусов (см. Википедию) между координатой тега (его строка в U) и координатой слова (его строка в U).

    Существует дополнительный поток SO на опасностях, связанных с этим, в PHP в тексте ссылки .

    В частности, есть ссылка на эту статью о скрытом семантическом сопоставлении , в которой описывается, как получить результирующие «темы» для текста.