Gensim LDA文档-主题矩阵列与概率不匹配问题求解
解决Gensim LDA文档-主题矩阵列与主题不匹配的问题
问题原因
model.get_document_topics(corpus)默认返回的是按概率从高到低排序的(主题ID, 概率)元组列表,且仅返回概率大于默认阈值(0.01)的主题。直接将其转为DataFrame时,列表顺序和你定义的主题ID列顺序不对应,导致概率值错位。
解决方法
以下两种方式均可生成列与主题ID严格对应的文档-主题矩阵:
方法1:通过参数强制按主题ID返回全量概率
利用get_document_topics的两个参数控制返回格式:
minimum_probability=0.0:强制返回所有主题的概率(包括概率为0的主题)ordered=False:让返回的主题按主题ID升序排列,而非默认的概率降序
代码示例:
import pandas as pd # 获取按主题ID排序的全主题概率列表 doc_topics = model.get_document_topics( corpus, minimum_probability=0.0, ordered=False ) # 提取每个文档的概率值(剔除主题ID) doc_probs = [[prob for _, prob in doc] for doc in doc_topics] # 生成文档-主题矩阵 DocTopMat = pd.DataFrame(doc_probs, columns=[i for i in range(model.num_topics)])
方法2:手动补全每个文档的主题概率
如果需要自定义阈值或更灵活的处理逻辑,可以手动遍历整理每个文档的主题概率:
代码示例:
import pandas as pd num_topics = model.num_topics doc_topic_list = [] for doc_topics in model.get_document_topics(corpus): # 将当前文档的主题-概率转为字典 topic_prob_dict = dict(doc_topics) # 按主题ID顺序提取概率,缺失主题补0 current_probs = [topic_prob_dict.get(topic_id, 0.0) for topic_id in range(num_topics)] doc_topic_list.append(current_probs) # 生成DataFrame DocTopMat = pd.DataFrame(doc_topic_list, columns=[i for i in range(num_topics)])
验证方式
生成矩阵后,可随机抽查某一行,对比model.get_document_topics(corpus)[n]的结果与DocTopMat.iloc[n]的对应主题概率,确认列与主题ID完全匹配。
内容的提问来源于stack exchange,提问作者user13762350
相关产品推荐
相关产品推荐

