Gensim LdaModel文档主题概率分布推理及全量概率矩阵实现咨询
关于文档主题分布输出的疑问解答
- 你截取的
model[common_corpus[0]][0]确实是对应文档的归一化主题概率分布。由于你开启了per_word_topics=True的配置,model[单文档]会返回三元组结构:- 第一个元素:文档维度的主题概率分布(也就是你截取的部分)
- 第二个元素:文档中每个词对应的关联主题列表
- 第三个元素:文档中每个词对应关联主题的概率值
- 输出列表中未列出的主题概率不为0:Gensim的LdaModel默认设置了
minimum_probability=0.01的过滤规则,所有低于这个阈值的概率会被自动剔除,不会出现在稀疏形式的返回列表里。如果需要查看某篇文档的完整概率分布,可以手动调用model[common_corpus[0], minimum_probability=0.0],就会返回全部10个主题的完整概率值。
高效生成全量文档-主题矩阵的实现方式
不需要手动循环单文档拼接结果,Gensim提供了原生的批量处理接口,对4000条规模的语料处理效率远高于手动遍历,具体步骤如下:
- 导入需要的工具库
from gensim.matutils import corpus2dense
- 批量获取全语料的主题分布,按需设置过滤规则:
- 如果需要生成包含全部10个主题的完整向量(不做低概率过滤):
# 关闭最小概率过滤,生成全量文档的稀疏主题分布迭代器 batch_dist = model[common_corpus, minimum_probability=0.0] - 如果仅需要保留概率大于0.01的主题,其余位置自动补0:
batch_dist = model[common_corpus]
- 如果需要生成包含全部10个主题的完整向量(不做低概率过滤):
- 将稀疏格式的批量分布转换为目标稠密矩阵:
# corpus2dense默认输出为「主题行 × 文档列」,转置后即为需要的「文档行 × 主题列」结构 doc_topic_matrix = corpus2dense( batch_dist, num_terms=model.num_topics, num_docs=len(common_corpus) ).T
注意:如果训练模型时传入的
id2word不是当前新建的common_dictionary,需要保证两者的词-索引映射完全一致,否则生成的corpus和模型训练时的词索引不匹配,得到的主题分布会完全错误。
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

