4

Вдохновленный this Ответ: Я пытаюсь найти сходство с косинусом между обученным инструктором tf-idf и новым документом и вернуть похожие документы.Python - tf-idf Предложить новый документ сходство

ниже код находит косинус подобие первого вектора, а не нового запрос

>>> from sklearn.metrics.pairwise import linear_kernel 
>>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten() 
>>> cosine_similarities 
array([ 1.  , 0.04405952, 0.11016969, ..., 0.04433602, 
    0.04457106, 0.03293218]) 

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

>>> related_docs_indices = cosine_similarities.argsort()[:-5:-1] 
>>> related_docs_indices 
array([ 0, 958, 10576, 3277]) 
>>> cosine_similarities[related_docs_indices] 
array([ 1.  , 0.54967926, 0.32902194, 0.2825788 ]) 
+0

, хотя могут быть лучшие решения, линейный поиск не обязательно плохая идея и может быть быстрым, если он выполняется правильно, насколько огромный ваш набор данных? какой уровень запросов был бы восприимчивым? – elyase

ответ

0

Для огромных массивов данных, есть решение под названием Text Кластеризация По концепции. поисковые системы используют этот Technic,

На первом шаге кластер документов для отдельных групп (например, 50 кластера), то каждый кластер имеет представительный документ (который содержит несколько слов, которые имеют некоторую полезную информацию о его кластер)
На втором этапе, для вычисления сходства косинусов между New Document и вашим набором данных, вы просматриваете все репрезентативные (50 номеров) и находите верхние близкие представители (например, 2 представителя)
На последнем этапе вы можете просмотреть все документы в выбранном представителе и найти ближайшее подобие косинуса

С помощью этого Technic вы можете уменьшить количество циклов и улучшить производительность, В некоторых главах этой книги вы можете прочитать больше статей tecnincs: http://nlp.stanford.edu/IR-book/html/htmledition/irbook.html

+0

стоит сказать, что это ** просто эвристический **, который не гарантирует правильного результата (может отклоняться произвольно от результатов, заданных «истинным» поиском по одному) – lejlot

1

Вы должны взглянуть на gensim. Пример запуск кода выглядит следующим образом:

from gensim import corpora, models, similarities 

dictionary = corpora.Dictionary(line.lower().split() for line in open('corpus.txt')) 
corpus = [dictionary.doc2bow(line.lower().split()) for line in open('corpus.txt')] 

tfidf = models.TfidfModel(corpus) 
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=12) 

Во время предсказания сначала получить вектор для нового дока:

doc = "Human computer interaction" 
vec_bow = dictionary.doc2bow(doc.lower().split()) 
vec_tfidf = tfidf[vec_bow] 

Тогда получает сходство (отсортированный по наиболее похожи):

sims = index[vec_tfidf] # perform a similarity query against the corpus 
print(list(enumerate(sims))) # print (document_number, document_similarity) 2-tuples 

Это делает линейное сканирование, как вы хотели, но у них есть более оптимизированная реализация. Если скорости недостаточно, вы можете посмотреть приблизительный поиск сходства (Annoy, Falconn, NMSLIB).

+1

Спасибо за ваш ответ, у меня будет взгляд и сообщение назад –

2

Эта проблема может быть частично рассмотрены путем объединения пространства модели вектор (который является TF-IDF & косинусного подобия) вместе с булевой модели. Это концепции теории информации, и они используются (и хорошо объяснены) в ElasticSearch - довольно хорошая поисковая система.

Идея проста: вы храните свои документы в виде инвертированных индексов. Это сопоставимо со словами, содержащимися в конце книги, в которых содержится ссылка на страницы (документы), на которые они были упомянуты.

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