如何使用scikit-learn LDA获取各文档的主题概率
获取scikit-learn LDA模型中文档的主题概率
嘿,这事儿我熟!当你用scikit-learn的LDA训练好模型、拿到了主题-词项分布之后,要获取每个文档对应的各主题概率其实超级简单,核心就是用模型的两个关键方法,我给你拆解一下具体步骤:
1. 训练模型时直接获取文档-主题概率
如果你是刚训练模型,直接用fit_transform()代替fit(),这个方法会在训练模型的同时,返回文档-主题概率矩阵:
from sklearn.decomposition import LatentDirichletAllocation from sklearn.feature_extraction.text import CountVectorizer # 假设你已经有预处理好的文本数据集texts # 先构建文档-词项矩阵(LDA通常用CountVectorizer,而非TF-IDF) vectorizer = CountVectorizer(max_features=1000, stop_words='english') doc_term_matrix = vectorizer.fit_transform(texts) # 初始化并训练LDA模型,同时获取文档主题概率 lda_model = LatentDirichletAllocation(n_components=5, random_state=42) doc_topic_probs = lda_model.fit_transform(doc_term_matrix)
这个doc_topic_probs就是你要的结果:
- 它是一个二维数组,形状为
(文档数量, 主题数量) - 第
i行第j列的数值,代表第i个文档属于第j个主题的概率 - 每行的概率加起来总和为1,符合概率分布的特性
2. 已训练好模型?用transform()获取概率
如果你已经用lda_model.fit(doc_term_matrix)完成了训练,之后想要对原有文档或者新文档获取主题概率,直接调用transform()方法就行:
# 对原有文档获取主题概率 existing_doc_probs = lda_model.transform(doc_term_matrix) # 对新文档获取主题概率(注意:必须用训练时的同一个vectorizer做转换!) new_texts = ["这是一篇新的测试文档", "另一篇待分析的文本"] new_doc_term_matrix = vectorizer.transform(new_texts) new_doc_probs = lda_model.transform(new_doc_term_matrix)
⚠️ 重要提醒:处理新文档时,一定要用训练阶段拟合好的vectorizer调用transform(),绝对不能重新fit(),否则词汇表会不一致,导致结果完全错误!
3. 查看具体文档的主题概率
拿到概率矩阵后,你可以轻松查看单个文档的主题分布,甚至找到它的主导主题(概率最高的主题):
# 查看第1个文档的所有主题概率(注意Python是0索引) print("第1个文档的主题概率分布:", doc_topic_probs[0]) # 找到该文档的主导主题 dominant_topic_index = doc_topic_probs[0].argmax() print(f"第1个文档的主导主题是:第{dominant_topic_index+1}个主题")
内容的提问来源于stack exchange,提问作者Adham Enaya
相关产品推荐
相关产品推荐

