查看全课大纲(第 37 / 45 节)

词云图

词云图:文本数据的视觉摘要

小象实战讲义 · ECharts 数据可视化

在数据分析中,我们常常会遇到非结构化的文本数据,例如用户评论、新闻文章、产品标签等。如何快速、直观地洞察这些文本中的核心主题和关键词?词云图提供了一种高效的视觉解决方案。本节我们将学习如何使用 pyecharts 创建词云图,将文本数据转化为直观的视觉摘要,并通过字体大小和颜色来体现关键词的重要性。

💡 核心导读

  • 理解词云图:词云图是一种文本数据的视觉表示,通过词汇组成的彩色图形展示大量文本中的关键词及其重要性。
  • 核心原理:关键词的重要性通常由其出现的频率体现,并通过字体大小或颜色进行视觉映射。
  • 数据处理:对于原始文本,创建词云图前通常需要经过分词、去除停用词等自然语言处理(NLP)步骤。
  • 配置要点:在 pyecharts 中,词云图的关键配置包括数据格式、字体大小范围以及自定义形状等。
  • 应用场景:常用于网站标签统计、舆情分析、报告摘要等场景,快速呈现文本焦点。

什么是词云图?

词云图,也称为文字云,是一种文本数据的视觉表示形式。它由一系列词汇组成,这些词汇被排列成类似云朵的彩色图形,用于直观地展示大量文本数据中的关键信息。

其核心在于通过视觉属性(主要是字体大小,其次是颜色)来编码每个词汇的“重要性”。在大多数应用场景下,词汇的重要性由其在该段文本中出现的频率决定:出现次数越多,词汇越重要,在词云图中显示的字体就越大、越醒目。

一个典型的应用场景是分析网站文章的标签。假设一个博客平台有成千上万篇文章,每篇文章都被打上了若干标签(如“Python”、“数据分析”、“可视化”)。通过统计所有标签的出现次数并生成词云图,我们可以一目了然地看出哪些主题是平台上的热门讨论焦点。

然而,直接将原始文本中的词汇出现次数等同于“重要性”有时会产生误导。例如,在一篇中文文章中,“的”、“了”、“是”等虚词(停用词)会高频出现,但它们对理解文章主题并无实质贡献。因此,在从原始文本生成词云图之前,往往需要先进行文本预处理。

从文本到词云:数据处理流程

如果我们的起点是一篇完整的文章或一段评论,而非已经统计好的关键词频率数据,那么生成词云图通常需要经过以下步骤,这涉及到自然语言处理(NLP)的基础知识:

  1. 分词:这是中文处理特有的关键步骤。与英文单词天然由空格分隔不同,中文句子是连续的字符流。分词就是将连续的汉字序列,按照一定的规范,重新组合成有意义的词语序列的过程。例如,“文本数据的视觉表示” 需要被分割为 [“文本”, “数据”, “的”, “视觉”, “表示”]。这个过程通常借助分词工具(如 jieba)完成。
  2. 去除停用词:停用词是指在各种文本中都非常常见,但对文本内容贡献极小的词汇,如中文的“的”、“了”、“在”,英文的“the”, “a”, “is”。去除它们可以避免这些词在词云图中占据显眼位置,从而让真正有意义的关键词凸显出来。
  3. 词频统计:对处理后的词语列表进行计数,得到每个词语及其出现次数的映射关系。

经过以上步骤,我们就得到了一个结构化的数据:{“关键词1”: 出现次数1, “关键词2”: 出现次数2, …},这正是绘制词云图所需的基础。

使用 pyecharts 绘制词云图

在 pyecharts 中,词云图由 WordCloud 类实现。其数据格式要求是一个列表,列表中的每个元素是一个元组 (word, value),其中 word 是关键词字符串,value 是一个数值,代表该词的重要性(如出现次数)。

下面我们使用一组模拟的“热点分析”数据来创建一个基础的词云图。这组数据模拟了不同民生话题的关注度(数值)。

from pyecharts.charts import WordCloud
from pyecharts import options as opts

