一、代码解析(按执行顺序)
1. 库导入
import jieba # 中文分词工具
from wordcloud import WordCloud # 词云生成器
from collections import Counter # 词频统计
import matplotlib.pyplot as plt # 可视化
import numpy as np # 图像矩阵处理
from PIL import Image # 图像处理
-
关键点:
jieba
需通过pip install jieba
安装,PIL
实际是Pillow
库(需pip install pillow
)
2. 文本读取
with open(r"E:\python\Anaconda (Anaconda)\python学习\1.txt", "r", encoding="utf-8") as f:text = f.read()
-
注意:路径中的空格不会影响读取,但建议路径尽量简洁(如
E:\python_project\data.txt
) -
风险点:若文件不是UTF-8编码会报错,可用
chardet
库检测文件编码
3. 中文分词
ls = jieba.lcut(text) # 精确模式分词
filtered_words = [word for word in ls if len(word) > 1] # 过滤单字
jieba模式对比:
lcut
:返回列表(推荐)
cut
:返回生成器(适合大文件)过滤逻辑:中文单字通常无意义(如"的"、"是")
4. 词频统计
word_freq = Counter(filtered_words)
-
输出示例:
Counter({'Python': 25, '学习': 18, ...})
-
调试技巧:可打印前20高频词
print(word_freq.most_common(20))
5. 词云生成
mask = np.array(Image.open(r"D:\Python\...\heart.png")) # 转换为numpy数组
wc = WordCloud(font_path="C:\\Windows\\Fonts\\simhei.ttf", # 必须指定中文字体mask=mask, # 形状控制background_color="white" # 建议与mask图片背景色一致
)
wc.generate_from_frequencies(word_freq)
-
常见问题:
-
字体路径错误 → 词云显示方框
-
mask图片非白底 → 形状异常
-
6. 可视化与保存
plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("news_wordcloud.png") # 保存到当前目录
-
优化建议:添加
plt.figure(figsize=(10,6))
控制画布大小
二、新手易错点排查表
问题现象 | 可能原因 | 解决方案 |
---|---|---|
词云显示乱码 | 1. 未正确设置中文字体 2. 系统缺少字体 | 1. 检查font_path路径 2. 将字体文件复制到项目目录直接引用 |
形状不符合预期 | 1. mask图片背景非纯白 2. 图片尺寸过小 | 1. 用PS/画图工具将背景设为纯白 2. 使用与width/height参数匹配的图片 |
分词效果差 | 1. 未加载自定义词典 2. 未过滤停用词 | 1. jieba.load_userdict("my_dict.txt") 2. 添加停用词过滤逻辑 |
三、代码优化建议
1. 添加停用词过滤
# 在过滤单字后添加
stopwords = ["的", "是", "了", "在"] # 可读取外部文件
filtered_words = [w for w in filtered_words if w not in stopwords]
2. 提升可视化效果
plt.figure(figsize=(12, 8)) # 调整画布大小
plt.imshow(wc, interpolation="bilinear", cmap="viridis") # 修改配色
plt.title("你的词云标题", fontsize=14, pad=20) # 添加标题
3. 异常处理
try:mask = np.array(Image.open("heart.png"))
except FileNotFoundError:print("蒙版图片不存在!")mask = None # 回退到矩形词云
完整代码如下:
import jieba
from wordcloud import WordCloud
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image # 新增导入# 读取文本文件
with open(r"E:\python\Anaconda (Anaconda)\python学习\1.txt", "r", encoding="utf-8") as f:text = f.read()# 使用结巴分词进行分词
ls = jieba.lcut(text)# 过滤单字词语(可选)
filtered_words = [word for word in ls if len(word) > 1]# 统计词频
word_freq = Counter(filtered_words) # 或直接使用 Counter(ls)# 生成词云
wc = WordCloud(font_path="C:\\Windows\\Fonts\\simhei.ttf",width=1000,height=700,background_color="white",mask=np.array(Image.open(r"D:\Python\notebook\lovepage\love\heart.png")) # ✅ 正确导入 Image
)
wc.generate_from_frequencies(word_freq)# 显示并保存
plt.imshow(wc, interpolation='bilinear') # 添加 interpolation 避免警告
plt.axis("off")
plt.show() # 显示图像(非 Notebook 环境需调用)
wc.to_file("news_wordcloud.png")
运行结果:
爱心图片: