大家好,我是何三,80后老猿,独立开发者。
继续我们的"5分钟Python自动化"系列。今天我们来点既实用又酷炫的——用Python生成词云图。
有这样的场景:你需要分析一份长篇报告的关键词分布,你想从用户评论中提取高频词汇,你想为演讲制作一个吸引人的视觉摘要,或者你想把某人的微博内容变成一幅艺术画...
传统做法:手动统计词汇频率,用Excel或WordCloud在线工具,步骤繁琐,效果有限,自定义困难。
Python做法:10行代码,3秒钟,生成专业级词云图,想用什么形状就用什么形状,想用什么颜色就用什么颜色!
今天,我就带你用5分钟,掌握这个让数据可视化的"神器"技能!
环境准备:两个命令搞定
在开始之前,你只需要:
- 安装Python(这个已经装好了)
- 安装必要的库:打开命令行,依次输入:
pip install wordcloud
pip install jieba
pip install pillow
这三个库分别是:
- wordcloud:词云生成的核心库
- jieba:中文分词工具(处理中文必备)
- pillow:图像处理库(处理自定义形状)
核心代码:10行基础词云图
让我们先看看这个最简单的"词云魔法":
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 准备文本数据
text = """
Python是一门非常强大的编程语言,
它简洁优雅,学习曲线平缓,
非常适合数据分析、人工智能和自动化。
Python的社区非常活跃,
有大量的第三方库可以使用。
"""
# 创建词云对象
wordcloud = WordCloud(
width=800, height=400,
background_color='white',
font_path='simhei.ttf' # 中文字体
).generate(text)
# 显示词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off') # 关闭坐标轴
plt.show()
# 保存到文件
wordcloud.to_file('basic_wordcloud.png')
逐行详解:理解词云的生成逻辑
第1-2行:导入核心工具箱
from wordcloud import WordCloud
import matplotlib.pyplot as plt
WordCloud:词云生成的核心类matplotlib:Python最常用的绘图库
第4-12行:准备文本数据
text = """
Python是一门非常强大的编程语言,
它简洁优雅,学习曲线平缓,
非常适合数据分析、人工智能和自动化。
Python的社区非常活跃,
有大量的第三方库可以使用。
"""
你可以把任何文本放在这里:文章、报告、评论、歌词、代码等等。
第14-19行:配置并生成词云
wordcloud = WordCloud(
width=800, height=400,
background_color='white',
font_path='simhei.ttf' # 中文字体
).generate(text)
这是最关键的配置部分:
- width、height:词云图的尺寸
- background_color:背景颜色
- font_path:字体文件路径(处理中文必须指定中文字体)
第21-25行:显示和保存
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off') # 关闭坐标轴
plt.show()
wordcloud.to_file('basic_wordcloud.png')
plt.imshow():显示图像plt.axis('off'):隐藏坐标轴,让词云图更美观to_file():保存为图片文件
实战演示:3秒生成你的第一个词云
- 准备中文字体:下载一个中文字体文件(如simhei.ttf),放在脚本同目录
- 保存脚本:将上面的代码保存为
wordcloud_demo.py - 运行脚本:打开命令行,输入:
bash python wordcloud_demo.py - 查看结果:会弹出一个窗口显示词云图,同时生成
basic_wordcloud.png文件
生成效果:
一个漂亮的词云图,其中:
- "Python" 最大最显眼
- "非常"、"适合"、"库" 等词次之
- 背景为白色,文字为随机颜色
举一反三:打造个性化词云
案例1:处理中文文本并分词
from wordcloud import WordCloud
import jieba
# 中文文本
chinese_text = """
数据分析是现代企业决策的重要依据,
通过Python可以快速处理大量数据,
提取有价值的信息和洞察。
机器学习是人工智能的核心技术,
深度学习在图像识别和自然语言处理方面表现出色。
"""
# 使用jieba进行中文分词
word_list = jieba.cut(chinese_text)
word_text = " ".join(word_list)
# 生成词云
wordcloud = WordCloud(
font_path='simhei.ttf',
width=1000, height=600,
background_color='white',
max_words=100
).generate(word_text)
# 显示和保存
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig('chinese_wordcloud.png', dpi=300, bbox_inches='tight')
案例2:使用自定义形状的词云
from PIL import Image
import numpy as np
# 读取形状蒙版图片(白色背景,黑色形状)
mask = np.array(Image.open("heart_shape.png"))
# 生成形状词云
wordcloud = WordCloud(
font_path='simhei.ttf',
background_color='white',
mask=mask, # 使用形状蒙版
contour_width=3,
contour_color='red'
).generate(text)
plt.figure(figsize=(10, 10))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.savefig('shaped_wordcloud.png')
案例3:从文件读取文本生成词云
def generate_wordcloud_from_file(filepath, output_name):
"""从文本文件生成词云"""
# 读取文件内容
with open(filepath, 'r', encoding='utf-8') as f:
text = f.read()
# 如果是中文,进行分词
if any('\u4e00' <= char <= '\u9fff' for char in text):
word_list = jieba.cut(text)
text = " ".join(word_list)
# 生成词云
wordcloud = WordCloud(
font_path='simhei.ttf',
width=1200, height=800,
background_color='white',
colormap='viridis', # 使用好看的色系
max_words=200,
stopwords={'的', '了', '在', '是', '我'} # 停用词
).generate(text)
# 保存
wordcloud.to_file(output_name)
print(f"词云已生成: {output_name}")
# 使用示例
generate_wordcloud_from_file("report.txt", "report_wordcloud.png")
案例4:根据词频生成词云
from collections import Counter
def generate_wordcloud_from_frequency(text):
"""根据词频生成词云"""
# 分词并统计词频
words = jieba.cut(text)
word_freq = Counter(words)
# 移除停用词和单字
stopwords = {'的', '了', '在', '是', '和', '有', '这', '个', '中', '为'}
filtered_freq = {
word: freq for word, freq in word_freq.items()
if word not in stopwords and len(word) > 1
}
# 根据词频生成词云
wordcloud = WordCloud(
font_path='simhei.ttf',
background_color='white',
width=1000, height=600
).generate_from_frequencies(filtered_freq)
return wordcloud
# 使用示例
text = "数据分析 机器学习 深度学习 人工智能 Python 编程"
wordcloud = generate_wordcloud_from_frequency(text)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
进阶技巧:专业级词云生成
自定义颜色方案
from wordcloud import WordCloud, get_single_color_func
class GroupedColorFunc:
"""分组颜色函数"""
def __init__(self, color_to_words, default_color):
self.color_funcs = {
color: get_single_color_func(color)
for color in color_to_words
}
self.default_color_func = get_single_color_func(default_color)
self.color_to_words = color_to_words
def __call__(self, word, **kwargs):
for color, words in self.color_to_words.items():
if word in words:
return self.color_funcs[color](word, **kwargs)
return self.default_color_func(word, **kwargs)
# 定义不同组的颜色
color_to_words = {
'#00ff00': ['Python', '编程', '代码'], # 绿色组
'#ff0000': ['数据', '分析', '处理'], # 红色组
'#0000ff': ['学习', '智能', '算法'] # 蓝色组
}
wordcloud = WordCloud(font_path='simhei.ttf')
wordcloud.generate(text)
# 应用自定义颜色
wordcloud.recolor(color_func=GroupedColorFunc(
color_to_words, default_color='gray'
))
生成渐变色彩词云
import matplotlib.colors as mcolors
import numpy as np
def create_gradient_colormap(color1, color2):
"""创建渐变色彩映射"""
return mcolors.LinearSegmentedColormap.from_list(
'gradient', [color1, color2]
)
# 生成渐变词云
wordcloud = WordCloud(
font_path='simhei.ttf',
width=1200, height=800,
background_color='white',
colormap=create_gradient_colormap('#ff0000', '#0000ff'), # 红到蓝渐变
max_words=150,
min_font_size=10,
max_font_size=100
).generate(text)
生成3D效果的词云
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def create_3d_wordcloud(text):
"""创建3D效果的词云"""
# 首先生成普通词云
wordcloud = WordCloud(
width=800, height=600,
background_color='white'
).generate(text)
# 创建3D图形
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
# 获取词的位置和大小
positions = wordcloud.layout_
# 在3D空间中绘制每个词
for (word, count), font_size, position, orientation, color in positions:
x, y = position
# 添加Z轴高度(基于词频)
z = np.log(count) * 5
ax.text(x, y, z, word,
size=font_size/10,
color=color,
ha='center', va='center')
ax.set_axis_off()
plt.show()
实用场景:词云图的多种应用
场景1:分析用户评论情感
import pandas as pd
def analyze_reviews_wordcloud(csv_file):
"""从用户评论生成词云"""
# 读取评论数据
df = pd.read_csv(csv_file)
reviews = " ".join(df['评论内容'].dropna().tolist())
# 情感分析相关词
positive_words = ['好', '喜欢', '满意', '推荐', '优秀', '不错']
negative_words = ['差', '不好', '失望', '问题', '慢', '贵']
# 生成词云
wordcloud = WordCloud(
font_path='simhei.ttf',
width=1200, height=800,
background_color='white',
collocations=False # 不统计词组
).generate(reviews)
# 分析正面/负面词频
word_freq = wordcloud.process_text(reviews)
positive_count = sum(word_freq.get(word, 0) for word in positive_words)
negative_count = sum(word_freq.get(word, 0) for word in negative_words)
print(f"正面词汇出现次数: {positive_count}")
print(f"负面词汇出现次数: {negative_count}")
return wordcloud
场景2:生成会议报告词云
def generate_conference_summary(transcript_file, speakers):
"""从会议记录生成摘要词云"""
with open(transcript_file, 'r', encoding='utf-8') as f:
transcript = f.read()
# 按发言人分割文本
speaker_texts = {}
current_speaker = None
for line in transcript.split('\n'):
for speaker in speakers:
if line.startswith(speaker + ':'):
current_speaker = speaker
content = line[len(speaker)+1:].strip()
if current_speaker not in speaker_texts:
speaker_texts[current_speaker] = []
speaker_texts[current_speaker].append(content)
break
# 为每个发言人生成词云
for speaker, texts in speaker_texts.items():
text = " ".join(texts)
wordcloud = WordCloud(
font_path='simhei.ttf',
width=800, height=400,
background_color='white',
max_words=50
).generate(text)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title(f'{speaker}的发言关键词', fontsize=16)
plt.axis('off')
plt.savefig(f'{speaker}_wordcloud.png', dpi=300, bbox_inches='tight')
plt.close()
场景3:生成社交媒体话题词云
import re
def generate_social_media_wordcloud(html_file):
"""从社交媒体页面生成话题词云"""
with open(html_file, 'r', encoding='utf-8') as f:
html_content = f.read()
# 提取话题标签
hashtags = re.findall(r'#(\w+)', html_content)
hashtag_text = " ".join(hashtags)
# 生成话题词云
wordcloud = WordCloud(
font_path='simhei.ttf',
width=1000, height=600,
background_color='black',
colormap='hot', # 热力图颜色
max_words=100
).generate(hashtag_text)
plt.figure(figsize=(12, 8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('社交媒体热门话题', fontsize=20, color='white')
plt.savefig('social_media_wordcloud.png',
dpi=300, bbox_inches='tight',
facecolor='black')
注意事项与最佳实践
1. 中文处理必须指定字体
# 正确做法
wordcloud = WordCloud(font_path='simhei.ttf').generate(text)
# 错误做法(会显示方框)
wordcloud = WordCloud().generate(chinese_text) # 缺少中文字体
2. 处理大文本时的优化
def optimize_large_text(text, max_words=200):
"""优化大文本处理"""
# 1. 移除标点符号
text = re.sub(r'[^\w\s]', '', text)
# 2. 转换为小写
text = text.lower()
# 3. 使用更高效的分词
words = text.split() # 英文用空格分词
# 或 words = jieba.lcut(text) # 中文用结巴分词
# 4. 限制词汇数量
if len(words) > max_words * 10:
words = words[:max_words * 10]
return " ".join(words)
3. 保存高质量图片
# 设置高DPI保存
wordcloud.to_file('output.png', dpi=300)
# 或使用matplotlib保存
plt.savefig('output.png',
dpi=300,
bbox_inches='tight', # 去除白边
pad_inches=0.1,
facecolor=wordcloud.background_color)
结语:让数据"说话"的艺术
恭喜!在又一个5分钟内,你掌握了一个强大的数据可视化技能:
✅ 用10行代码生成基础词云图
✅ 掌握中文分词和自定义形状
✅ 学会从文件读取和词频统计生成词云
✅ 具备生成专业级渐变色彩词云的能力
今天你学会的不仅仅是生成图片,而是掌握了让数据"说话"的视觉语言。
想象一下,你还可以: - 为年度报告生成关键词摘要 - 分析用户反馈中的热点问题 - 制作个人社交媒体内容词云 - 为演讲制作视觉辅助材料 - 分析竞品网站的关键词分布
数据可视化不是目的,而是让复杂信息变得清晰易懂的手段。
现在,就找一篇你最近读过的文章,或者你的项目文档,为它生成一个词云图吧!在评论区分享你的创意设计和实际应用!
记得关注我,下一篇我们挑战更有趣的Python自动化技巧!