web-dev-qa-db-ja.com

gensim LDAを使用してドキュメントの完全なトピック配布を取得するにはどうすればよいですか?

Ldaモデルをそのようにトレーニングするとき

dictionary = corpora.Dictionary(data)
corpus = [dictionary.doc2bow(doc) for doc in data]
num_cores = multiprocessing.cpu_count()
num_topics = 50
lda = LdaMulticore(corpus, num_topics=num_topics, id2Word=dictionary, 
workers=num_cores, alpha=1e-5, eta=5e-1)

すべてのドキュメントのすべてのnum_topicsの完全なトピック分布を取得したいと思います。つまり、この特定のケースでは、各ドキュメントに配布に寄与する50のトピックおよび50のトピックすべての投稿にアクセスできるようにしたい。この出力は、LDAの数学に厳密に準拠している場合にLDAが実行する必要があることです。ただし、gensimは、示されているように特定のしきい値を超えるトピックのみを出力しますここ。たとえば、私がしようとすると

lda[corpus[89]]
>>> [(2, 0.38951721864890398), (9, 0.15438596408262636), (37, 0.45607443684895665)]

これは、ドキュメント89に最も貢献する3つのトピックのみを示しています。上記のリンクで解決策を試しましたが、これはうまくいきません。私はまだ同じ出力を取得します:

theta, _ = lda.inference(corpus)
theta /= theta.sum(axis=1)[:, None]

同じ出力を生成します。つまり、ドキュメントごとに2,3トピックのみを生成します。

私の質問は、このしきい値を変更して、[〜#〜] full [〜#〜]eachドキュメントのトピック配布?ドキュメントへのトピックの貢献がどれほど重要でない場合でも、完全なトピック配布にアクセスするにはどうすればよいですか?完全な配布が必要な理由は、ドキュメントの配布間で KL類似性 検索を実行できるようにするためです。

前もって感謝します

10
PyRsquared

まだ誰も返信していないようですので、gensim documentation を与えられる限り、これに答えようと思います。

パラメータを設定する必要があるようですminimum_probabilityから0.0まで、モデルをトレーニングして目的の結果を取得します。

lda = LdaMulticore(corpus=corpus, num_topics=num_topics, id2Word=dictionary, workers=num_cores, alpha=1e-5, eta=5e-1,
              minimum_probability=0.0)

lda[corpus[233]]
>>> [(0, 5.8821799358842424e-07),
 (1, 5.8821799358842424e-07),
 (2, 5.8821799358842424e-07),
 (3, 5.8821799358842424e-07),
 (4, 5.8821799358842424e-07),
 (5, 5.8821799358842424e-07),
 (6, 5.8821799358842424e-07),
 (7, 5.8821799358842424e-07),
 (8, 5.8821799358842424e-07),
 (9, 5.8821799358842424e-07),
 (10, 5.8821799358842424e-07),
 (11, 5.8821799358842424e-07),
 (12, 5.8821799358842424e-07),
 (13, 5.8821799358842424e-07),
 (14, 5.8821799358842424e-07),
 (15, 5.8821799358842424e-07),
 (16, 5.8821799358842424e-07),
 (17, 5.8821799358842424e-07),
 (18, 5.8821799358842424e-07),
 (19, 5.8821799358842424e-07),
 (20, 5.8821799358842424e-07),
 (21, 5.8821799358842424e-07),
 (22, 5.8821799358842424e-07),
 (23, 5.8821799358842424e-07),
 (24, 5.8821799358842424e-07),
 (25, 5.8821799358842424e-07),
 (26, 5.8821799358842424e-07),
 (27, 0.99997117731831464),
 (28, 5.8821799358842424e-07),
 (29, 5.8821799358842424e-07),
 (30, 5.8821799358842424e-07),
 (31, 5.8821799358842424e-07),
 (32, 5.8821799358842424e-07),
 (33, 5.8821799358842424e-07),
 (34, 5.8821799358842424e-07),
 (35, 5.8821799358842424e-07),
 (36, 5.8821799358842424e-07),
 (37, 5.8821799358842424e-07),
 (38, 5.8821799358842424e-07),
 (39, 5.8821799358842424e-07),
 (40, 5.8821799358842424e-07),
 (41, 5.8821799358842424e-07),
 (42, 5.8821799358842424e-07),
 (43, 5.8821799358842424e-07),
 (44, 5.8821799358842424e-07),
 (45, 5.8821799358842424e-07),
 (46, 5.8821799358842424e-07),
 (47, 5.8821799358842424e-07),
 (48, 5.8821799358842424e-07),
 (49, 5.8821799358842424e-07)]
7
PyRsquared

それが他の誰かを助けるかもしれない場合:

LDAモデルをトレーニングした後、低いしきい値で制限せずにドキュメントのすべてのトピックを取得する場合は、get_document_topicsメソッドを呼び出すときにminimum_probabilityを0に設定する必要があります。

ldaModel.get_document_topics(bagOfWordOfADocument, minimum_probability=0.0)
2
Memin