2009-06-18 2 views
9

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

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

Я не хочу использовать внешние библиотеки. I've already an implementation for the Singular Value Decomposition (SVD).

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

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

+1

«Я уже реализацию для сингулярного разложения» http://stackoverflow.com/questions/960060/singular-value-decomposition-svd-in-php – Ben

+0

К сожалению, я добавлена ​​ссылка сейчас. – caw

+0

Что это связано с PHP? – Novelocrat

ответ

7

LSA ссылки:

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

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

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

M: корпус матрицы, W (слов) с помощью D (документов) (ш строк, г столбцов). Это могут быть сырые подсчеты, или tfidf или что угодно. Стоп-слова могут быть или не быть устранены, и может произойти возникновение (Ландауэр говорит, что держит стоп-слова и не имеет значения, но да, чтобы 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 :) 

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

Больше succintly ... (псевдокод)

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

Это вернет звание нового базиса, который был мин (д, ш) до, и мы будем Теперь приблизительная с {II}.

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

Мы создаем новые матрицы: U', Сигма 'V', с размерами ш х II, II х II и II х д.

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

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

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

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

Пометка с помощью LSA (один метод!)

  1. Построить U 'Sigma' V»размерно уменьшенных матрицы с помощью SVD и уменьшение эвристического

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

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

+0

Определенно, это то, о чем я хотел знать. Но у меня все еще есть некоторые вопросы: нужен ли мне V или VT (транспонировать)? Я использую http://stitchpanorama.sourceforge.net/Python/svd.py, который дает вам V. Как вы можете видеть, особые значения не находятся в порядке убывания. Это ваша функция псевдокода в PHP? http://paste.bradleygill.com/index.php?paste_id=10532 Что он делает? – caw

+0

Простой тест на необходимость V или Vt состоит в том, чтобы выяснить, является ли USV = M или USVt = M. Эта функция является эвристическим способом определения степени уменьшения размеров. В этой функции говорится: «Уменьшите базис так, чтобы векторы имели 50% или более от общего числа сингулярных значений». Вы могли бы просто сказать: «держите k наибольший, для некоторой величины k, как 50» .... в основном, определите, сколько там категорий действительно есть, что является целым пунктом LSA. –

+0

Было ли когда-либо решение этой проблемы LSA в PHP. Я понимаю алгоритм, но также пытаюсь реализовать его в PHP. – privateace

0

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

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

НТН

Update:

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

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

+0

Спасибо. Моя основная проблема: как я могу определить, какие слова я должен выбрать? Предполагая, что я всегда хочу иметь 3 тега: что мне делать? – caw

+0

Спасибо. Возможно, я что-то неправильно понял, и LSA не используется для поиска тегов. Но если у меня есть набор тегов, например. «Спорт, политика, мир», то вы, безусловно, можете использовать LSA для поиска наилучшего совпадающего тега, верно? – caw

+0

«Но если у меня есть набор тегов, например« Спорт, политика, мир »,« ... Нет. Это совсем не то, что НУА. Если бы у вас были те теги и кусок статей об этих темах, было бы разумнее использовать байесовский класс. То, что означает LSA, заключается в том, чтобы сказать: «слова: бейсбол, янки, A-Rod имеют тенденцию к совместному происхождению и, вероятно, отражают некоторую базовую структуру, поэтому другие статьи, имеющие бейсбол в них, могут быть связаны с одними и теми же основными темами». LSA - это просто факторный анализ. –

1

Этот ответ не относится непосредственно к вопросу о плакатах, но к метаму вопросу о том, как делать сообщения для автотегов.ОП упоминает Именованное распознавание сущностей, но я считаю, что они означают нечто большее по линии автомата. Если они на самом деле означают ЯЭР, то этот ответ фигня :)

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

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

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

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

Удачи вам!

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

+0

Большое спасибо. Вы правы, я имел в виду автоматы. Но я определенно не хочу вручную помечать статьи (1). Подход 3 слишком прост и дает слишком плохие результаты (уже пробовал это). Но подход 2 звучит хорошо, и об этом и говорит мой вопрос. ;) Я хочу autotag (я не использовал это слово, но другие слова, которые являются неправильными, возможно) новостные статьи с LSA. LDA тоже хорошо звучит, но это метод классификации, а не тегирование, я думаю. – caw

+0

LDA работает также для пометки. Все эти методы - попытки уменьшить размерность (основу) пространства документа. –

0

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

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

+0

Вопрос, который вы связываете (первая ссылка), является одним из моих вопросов. ;) Я связал это в моем вопросе и в верхней части этой страницы. Но этот вопрос касается SVD, здесь речь идет о LSA ... – caw

+0

SVD является частью LSA и в этом обсуждении SO. Посмотрите на ответ Blackkettles. Вы делаете SVD, уменьшаете матрицу собственных значений, а затем рекомбинируете. Прочтите бумагу LSM, у нее есть шаги. Я думаю, вы ставите гораздо больше веры в LSM для решения этого вопроса, чем это действительно оправдано для вашего проекта автомата. –

Смежные вопросы