Я изучил LSI и тему моделирования почти год назад, поэтому то, что я говорю, должно восприниматься как просто указатель, чтобы дать вам общее представление о том, где искать.
Существует множество способов сделать это с разной степенью успеха. Это сложная проблема в области information retrieval. Вы можете найти topic modeling, чтобы узнать о различных вариантах и состоянии техники.
Вам определенно необходима предварительная обработка и нормализация, если слова могут отображаться в разных формах. Как насчет NLTK и один из его парадигматических:
>>> from nltk.stem.lancaster import LancasterStemmer
>>> st = LancasterStemmer()
>>> st.stem('applied')
'apply'
>>> st.stem('applies')
'apply'
У вас есть лексикон терминов, которые я буду называть термины, а также кучей документов. Я собираюсь изучить очень простой метод ранжирования документов в отношении условий. Есть еще более сложные способы, о которых вы можете прочитать, но я думаю, этого может быть достаточно, если вы не ищете слишком сложного и строгого.
Это называется векторной пространственной ИК-моделью. Условия и документы преобразуются в векторы в k-мерном пространстве. Для этого мы должны построить матрицу с пометкой. Это представляет собой матрицу образца, в которой числа представляют частоты терминов в документах:

До сих пор мы имеем матрицу 3х4 с помощью которой каждый документ может быть выражен с помощью 3-мерного массива (каждая колонка) , Но по мере увеличения количества терминов эти массивы становятся слишком большими и все более скудными. Кроме того, есть много слов, таких как I
или and
, которые встречаются в большинстве документов без добавления большого семантического контента. Поэтому вы можете игнорировать эти типы слов. Для проблемы крупности и разреженности вы можете использовать математическую технику под названием SVD, которая масштабирует матрицу, сохраняя большую часть содержащейся в ней информации.
Кроме того, цифры, которые мы использовали на приведенной выше диаграмме, были необработанными. Другим методом будет использование булевых значений: 1 для наличия и 0 нуля из-за отсутствия в документе термина. Но они предполагают, что слова имеют равные семантические веса. На самом деле более редкие слова имеют больше вес, чем обычные. Таким образом, хорошим способом редактирования исходной матрицы было бы использовать функции ранжирования, такие как tf-id, для назначения относительных весов каждому члену.Если к настоящему времени мы применили SVD к нашей взвешенной матрице по-документам, мы можем построить k-мерные векторы запросов, которые являются просто массивом термов. Если бы наш запрос содержал несколько экземпляров одного и того же термина, использовался бы продукт частоты и веса термина.
Что нам нужно сделать оттуда несколько прямолинейно. Мы сравниваем векторы запросов с векторами документов, анализируя их cosine similarities, и это будет основой для ранжирования документов по отношению к запросам.
Возможно, вы захотите выполнить поиск по термину «lemmatizing» - объединение нескольких форм слова под одним заголовком (лемма или корень). Если вы сканируете тег [машинное обучение] (http://stackoverflow.com/questions/tagged/machine-learning), вы найдете множество ссылок на инструменты: MLlib, SciKit Learn, SCLearn и т. Д. один в открытом исходном коде - платформа Trusted Analytics (я нахожусь в команде разработчиков программного обеспечения). – Prune