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

9

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

Вот то, что я думаю, я должен сделать.Is this correct? How can I code it in PHP? How do I determine which words to chose?

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

Extract all words from the given text. Weight the words/phrases, e.g. with tf–idf. If weighting is too complex, just take the number of occurrences. Build up a matrix: The columns are some documents from the database (the more the better?), the rows are all unique words, the values are the numbers of occurrences or the weight. Do the Singular Value Decomposition (SVD). Use the values in the matrix S (SVD) to do the dimension reduction (how?).

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

@Novelocrat: Я хотел бы знать, как именно работает LSA и как его кодировать в PHP. Вот что это имеет отношение к PHP. ;) caw
Извините, я добавил ссылку сейчас. caw
Какое это имеет отношение к PHP? Phil Miller
насколько большой твой корпус? поговорим о размере документов, количестве документов и распространении их. Они на подобные темы? Это просто случайные сообщения в блоге / веб-страницы? Свободный текст? Больше контекста определит, является ли LSA правильным подходом для вас. Gregg Lind
«Я уже реализовал разложение по единственному значению»stackoverflow.com/questions/960060/… Ben

Ваш Ответ

4   ответа
1

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

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

By hand. An analyst could easily do 600 of these per day, probably in a couple of hours. Something like Amazon's Mechanical Turk, or making users do it, might also be feasible. Having some number of "hand-tagged", even if it's only 50 or 100, will be a good basis for comparing whatever the autogenerated methods below get you.

Dimentionality reductions, using LSA, Topic-Models (Latent Dirichlet Allocation), and the like.... I've had really poor luck with LSA on real-world data sets and I'm unsatisfied with its statistical basis. LDA I find much better, and has an incredible mailing list that has the best thinking on how to assign topics to texts.

Simple heuristics... if you have actual news items, then exploit the structure of the news item. Focus on the first sentence, toss out all the common words (stop words) and select the best 3 nouns from the first two sentences. Or heck, take all the nouns in the first sentence, and see where that gets you. If the texts are all in english, then do part of speech analysis on the whole shebang, and see what that gets you. With structured items, like news reports, LSA and other order independent methods (tf-idf) throws out a lot of information.

Удачи!

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded caw
7

Landauer (co-creator) article on LSA the R-project lsa user guide

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

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

your SVD function will give the singular values and singular vectors in descending order. If not, you have to do more acrobatics.

M: матрица корпуса, w (слова) на d (документы) (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 :)

Тогда редукция ... фактическая статья 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}.

(здесь - & gt; премьер, а не транспонировать)

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

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

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

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

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

Tagging using LSA (one method!)

Construct the U' Sigma' V' dimensionally reduced matrices using SVD and a reduction heuristic

By hand, look over the U' matrix, and come up with terms that describe each "topic". For example, if the the biggest parts of that vector were "Bronx, Yankees, Manhattan," then "New York City" might be a good term for it. Keep these in a associative array, or list. This step should be reasonable since the number of vectors will be finite.

Assuming you have a vector (v1) of words for a document, then v1 * t(U') will give the strongest 'topics' for that document. Select the 3 highest, then give their "topics" as computed in the previous step.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstitchpanorama.sourceforge.net/Python/svd.pyError: User Rate Limit Exceededpaste.bradleygill.com/index.php?paste_id=10532Error: User Rate Limit Exceeded caw
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

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

НТН

Обновить:

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded caw
Error: User Rate Limit Exceeded caw
0

натекст ссылки.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded caw

Похожие вопросы