Pandas:LDA Top n 关键字和权重主题

Pandas: LDA Top n keywords and topics with weights

我正在使用 LDA 执行主题建模任务,我得到 10 个组件,每个组件有 15 个热门词:

for index, topic in enumerate(lda.components_):
    print(f'Top 10 words for Topic #{index}')
    print([vectorizer.get_feature_names()[i] for i in topic.argsort()[-10:]])
    print('\n')

打印:

Top 10 words for Topic #0
['compile', 'describes', 'info', 'extent', 'changing', 'reader', 'reservation', 'countries', 'printed', 'clear', 'line', 'passwords', 'situation', 'tables', 'downloads']

现在我想创建一个 pandas 数据框来显示每个主题(索引)和所有关键字(行)并查看它们的权重。 我希望主题中不存在的关键字的权重为 0,但我无法让它发挥作用。到目前为止我有这个,但它打印了所有功能名称(大约 1700)。如何设置每个主题只显示前 10 名?

topicnames = ['Topic' + str(i) for i in range(lda.n_components)]
# Topic-Keyword Matrix
df_topic_keywords = pd.DataFrame(lda_model.components_)
# Assign Column and Index
df_topic_keywords.columns = vectorizer.get_feature_names()
df_topic_keywords.index = topicnames
# View
df_topic_keywords.head()

如果我没理解错的话,你有一个包含所有值的数据框,你想保留每一行的前 10 个值,其余值都为 0。

这里我们 transform 每行由:

  • 获得第 10 个最高值
  • 重新索引到行的原始索引(因此数据框的列)并填充 0:
>>> df.transform(lambda s: s.nlargest(10).reindex(s.index, fill_value=0), axis='columns')
    a  b   c   d   e  f   g   h   i   j   k  l   m   n   o   p  q   r  s   t   u   v  w  x  y
a   0  0  63  98   0  0  73   0  78   0  94  0   0  63  68  98  0   0  0  67   0  77  0  0  0
z  76  0   0   0  84  0  62  61   0  93   0  0  82  70   0   0  0  91  0   0  48  95  0  0  0