Нужна помощь в скрытой семантической индексации - PullRequest
7 голосов
/ 07 января 2010

Извините, если мой вопрос звучит глупо :) Можете ли вы порекомендовать мне любой псевдокод или хороший алгоритм для реализации LSI в Java? Я не эксперт по математике. Я пытался прочитать некоторые статьи в Википедии и других сайтах о LSI (скрытое семантическое индексирование) они были полны математики. Я знаю, что LSI полон математики. Но если я увижу какой-нибудь исходный код или алгоритм. Я понимаю вещи больше без труда. Вот почему я спросил здесь, потому что здесь так много ГУРУ! Заранее спасибо

Ответы [ 3 ]

13 голосов
/ 14 декабря 2010

Идея АЛП основана на одном предположении: чем больше двух слов встречается в одних и тех же документах, тем больше они похожи . Действительно, можно ожидать, что слова «программирование» и «алгоритм» будут встречаться в одних и тех же документах гораздо чаще, чем, скажем, «программирование» и «разведение собак».

То же самое для документов: чем больше общих / похожих слов в двух документах, тем больше они похожи . Таким образом, вы можете выразить сходство документов по частоте слов и наоборот.

Зная это, мы можем построить матрицу совместного вхождения , где имена столбцов представляют документы, имена строк - слова, а каждый cells[i][j] представляет частоту слова words[i] в документе documents[j]. Частота может быть вычислена многими способами, IIRC, оригинальный LSA использует индекс tf-idf .

Имея такую ​​матрицу, вы можете найти сходство двух документов, сравнив соответствующие столбцы. Как их сравнить? Опять же, есть несколько способов. Наиболее популярным является косинусное расстояние . Из школьной математики вы должны помнить, что матрица может рассматриваться как набор векторов, поэтому каждый столбец - это просто вектор в некотором многомерном пространстве. Вот почему эта модель называется "Модель векторного пространства" . Подробнее о VSM и косинусном расстоянии здесь .

Но у нас есть одна проблема с такой матрицей: она большая. Очень очень большой Работа с ним слишком затратна в вычислительном отношении, поэтому нам нужно как-то уменьшить ее * на 1027 *. LSA использует технику SVD для сохранения наиболее «важных» векторов. После сокращения матрица готова к использованию.

Итак, алгоритм для LSA будет выглядеть примерно так:

  1. Соберите все документы и все уникальные слова из них.
  2. Извлечение информации о частоте и построение матрицы совпадений .
  3. Уменьшить матрицу с SVD.

Если вы собираетесь писать библиотеку LSA самостоятельно, лучше всего начать с поисковой системы Lucene , которая значительно упростит шаги 1 и 2, а также некоторую реализацию многомерных матриц с Возможность SVD, например Parallel Colt или UJMP .

Также обратите внимание на другие техники, которые выросли из LSA, например Random Indexing . RI использует ту же идею и показывает примерно те же результаты, но не использует стадию полной матрицы и является полностью инкрементной, что делает ее намного более эффективной в вычислительном отношении.

1 голос
/ 26 июня 2011

Я знаю, что это слишком поздно :) Но недавно я нашел эту ссылку весьма полезной для понимания принципов. Просто отметьте это, чтобы люди, которые ищут это, могли найти это полезным.

В настоящее время я ищу аналогичное введение в вероятностный скрытый семантический анализ / индексирование. Меньше математики и больше примеров, объясняющих принципы, стоящие за ней. Если кто-нибудь знает такое введение, пожалуйста, дайте мне знать.

1 голос
/ 11 февраля 2010

Это может быть немного поздно, но мне всегда нравился блог Суджита Пала http://sujitpal.blogspot.com/2008/09/ir-math-with-java-tf-idf-and-lsi.html, и я написал немного на своем сайте, если вам интересно.

Процесс гораздо менее сложен, чем его часто пишут. И действительно, все, что вам нужно, это библиотека, которая может выполнять разложение матрицы по одному значению.

Если вам интересно, я могу объяснить несколько коротких битов:

1) вы создаете матрицу / набор данных / и т. Д. С количеством слов различных документов - вашими столбцами будут разные документы, а в строках - отдельные слова.

2) После того, как вы создали матрицу, вы используете библиотеку, такую ​​как Jama (для Java) или SmartMathLibrary (для C #), и выполняете разложение по одному значению. Все, что это делает, это берет вашу исходную матрицу и разбивает ее на три различные части / матрицы, которые по существу представляют ваши документы, ваши слова и вид множителя (сигма), которые называются векторами.

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

Вот несколько довольно понятных ресурсов:

http://puffinwarellc.com/index.php/news-and-articles/articles/30-singular-value-decomposition-tutorial.html

http://lsa.colorado.edu/papers/JASIS.lsi.90.pdf http://www.soe.ucsc.edu/classes/cmps290c/Spring07/proj/Flynn_talk.pdf

Надеюсь, это поможет вам немного.

Эрик

...