在数据可视化领域,词云是一种直观展示文本数据中关键词频率分布的方式。今天,我将手把手教大家如何利用 Python 中的 jieba 库(用于中文分词)和 wordcloud 库(用于生成词云)打造属于自己的词云图。资源绑定附上本章完整资源供读者参考学习。
一、环境搭建与库安装
在开始之前,确保你的 Python 环境已安装以下库。若未安装,可使用 pip 命令:
pip install jieba wordcloud matplotlib numpy pillow
二、核心步骤详解
步骤一:文本读取
with open(input_file, "r", encoding="utf-8") as f:
text = f.read()
这是整个流程的起点,我们将目标文本文件以 UTF-8 编码读取到程序中,存储为字符串变量 text,后续所有操作都将基于这份文本数据展开。
步骤二:中文分词
words = jieba.lcut(text)
由于中文词语之间没有天然的分隔符,我们需要借助 jieba 库的 lcut() 函数对文本进行精确模式的分词,将连续的中文文本切割成一个个独立的词语,以列表形式存储在 words 变量中,这是生成词云的关键前置步骤。
步骤三:停用词处理
stopwords = set()
if stopwords_file:
try:
with open(stopwords_file, "r", encoding="utf-8") as f:
stopwords = set([line.strip() for line in f])
except FileNotFoundError:
print(f"警告:未找到停用词文件 {stopwords_file},使用默认停用词")
stopwords = {"的", "了", "和", "在", "是", "我", "你", "他"} # 基础停用词
停用词是指文本中频繁出现但对语义分析价值不大的词汇,如“的”“了”等。此处尝试从指定路径加载自定义停用词表,若文件不存在,则使用程序内置的基础停用词集合,目的是过滤掉这些无意义的词汇,使词云更聚焦于关键信息。
步骤四:过滤与词频统计
filtered_words = [word for word in words if len(word) > 1 and word not in stopwords]
word_counts = Counter(filtered_words)
top_words = word_counts.most_common(50) # 取前50个高频词
首先,通过列表推导式筛选出长度大于 1 且不在停用词列表中的词语,得到 filtered_words。接着,利用 Counter 类对这些词语进行词频统计,并提取出词频最高的前 50 个词作为词云的素材,既保证了词云的丰富度,又避免了信息过载。
步骤五:词云参数配置与生成
wc_config = {
"font_path": font_path, # 必须指定中文字体,否则中文显示异常
"background_color": "white", # 设置词云背景颜色
"max_words": 50, # 限定词云中最大显示词数,与前面提取的 top_words 数量对应
"width": 400, # 调整词云图片宽度
"height": 300, # 调整词云图片高度
"colormap": "viridis" # 选择词云颜色主题,丰富视觉效果
}
if mask_image:
mask = np.array(Image.open(mask_image))
wc_config["mask"] = mask
wordcloud = WordCloud(**wc_config).generate_from_frequencies(dict(top_words))
这里定义了词云的各类参数,从字体路径、背景颜色到词的数量、图片尺寸以及色彩映射等,全方位定制词云样式。若提供了遮罩图片路径,还会将其转换为 numpy 数组作为词云形状的模板,使词云呈现特定轮廓。最后,通过 WordCloud 类的 generate_from_frequencies() 方法,基于前面统计的词频数据生成词云对象。
步骤六:词云展示与保存
plt.figure(figsize=(10, 8))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
wordcloud.to_file(output_image)
print(f"词云已保存至: {output_image}")
plt.show()
借助 matplotlib 库创建画布,以图像形式展示生成的词云,关闭坐标轴以获得更纯净的视觉效果。同时,使用 to_file() 方法将词云图片保存到指定路径,方便后续使用或分享,最后调用 show() 方法呈现词云图像。
三、关键函数速查表
jieba 库常用函数
函数名 | 参数 | 返回值 | 描述 |
---|---|---|---|
lcut(text) | text: 待分词文本字符串 | list: 分词后的词语列表 | 对文本进行精确模式分词 |
add_word(word) | word: 需添加的词语字符串 | 无 | 向分词词典中添加新词,提升分词准确度 |
wordcloud 库常用函数及参数
函数/参数名 | 类型 | 描述 |
---|---|---|
WordCloud() | 类 | 初始化词云生成器,可设置字体、背景色等参数 |
generate_from_frequencies(frequencies) | 方法 | 基于词频字典生成词云 |
to_file(filename) | 方法 | 将词云图片保存到指定文件路径 |
font_path | 参数 | 指定中文字体路径,确保中文正常显示 |
background_color | 参数 | 设置词云背景颜色 |
max_words | 参数 | 限定词云中最大显示词数 |
width, height | 参数 | 设置词云图片的宽度和高度 |
colormap | 参数 | 定义词云的颜色主题 |
mask | 参数 | 指定词云形状遮罩的 numpy 数组 |
四、完整示例代码
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np
from PIL import Image
# ========== 配置参数 ==========
input_file = "2024雷军年度演讲.txt" # 输入文本文件路径
output_image = "2024雷军年度演讲词云.png" # 输出词云图片路径
stopwords_file = "停用词.txt" # 停用词文件路径(可选)
font_path = "simhei.ttf" # 中文字体文件路径(如宋体、黑体)
mask_image = '和平鸽轮廓.jpg' # 词云形状遮罩图片路径(可选)
# ========== 1. 读取文本文件 ==========
with open(input_file, "r", encoding="utf-8") as f:
text = f.read()
# ========== 2. 中文分词处理 ==========
words = jieba.lcut(text)
# ========== 3. 加载停用词表 ==========
stopwords = set()
if stopwords_file:
try:
with open(stopwords_file, "r", encoding="utf-8") as f:
stopwords = set([line.strip() for line in f])
except FileNotFoundError:
print(f"警告:未找到停用词文件 {stopwords_file},使用默认停用词")
stopwords = {"的", "了", "和", "在", "是", "我", "你", "他"} # 基础停用词
# ========== 4. 过滤停用词并统计词频 ==========
filtered_words = [word for word in words if len(word) > 1 and word not in stopwords]
word_counts = Counter(filtered_words)
top_words = word_counts.most_common(50) # 取前50个高频词
# ========== 5. 生成词云 ==========
# 配置词云参数
wc_config = {
"font_path": font_path, # 必须指定中文字体
"background_color": "white", # 背景颜色
"max_words": 50, # 最大显示词数
"width": 400, # 图片宽度
"height": 300, # 图片高度
"colormap": "viridis" # 颜色主题
}
# 添加形状遮罩(可选)
if mask_image:
mask = np.array(Image.open(mask_image))
wc_config["mask"] = mask
# 创建词云对象
wordcloud = WordCloud(**wc_config).generate_from_frequencies(dict(top_words))
# ========== 6. 显示并保存词云 ==========
plt.figure(figsize=(10, 8))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
# 保存词云图片
wordcloud.to_file(output_image)
print(f"词云已保存至: {output_image}")
# 显示词云(可选)
plt.show()
五、演示案例说明
案例一:2024 雷军年度演讲词云
将上述代码中的 input_file 参数设置为 "2024雷军年度演讲.txt",运行程序后,即可生成基于雷军演讲内容的词云图,保存为 "2024雷军年度演讲词云.png"。从词云中可以直观看出演讲中重点提及的技术方向、产品规划以及战略目标等关键词,帮助读者快速把握演讲核心。
效果展示:
案例二:政府工作报告词云
同理,若将 input_file 指向 "政府工作报告.txt",生成的词云将呈现报告中强调的施政重点、民生举措、经济发展规划等高频词汇,以可视化方式展现政府工作关注点,便于大众理解和传播。
效果展示:
通过以上详细讲解与案例演示,相信大家已经掌握了利用 Python 生成词云的完整流程。无论是分析演讲稿、政策文件,还是其他各类文本数据,这一技能都能帮助我们更高效地挖掘文本价值,发现其中的规律与重点。在实际应用中,大家还可以根据需求调整参数、更换遮罩图片、优化停用词表等,打造更具个性化的词云作品。资源绑定附上本章完整资源供读者参考学习。