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

时间:2018-08-29 12:04:58

标签: gensim lda topic-modeling

我使用python中的gensim包为某些文本文件创建了LDA模型。我想获取学习模型的主题分布。 gensim ldamodel类中是否有任何方法或从模型中获取主题分布的解决方案? 例如,我使用一致性模型来找到一个具有最高相关度值的模型,该模型取决于主题数在1到5之间。获得最佳模型后,我使用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返回的主题更少?为什么有些主题的分布很小(小于1-e8)?

3 个答案:

答案 0 :(得分:1)

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()

修改: 通过原始答案中包含的链接:如果您正在寻找文档的主题分布,请使用

res = lda.get_document_topics(bow)

可以从文档中读取,结果对象包含以下三个列表:

  
      
  • (int,float)的列表–整个文档的主题分布。列表中的每个元素都是一对主题ID,以及分配给它的概率。

  •   
  • (int,(int,float)列表,可选)–每个单词最可能出现的主题。列表中的每个元素都是一个单词的ID对,以及按与主题的相关性排序的主题列表此单词。仅在per_word_topics设置为True时返回。

  •   
  • (int,浮点列表)列表,可选–每个单词-主题组合的Phi相关性值乘以特征长度。列表中的每个元素都是一个单词的ID对以及该单词和每个主题之间的phi值列表。仅在per_word_topics设置为True时返回。

  •   

现在,

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

probs将包含K个(为您提供4个)概率。有些可能为零,但总和应为1

答案 1 :(得分: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)]

答案 2 :(得分:0)

只是类型

pd.DataFrame(lda_model.get_document_topics(doc_term_matrix))