大家好,我是何三,80后老猿,独立开发者。

继续我们的"5分钟Python自动化"系列。今天我们来点既实用又酷炫的——用Python生成词云图

有这样的场景:你需要分析一份长篇报告的关键词分布,你想从用户评论中提取高频词汇,你想为演讲制作一个吸引人的视觉摘要,或者你想把某人的微博内容变成一幅艺术画...

传统做法:手动统计词汇频率,用Excel或WordCloud在线工具,步骤繁琐,效果有限,自定义困难。

Python做法:10行代码,3秒钟,生成专业级词云图,想用什么形状就用什么形状,想用什么颜色就用什么颜色!

今天,我就带你用5分钟,掌握这个让数据可视化的"神器"技能!

环境准备:两个命令搞定

在开始之前,你只需要:

  1. 安装Python(这个已经装好了)
  2. 安装必要的库:打开命令行,依次输入:
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)

这是最关键的配置部分: - widthheight:词云图的尺寸 - 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秒生成你的第一个词云

  1. 准备中文字体:下载一个中文字体文件(如simhei.ttf),放在脚本同目录
  2. 保存脚本:将上面的代码保存为wordcloud_demo.py
  3. 运行脚本:打开命令行,输入: bash python wordcloud_demo.py
  4. 查看结果:会弹出一个窗口显示词云图,同时生成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自动化技巧!