如何从主题建模中制作主题百分比条形图?
Posted
技术标签:
【中文标题】如何从主题建模中制作主题百分比条形图?【英文标题】:How to make percentage bar chart of topics from topic modeling? 【发布时间】:2019-11-21 12:55:02 【问题描述】:我已经为此绞尽脑汁一个星期了。
我想要
-
运行 NMF 主题建模
通过查看权重的最大值为每个文档分配一个主题,
使用 matplot 将此分布绘制为百分比条形图。 (即:X 轴上的主题,以及 y 轴上属于该主题的 % 文档。)
这是一些玩具数据并完成第 1 步和第 2 步:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF
import pandas as pd
# Get data
data =
"Documents": ["I am a document",
"And me too",
"The cat is big",
"The dog is big"
"My headphones are large",
"My monitor has rabies",
"My headphones are loud"
"The street is loud "]
df = pd.DataFrame(data)
# Fit a TFIDF vectorizer
tfidf_vectorizer = TfidfVectorizer()
tfidf = tfidf_vectorizer.fit_transform(df['Documents'])
# Run NMF
nmf_model = NMF(n_components=4, random_state=1).fit(tfidf)
# Weights
W = nmf_model.transform(tfidf)
# Topics
H= nmf_model.components_
现在我可以将文档分配给主题:
# Will return document topics as list like [1, 4, 1...] to
# represent that the first document is topic 1, the second 4, and so on.
topics = pd.DataFrame(W).idxmax(axis=1, skipna=True).tolist()
好吧,现在我应该能够通过这两个结构得到我想要的,但我不知所措。
【问题讨论】:
【参考方案1】:IIUC,你要画一个条形字符,所以不要把主题改成列表:
topics = pd.DataFrame(W).idxmax(axis=1, skipna=True)
plt.bar(x=topics.index, height=topics.mul(100)/topics.sum())
plt.show()
给予:
【讨论】:
是的,无论如何都可以让它看起来不奇怪(即:额外的 xaticks) 那些额外的xticks
对应于那些零计数的主题。您可以通过tmp = topics[topics.ne(0)]
删除它们并将bar
中的所有topics
替换为tmp
。【参考方案2】:
看起来像是 Counter() 的一个用例。 我会写这样的:
from collections import Counter
mylist = [1,1,1,1,2,2,3,1,1,2,3,1,1,1]
mycount = Counter(mylist)
for key,value in mycount.items():
print(key,value)
这会以以下结构输出您的主题:
1 9
2 3
3 2
对于潜在狄利克雷/非负矩阵要注意的一点是,整个点是一个句子,由多个主题组成。最大化权重以将每个主题分配给单个主题可能会破坏目的。您可能还需要考虑如何处理无意义的句子,因为您的算法会自动将它们分配给当前的主题。
【讨论】:
以上是关于如何从主题建模中制作主题百分比条形图?的主要内容,如果未能解决你的问题,请参考以下文章