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

、コンセプトにより、テキストクラスタリングと呼ばれるソリューションがあります。検索エンジンはこのテクニカルを使用します

最初のステップで、ドキュメントをいくつかのグループ(たとえば50クラスタ)にクラスタ化し、次に各クラスタに代表的なドキュメントがあります(クラスタに関するいくつかの有用な情報が含まれています)
2番目のステップでは、New Documentとあなたのデータセットとのコサイン類似度を計算するために、すべての代表(50個の数字)をループして最上部の代表者を見つけます(例:2人)
最終ステップでは、最も近いコサイン類似度を見つける

このテクニックを使用すると、ループ数を減らしてパフォーマンスを向上させることができます。 この本のいくつかの章で、より多くのテクニックを読むことができます。http://nlp.stanford.edu/IR-book/html/htmledition/irbook.html

+0

これは、ちょうどヒューリスティックな**であることを述べる価値があります。正しい結果を保証するものではありません(「真の」1回の検索で得られた結果から恣意的に逸脱する可能性があります) – 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ベクトルを計算するのではなく、次のように計算されます。共通の単語の少なくとも1つ(または閾値を指定する)を持つ文書。これは、照会された文書内の単語をループし、逆索引を使用してこの単語も有する文書を見つけ、それらの類似性を計算することによって簡単に行うことができる。

関連する問題