web-dev-qa-db-ja.com

Python Gensim:LDAモデルを使用してドキュメントの類似性を計算する方法?

トレーニング済みのLDAモデルがあり、モデルをトレーニングしたコーパスからの2つのドキュメント間の類似性スコアを計算したい。 Gensimのすべてのチュートリアルと機能を勉強した後、私はまだ頭を悩ませることができません。誰か教えてくれませんかありがとう!

25
still_st

これが役立つかどうかはわかりませんが、実際のドキュメントをクエリとして使用することで、ドキュメントの一致と類似性に関する成功した結果を得ることができました。

dictionary = corpora.Dictionary.load('dictionary.dict')
corpus = corpora.MmCorpus("corpus.mm")
lda = models.LdaModel.load("model.lda") #result from running online lda (training)

index = similarities.MatrixSimilarity(lda[corpus])
index.save("simIndex.index")

docname = "docs/the_doc.txt"
doc = open(docname, 'r').read()
vec_bow = dictionary.doc2bow(doc.lower().split())
vec_lda = lda[vec_bow]

sims = index[vec_lda]
sims = sorted(enumerate(sims), key=lambda item: -item[1])
print sims

コーパスにあるすべてのドキュメントとクエリとして使用されたドキュメント間の類似性スコアは、シムのすべてのシムの2番目のインデックスになります。

23
Palisand

使用する類似性メトリックに依存します。

余弦類似度 は普遍的に便利です& ビルトイン

sim = gensim.matutils.cossim(vec_lda1, vec_lda2)

ヘリンジャー距離 は、確率分布(LDAトピックなど)の類似性に役立ちます。

import numpy as np
dense1 = gensim.matutils.sparse2full(lda_vec1, lda.num_topics)
dense2 = gensim.matutils.sparse2full(lda_vec2, lda.num_topics)
sim = np.sqrt(0.5 * ((np.sqrt(dense1) - np.sqrt(dense2))**2).sum())
31
Radim