3

我使用以下代码对我的文档进行主题建模:

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
tfidf_vectorizer = TfidfVectorizer(tokenizer=tokenize, max_df=0.85, min_df=3, ngram_range=(1,5))

tfidf = tfidf_vectorizer.fit_transform(docs)
tfidf_feature_names = tfidf_vectorizer.get_feature_names()


from sklearn.decomposition import NMF

no_topics = 50

%time nmf = NMF(n_components=no_topics, random_state=11,  init='nndsvd').fit(tfidf)
topic_pr= nmf.transform(tfidf)

我认为 topic_pr 给了我每个文档不同主题的概率分布。换句话说,我预计输出(topic_pr)中的数字将是第 X 行中的文档属于模型中 50 个主题中的每一个的概率。但是,这些数字加起来不等于 1。这些真的是概率吗?如果不是,有没有办法将它们转换为概率?

谢谢

4

1 回答 1

1

NMF 返回一个非负分解,与概率没有任何关系(据我所知)。如果您只想要概率,您可以转换 NMF 的输出(L1 归一化)

probs = topic_pr / topic_pr.sum(axis=1, keepdims=True)

这假设这topic_pr是一个非负矩阵,这在您的情况下是正确的。


编辑:显然有一个概率版本的 NMF。

引用sklearn 的文档

非负矩阵分解应用于两个不同的目标函数:Frobenius 范数和广义 Kullback-Leibler 散度。后者相当于概率潜在语义索引。

从同一个链接应用后者,这是您似乎需要的:

lda = LatentDirichletAllocation(n_components=no_topics, max_iter=5)
topic_pr = lda.fit_transform(tfidf)
于 2017-10-10T07:22:58.287 回答