# 准备数据:列表内为 (关键词, 重要性数值) 元组
data = [
    ("生活资源", 999),
    ("供热管理", 888),
    ("供气质量", 777),
    ("生活用水管理", 688),
    ("一次供水问题", 588),
    ("交通运输", 516),
    ("职业教育", 21),  # 这是一个重要性较低的例子
    ("市场外溢", 11),  # 这是另一个重要性较低的例子
]

# 创建词云图
wordcloud = (
    WordCloud()
    .add(
        series_name="热点分析",  # 系列名称
        data_pair=data,         # 数据
        word_size_range=[6, 66] # 词汇字体大小范围 [最小值, 最大值]
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="民生热点分析词云图"),
        tooltip_opts=opts.TooltipOpts(is_show=True), # 启用提示框
    )
)

# 生成HTML文件(本地查看)
wordcloud.render("basic_wordcloud.html")

# 打印图表类型和基础信息摘要
print(f"图表类型: {type(wordcloud).__name__}")
print(f"数据条目数: {len(data)}")
print(f"关键词示例(前3个): {[item[0] for item in data[:3]]}")
print(f"数值范围: {min([item[1] for item in data])} - {max([item[1] for item in data])}")
图表类型: WordCloud
数据条目数: 8
关键词示例(前3个): ['生活资源', '供热管理', '供气质量']
数值范围: 11 - 999
民生热点词云图,不同大小的词语按权重排列
图:民生热点词云图:字号表示词频,颜色区分主题,一眼看出讨论重心落在哪些词上。手机端可左右滑动查看,点击图片可看全图。

运行以上代码会生成一个 HTML 文件。在生成的词云图中,“生活资源”(数值999)将以最大的字体(66px)显示,而“市场外溢”(数值11)将以最小的字体(6px)显示。将鼠标悬停在任意词汇上,提示框会显示该词汇及其具体的数值。

关键配置解析:word_size_range word_size_range=[6, 66] 这个参数至关重要。它定义了词云中字体大小的映射范围。pyecharts 会自动将数据中的最小 value 映射到字体大小的最小值(6px),将最大 value 映射到最大值(66px),中间值则按比例线性映射。通过调整这个范围,你可以控制词云视觉对比的强弱。例如,设置为 [12, 24] 会让所有词汇的大小差异看起来不那么明显。

词云图的高级配置

除了基础的大小映射,pyecharts 的词云图还支持多种自定义配置,以满足不同的视觉设计需求。

  • 形状与遮罩:词云可以填充在指定的几何形状(如圆形、矩形)甚至自定义的图片轮廓内。这需要通过 shape 参数或 mask_image 参数来实现。
  • 视觉样式:可以调整词汇的旋转步长(rotate_step)、词汇之间的间隔(word_gap)、以及文字的样式(颜色、阴影等)。
  • 颜色映射:词汇的颜色可以通过 visualmap 配置项与数值进行关联,或者通过 textstyle_opts 设置统一的颜色。

下面的示例展示了如何调整词汇的旋转角度和间隔,并添加一个简单的视觉映射(颜色根据数值变化)。

from pyecharts.charts import WordCloud
from pyecharts import options as opts

data = [
    ("生活资源", 999),
    ("供热管理", 888),
    ("供气质量", 777),
    ("生活用水管理", 688),
    ("一次供水问题", 588),
    ("交通运输", 516),
    ("职业教育", 21),
    ("市场外溢", 11),
]

# 高级配置示例:调整旋转、间隔和颜色
advanced_wordcloud = (
    WordCloud()
    .add(
        series_name="热点分析",
        data_pair=data,
        word_size_range=[15, 80],
        shape="circle",               # 词云轮廓形状,可选 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star'
        rotate_step=45,               # 词汇旋转步长,此处为45度,意味着词汇可能旋转0, 45, 90度等
        word_gap=10,                  # 词汇间隔,值越大,词与词之间越疏朗
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="高级配置词云图"),
        tooltip_opts=opts.TooltipOpts(is_show=True),
        # 添加视觉映射组件,将数值映射到颜色
        visualmap_opts=opts.VisualMapOpts(
            is_show=False,  # 不显示视觉映射的控制器条
            min_=min([d[1] for d in data]),
            max_=max([d[1] for d in data]),
            range_color=["#d7e3fc", "#3a5dc9"], # 颜色范围,从浅蓝到深蓝
        )
    )
)

