从gensim LDA模型中提取主题分布

Extracting Topic distribution from gensim LDA model

我在 python 中使用 gensim 包为一些文本文件创建了 LDA 模型。我想获得学习模型的主题分布。 gensim ldamodel class 中是否有任何方法或从模型中获取主题分布的解决方案? 例如,我使用 coherence 模型根据主题数在 1 到 5 之间找到具有最佳 cohrence 值的模型。在获得最佳模型后,我使用 get_document_topics 方法(感谢 kenhbs)获取用于创建模型的文档中的主题分布。

id2word = corpora.Dictionary(doc_terms)

bow = id2word.doc2bow(doc_terms)

max_coherence = -1
best_lda_model = None

for num_topics in range(1, 6):

    lda_model = gensim.models.ldamodel.LdaModel(corpus=bow, num_topics=num_topics)

    coherence_model = gensim.models.CoherenceModel(model=lda_model, texts=doc_terms,dictionary=id2word)

    coherence_value = coherence_model.get_coherence()

    if coherence_value > max_coherence:
        max_coherence = coherence_value
        best_lda_model = lda_model

最好的有 4 个主题

print(best_lda_model.num_topics)

4

但是当我使用 get_document_topics 时,我得到的文档分发值少于 4 个。

topic_ditrs = best_lda_model.get_document_topics(bow)

print(len(topic_ditrs))

3

我的问题是:对于具有 4 个主题(使用连贯性模型)的文档的最佳 LDA 模型,为什么同一文档的 get_document_topics returns 个主题较少?为什么有些主题的分布很小(小于 1-e8)?

the documentation开始,您可以使用两种方法。

如果您的目标是获取特定主题的主要术语,请使用 get_topic_terms:

from gensim.model.ldamodel import LdaModel

K = 10
lda = LdaModel(some_corpus, num_topics=K)

lda.get_topic_terms(5, topn=10)
# Or for all topics
for i in range(K):
    lda.get_topic_terms(i, topn=10)

您还可以打印整个底层 np.ndarray(在标准 LDA 论文中称为 beta 或 phi,尺寸为 (K, V) 或 (V, K))。

phi = lda.get_topics()

编辑: 来自 link 我包含在原始答案中:如果您正在寻找文档的主题分布,请使用

res = lda.get_document_topics(bow)

从文档中可以看出,生成的对象包含以下三个列表:

  • list of (int, float) – Topic distribution for the whole document. Each element in the list is a pair of a topic’s id, and the probability that was assigned to it.

  • list of (int, list of (int, float), optional – Most probable topics per word. Each element in the list is a pair of a word’s id, and a list of topics sorted by their relevance to this word. Only returned if per_word_topics was set to True.

  • list of (int, list of float), optional – Phi relevance values, multipled by the feature length, for each word-topic combination. Each element in the list is a pair of a word’s id and a list of the phi values between this word and each topic. Only returned if per_word_topics was set to True.

现在,

tops, probs = zip(*res[0])

probs 将包含 K(对你来说是 4)个概率。有些可能为零,但它们总和应该为 1

您可以使用 minimum_probability 参数并将其设置为非常小的值,例如 0.000001。

topic_vector = [ x[1] for x in ldamodel.get_document_topics(new_doc_bow , minimum_probability= 0.0, per_word_topics=False)]

只需输入,

pd.DataFrame(lda_model.get_document_topics(doc_term_matrix))