← 返回教程目录
第 4 章 · 第 3 节 LDA 主题分析

可视化:气泡图 / 主题词云

Visualize: Bubble Chart & Topic Wordclouds

LDA 跑出来的主题是"静态"的 — 只告诉你这个语料库在讲什么。老板们更想知道的是:主题怎么分布、哪些主题火、每个主题具体讲啥。这一节全部搞定。

1. 主题-词分布表(必看)

import pandas as pd





rows = []


for tid in range(lda.num_topics):


    for word, prob in lda.show_topic(tid, topn=15):


        rows.append({'主题': f'T{tid}', '词': word, '概率': f'{prob:.4f}'})





pd.DataFrame(rows).to_excel('topic_words.xlsx', index=False)


print('已导出 topic_words.xlsx')

2. 主题-文档分布:每条评论属于哪个主题

def get_dominant_topic(lda, bow):


    topics = lda.get_document_topics(bow, minimum_probability=0)


    return max(topics, key=lambda x: x[1])[0]





df['topic'] = df['tokens'].apply(


    lambda t: get_dominant_topic(lda, dictionary.doc2bow(t))


)


df.to_csv('comments_with_topic.csv', index=False)





print(df['topic'].value_counts().sort_index())


# T0    12345


# T1    11290


# T2    9876

3. 主题气泡图(pyLDAvis)

import pyLDAvis


import pyLDAvis.gensim_models





vis = pyLDAvis.gensim_models.prepare(lda, corpus, dictionary)


pyLDAvis.save_html(vis, 'lda_bubble.html')


# 在浏览器打开 lda_bubble.html 看交互式气泡图
气泡图怎么看:
• 气泡大小 = 主题在语料中的占比
• 气泡距离 = 主题之间的相似度(近=相似)
• 鼠标悬停看主题 Top 30 词 + 频率
• 右侧滑块调 λ:λ 小看"主题专属词",λ 大看"高频词"

4. 每个主题画一个词云

from wordcloud import WordCloud


import matplotlib.pyplot as plt





fig, axes = plt.subplots(2, 5, figsize=(20, 8))  # 10 个主题


axes = axes.flatten()





for i in range(10):


    topic_words = dict(lda.show_topic(i, topn=30))


    wc = WordCloud(


        width=400, height=300,


        font_path='/System/Library/Fonts/PingFang.ttc',


        background_color='white',


    ).generate_from_frequencies(topic_words)


    axes[i].imshow(wc, interpolation='bilinear')


    axes[i].set_title(f'主题 {i}', fontsize=12)


    axes[i].axis('off')





plt.tight_layout()


plt.savefig('topic_wordclouds.png', dpi=150, bbox_inches='tight')

5. 主题强度随时间变化(进阶)

import pandas as pd


import matplotlib.pyplot as plt





df = pd.read_csv('comments_with_topic.csv')


df['date'] = pd.to_datetime(df['date'])





# 按月统计每个主题的占比


monthly = df.groupby([df['date'].dt.to_period('M'), 'topic']).size().unstack(fill_value=0)


monthly_pct = monthly.div(monthly.sum(axis=1), axis=0)





fig, ax = plt.subplots(figsize=(14, 6))


monthly_pct.plot.area(ax=ax, alpha=0.7, colormap='tab20')


ax.set_title('主题占比随时间变化')


ax.set_xlabel('月份')


ax.set_ylabel('占比')


ax.legend(title='主题', bbox_to_anchor=(1.02, 1))


plt.tight_layout()


plt.savefig('topic_evolution.png', dpi=150)
实战洞察:电商评论里"物流"主题春节前一定暴涨,"健康"主题疫情期一定暴涨 — 一眼看出"什么火什么冷"。
我们的 LDA 主题分析软件把这 5 张图全包了,5 万条评论 1 键出图。

小结:10 章 30 节核心要点

学完这套教程,你已经能独立完成一个完整的文本分析项目。想偷懒?用我们的淘宝软件,导入数据一键出图。

想直接出可交互的 pyLDAvis?LDA 软件内置气泡图 + 主题词云一键导出

配套软件内置案例数据 + 模板,导入即出图,无需写代码

查看淘宝软件 →