advanced_wordcloud.render("advanced_wordcloud.html")
print("高级词云图配置完成。")
print("形状: circle")
print("旋转步长: 45")
高级词云图配置完成。
形状: circle
旋转步长: 45

📝 动手练一练

  1. 调整视觉对比:将第一个基础示例中的 word_size_range 从 [6, 66] 改为 [20, 40],重新运行并观察生成的词云图。描述一下视觉上发生了什么变化?这种设置更适合什么样的数据或展示场景?
点击查看参考答案

变化描述:字体大小的范围被压缩了。原本“生活资源”(999)和“市场外溢”(11)的字体大小相差60px(66-6),现在只相差20px(40-20)。这导致词汇之间的大小对比变得不那么强烈,所有词汇看起来尺寸更接近。

适用场景:当数据中最大值和最小值的差异巨大,但你不想让这种差异在视觉上过于夸张时;或者当你想让词云图整体看起来更紧凑、均衡时,可以使用较小的字体大小范围。它弱化了极端值的视觉冲击,更强调中游词汇的存在感。

  1. 模拟文本处理流程:假设你有一段文本 text = “数据分析是数据科学的核心,数据分析离不开好的可视化工具,比如ECharts。” 请编写一段伪代码或简要步骤,描述如何将这段文本处理成可用于 WordCloud 的 data_pair 格式列表。
点击查看参考答案

处理步骤:

  1. 分词:使用分词库(如 jieba.lcut)对文本进行分词。结果可能为:[‘数据’, ‘分析’, ‘是’, ‘数据’, ‘科学’, ‘的’, ‘核心’, ‘,’, ‘数据’, ‘分析’, ‘离不开’, ‘好’, ‘的’, ‘可视化’, ‘工具’, ‘,’, ‘比如’, ‘ECharts’, ‘。’]
  2. 清洗与去除停用词:
    • 去除标点符号(如 ,、。)。
    • 去除中文停用词(如 是、的、了)。假设去除后得到:[‘数据’, ‘分析’, ‘数据’, ‘科学’, ‘核心’, ‘数据’, ‘分析’, ‘离不开’, ‘好’, ‘可视化’, ‘工具’, ‘比如’, ‘ECharts’]
  3. 词频统计:遍历清洗后的词列表,统计每个词的出现次数。
    • 数据: 3
    • 分析: 2
    • 科学: 1
    • 核心: 1
    • 离不开: 1
    • 好: 1
    • 可视化: 1
    • 工具: 1
    • 比如: 1
    • ECharts: 1
  4. 格式转换:将词频统计字典转换为 (word, value) 元组列表。
    data_pair = [("数据", 3), ("分析", 2), ("科学", 1), ("核心", 1), ("可视化", 1), ("ECharts", 1)] # 仅示例部分
    这个 `data_pair` 就可以直接用于 `WordCloud().add()` 方法。
</details>

## 本章小结

在本章中,我们探索了两种非结构化数据的可视化方法:主题河流图和词云图。词云图作为文本数据的视觉摘要工具,能够快速传达大量文本中的核心主题与关键词重要性。理解其背后从原始文本到可视化结果的数据处理流程(分词、去停用词、统计)至关重要,这确保了词云图反映的是有意义的洞察,而非无意义的噪音。

### 📋 行动清单
- [ ] **掌握核心配置**:在 pyecharts 中成功运行一个基础词云图,理解 `data_pair` 数据格式和 `word_size_range` 参数的作用。
- [ ] **理解数据处理**:能够清晰描述从一段中文原始文本生成词云图所需的关键 NLP 预处理步骤(分词、去停用词)。
- [ ] **尝试高级定制**:修改示例代码,尝试为词云图更换一种形状(如 `shape=‘diamond’`)或调整词汇的旋转角度,观察视觉效果的变化。

—— 小象教研组