我使用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)?
答案 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))