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

StackOverflow https://stackoverflow.com/questions/1014927

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Ссылки LSA:

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

Допущения:

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

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

U,Sigma,V = singular_value_decomposition(M)

U:  w x w
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:  d x d 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', Сигма', V', с размерами w x ii, ii x ii и ii x d.

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

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

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

Ваш пробег определенно будет отличаться.

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

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

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

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

Другие советы

Этот ответ не напрямую на вопрос авторов, а на мета-вопрос о том, как автоматически отмечать новости. В OP упоминается «Распознавание именованных сущностей», но я считаю, что они имеют в виду нечто большее, чем автоматические пометки. Если они действительно имеют в виду NER, то этот ответ фигня:)

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

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

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

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

  • Удачи!

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

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

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

    HTH

    Обновить:

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top