☰
Python词云制作教程:从中文分词到蒙版配色实战
2026/11/2 3:09:14 网站建设 项目流程

简介:这份面向文本挖掘与数据可视化初学者及中级Python学习者的PDF教程,围绕词云生成展开,帮助读者理解词云的概念、作用与实现路径,并掌握其在报告展示、数据分析和社交媒体观察等场景中的应用方法。教程以wordcloud与matplotlib为核心,系统讲解文本预处理、词频或TF-IDF权重计算、图像生成及展示保存流程,配合7个由浅入深的案例,覆盖最简调用、中文分词与不分词、蒙版形状、自定义配色、关键词及权重提取等实践要点。资源包内共1个PDF文件,大小约2.07MB,便于直接查阅与对照练习,案例中的代码示例和运行结果可辅助理解参数设置与效果差异。已有109人学习或下载,适合希望快速建立词云制作框架、补齐中文处理细节并动手复现完整案例的读者参考。

1. 先弄明白:词云到底是个什么东西

你有没有过这种时候——手里攒了几百条用户留言、一整篇论文、一个产品的全部评论,想跟别人说「大家主要都在聊这几件事」,可一开口就卡住。总不能把原始文字一条条念一遍吧。词云就是干这个的:它把一段文字里出现得多的词,用更大的字号摆到同一张图上,出现越频繁,字就越大,颜色和轮廓还能自己挑。

它本质上是一张「文字的重要性地图」。你不用读完全文,扫一眼就知道这段文字在讲什么、哪个词被提得最多。做它也不需要多复杂的环境,Python 里两个库就够了:wordcloud 负责把词排成图,matplotlib 负责把图显示和保存出来。下面我从装环境开始,带你跑通第一个例子,再一步步换成中文、换成你想要的形状。

2. 为什么值得学:词云能帮你摆平的三个真实场景

2.1 一屏看不懂的文字,三秒看出重点

我先说一个几乎人人都会遇到的场面。假设你手上有一份两万字的问卷回答,或者一千条商品评价,老板问你「用户到底在抱怨什么」。你从头读到尾,读完第一遍脑子是糊的,读完第二遍开始怀疑自己,读完第三遍只记得最后那几条特别生气的。这种时候,人脑对「整体分布」这件事是天然不擅长的——我们对单个故事印象很深,对「哪个词被提了一千次、哪个词只被提了三次」几乎没有感觉。

词云解决的第一个问题就是这件事:把「频率」翻译成「大小」。文字还是那些文字,但它把「出现次数」这个抽象数字,变成了眼睛能直接比较的视觉尺寸。一千次的词占掉半个屏幕,三次的词缩成一个小点。你不用统计,不用做表,扫一眼就知道重心在哪。

这背后其实是文本挖掘里一个很朴素的思路:先把文本拆成一个个词,数每个词出现多少次,再按次数决定它在画面上的权重。词云只是把这个过程的结果画了出来。所以学词云,你顺手就把「词频统计」「文本预处理」这两个最基础的文本分析动作摸了一遍——这也是为什么我建议零基础的人从它入手,它门槛低,但该有的环节一个不少。

2.2 报告、作业、汇报里最容易救场的一张图

第二个场景更实际。你做完一份分析,PPT 里全是表格和折线图,数字很准,但台下的人已经开始低头看手机了。这时候你在中间插一张词云,画面上「续航」「发热」「客服」三个词大得刺眼,剩下的一堆小词密密麻麻铺在后面——你不用开口解释,观众自己就看懂了结论。

这就是词云在「报告和演示」里的价值:它是信息压缩。一张图里塞进了几百个词,观众花两秒钟接收到的信息量,可能比看三页表格还多。而且它对观众没有门槛,不管是技术评审还是给完全不懂数据的同事看,都能一眼接住。

对学生来说也是同理。做课程作业、做课题汇报、做社团活动的反馈整理,一张词云能让你的结论看起来有分量得多。它不替代严谨的统计分析,但在「先让人有兴趣听你讲」这一步,它的性价比高得离谱。包括社交媒体上那种「某款产品口碑如何」的快速判断,很多时候也是先出一张词云看整体情绪倾向,再决定要不要深挖。

2.3 它是文本挖掘里花时间最少的第一步

第三个理由稍微「功利」一点,但我认为对零基础的人最重要:词云是整个文本处理领域里,最快能出成果的入口。

你不需要先学机器学习,不需要懂模型,甚至不需要理解什么是向量。装两个库,读一个文本文件,十行代码,屏幕上就出来一张图。这种「立刻看到东西」的反馈,对刚入门的人来说非常重要——它让你知道自己在学的东西是真的能跑起来的,而不是一堆概念堆在那里。

而且它天然是个「探索工具」。拿到一份陌生的数据,你不知道里面有什么,先跑一张词云,看看哪些词冒出来了,往往就能发现你原本没预料到的方向。比如你以为用户在夸物流,结果词云里「包装」大得吓人,那你就知道下一步该去查包装相关的记录了。这种「先看一眼再决定往哪挖」的动作,在数据分析里叫探索性分析,词云是最省力的实现方式之一。

另外,词云还支持多语言。英文、中文、日文都能做,只是中文多一道分词的工序——这个我们后面会专门讲。所以你现在学的东西,不会只对一种文本有用。综合下来,这三个理由其实指向同一件事:投入很小,产出很快,而且产出的东西能直接用。对刚接触 Python 课程资源、想找个练手项目的人来说,没有比这更合适的起点了。

3. 零基础第一次动手:装好环境,跑通十行代码

3.1 先把 Python 和一个顺手的编辑器准备好

刚开始学的人最容易在这一步就卡住,然后怀疑自己不适合学编程。其实这一步没有任何技术含量,只是流程没走顺。

第一件事是装 Python。资源里演示用的是 Python 3.7,你现在装 3.8 以上的版本也完全没问题,代码写法没变。安装的时候有一个选项一定要勾上——把 Python 加到系统环境变量里(Windows 上那个长长的 Add Python to PATH 勾选框)。勾了它,你在命令行里敲python才能直接调用;不勾,后面装库的时候会一直报「不是内部或外部命令」,很多人卡在这一步,其实就是一个勾的事。

第二件事是选编辑器。编辑器就是你写代码的地方,它不影响代码本身能不能跑。资源里用的是 PyCharm,你用别的编辑器也完全可以,代码是通用的。对零基础的人来说,选编辑器的标准只有一个:能新建一个文件夹、能在里面新建 .py 文件、能点运行。不要一上来折腾各种插件和配置,那是熟手干的事。

第三件事,也是新手最容易忽略的:把文本文件和代码文件放在同一个文件夹里。听起来是废话,但后面所有的路径报错,八成都是因为它。我自己的习惯是,每做一个新例子就建一个新文件夹,里面放三样东西:代码文件、文本文件、以后生成的图片。一个例子一个文件夹,互不干扰,出问题了也好找。

提示:不要把所有练习都堆在一个文件夹里。文件一多,你自己都记不清哪个 txt 对应哪段代码,排查起来会非常痛苦。

装完之后验证一下,打开命令行或者编辑器的终端,敲:

python --version

能打印出版本号(比如 Python 3.7.x 或者 3.10.x),就说明装好了。如果提示找不到命令,回去检查环境变量那个勾。

3.2 装三个库:wordcloud、matplotlib、jieba

Python 本身不带画词云的功能,得装第三方库。这一步用 pip 命令就行,在命令行里敲:

pip install wordcloud matplotlib jieba

这三行一次装完。我解释一下每个是干什么的,你心里有个数,后面看代码就不会懵:

  • wordcloud:核心库。你把一段文本丢给它,它负责统计词频、决定每个词摆在哪、字号多大、颜色怎么配,最后给你一个词云对象。
  • matplotlib:画图库。wordcloud 生成的词云对象本身还不是图片文件,得靠 matplotlib 把它「显示出来」或者「存下来」。你可以把它理解成相机的取景器。
  • jieba:中文分词库。做英文词云用不上它,但中文必须用——原因第四章会详细讲。

装的过程可能会等一会儿,因为 wordcloud 依赖一个图形库,体积不小。如果下载特别慢,可以换成国内的镜像源,命令行后面加个-i参数指向镜像地址,具体地址网上一搜就有,这里不展开。

装完验证:

pip list

在打印出来的一长串列表里找找有没有 wordcloud、matplotlib、jieba。有就成,没有的话可能是装到了别的 Python 环境里,这时候把pip换成python -m pip再试一次。

3.3 第一个例子:十行代码生成一张词云

好,环境齐了,现在跑第一个例子。资源里的案例 01 是「最简调用」,我把它稍微改得更稳一点,加了文件关闭和编码处理:

# -*- coding: utf-8 -*- from wordcloud import WordCloud import matplotlib.pyplot as plt # 打开文本文件,encoding='utf-8' 避免中文乱码 with open('text.txt', 'r', encoding='utf-8') as f: text = f.read() # 生成词云对象:默认会按空格切词、按词频决定字号 wc = WordCloud().generate(text) # 显示出来 plt.imshow(wc, interpolation='bilinear') # bilinear 让显示更平滑 plt.axis('off') # 关掉坐标轴,不然图上有刻度线 plt.show() # 存成图片文件,保存在当前文件夹 wc.to_file('wordcloud.png')

我逐段说一下这几行到底在干什么,因为新手最怕的就是「代码能跑但不知道在跑什么」。

前三行是导入库,没什么好说的,写 Python 都要这么开头。from wordcloud import WordCloud的意思是「从 wordcloud 这个包里,只拿出 WordCloud 这个类」,后面就能直接用WordCloud()创建对象,不用写成wordcloud.WordCloud()。

with open(...) as f:这一段是读文件。with的写法好处是文件用完会自动关闭,不会占着不放。encoding='utf-8'指定了编码,中英文混排的文本基本都用这个。f.read()是把整个文件内容读成一个长字符串,存进text变量里。

WordCloud().generate(text)是核心。这里WordCloud()括号里的参数全是默认值,没做任何定制,所以出来的是一张最朴素的图:白色背景、默认配色、词按出现频率排大小。.generate(text)接收那个长字符串,返回一个已经排好版的词云对象wc。

接下来三行是显示。plt.imshow()负责把词云对象画到画布上,interpolation='bilinear'是插值方式,作用就是让显示出来的图边缘更顺滑,不那么毛糙。plt.axis('off')是关掉坐标轴——如果你不写这句,图的四周会出现数字刻度,很难看。plt.show()是真正把窗口弹出来。

最后一行wc.to_file('wordcloud.png')是保存。它和plt.show()是两件独立的事,你可以只显示不保存,也可以只保存不显示。保存的文件会出现在代码文件所在的文件夹里。

注意:这个例子用的是英文文本。如果你的 text.txt 里是中文,跑出来大概率会是一堆方块——别慌,那不是代码错了,是缺字体,第四章第一节专门讲。

跑通这一步,你就已经完成了一次完整的「读文本 → 生成 → 显示 → 保存」。后面六个案例,本质上都是在WordCloud()的括号里加参数,或者在生成方式上做替换。所以别小看这十行,它是整份教程的地基。

4. 中文词云进阶:字体、分词、形状和配色一次说清

4.1 中文变方块:font_path 到底在解决什么

先说你一定会遇到的第一个问题。把上面那段代码的文本换成中文,跑一下,屏幕上出来一堆「□□□」,或者干脆只有几个孤零零的字。这不是编码问题,也不是库装坏了,纯粹是字体问题。

原因很简单:wordcloud 在画每个词的时候,需要知道用什么字体来渲染这些字符。它默认用的是一款西文字体,这款字体里压根就没有汉字的字形数据。文字编码是对的,程序也知道该画哪个词,只是「画不出来」,于是用方块占位。

解决办法就是告诉它用一个包含中文的字体文件,也就是font_path参数:

wc = WordCloud( font_path='simhei.ttf', # 中文字体文件路径,缺了它中文会变成方块 width=800, # 画布宽 height=600, # 画布高 mode='RGBA', # 带透明通道的模式 background_color=None # 背景透明 ).generate(text)

这里几个参数一起说。font_path指向一个 .ttf 或 .otf 的字体文件,路径可以是绝对路径,也可以是相对于代码文件的路径。资源里用的是某个系统自带字体,你换成自己电脑上有的中文字体就行,比如黑体、宋体,具体文件名去系统字体目录里找。

width和height是画布尺寸,单位是像素。数字越大,能塞进去的词越多,但生成也越慢。800×600 是个挺合适的起步值。

mode='RGBA'和background_color=None要配合着看。RGBA 里的 A 是 alpha,也就是透明度通道。把背景色设成None(而不是'white'),再配合 RGBA 模式,出来的图背景就是透明的,PNG 格式能保留这个透明。这样做的好处是,你把词云贴到任何底色的 PPT 或者海报上,都不会出现一个突兀的白色方块。

提示:如果你只改了 font_path 但还是方块,先确认那个字体文件真的存在、路径没写错。路径写错的时候 wordcloud 不一定会报错,它会静默地退回默认字体,然后继续给你方块。

4.2 不分词的中文词云,是一团糊

字体解决了,第二个问题紧跟着来。你兴冲冲跑出来一张图,发现上面全是「我们」「的是」「一个」「不知道」这种词,而且最大的那个词可能是半句话。

这是中文特有的坑:中文写字不用空格分词。英文里 "I love you" 三个词之间有空格,程序按空格一切就完事了。中文「我喜欢你」四个字连在一起,程序不知道该怎么切——是「我 / 喜欢 / 你」,还是「我喜 / 欢你」?

wordcloud 默认的切词逻辑就是按空格切。你不给它空格,它就把一整段当成一个巨大的「词」,于是要么整段糊成一坨,要么随机切出一些莫名其妙的片段。

所以做中文词云,中间必须加一道工序:分词。把连续的汉字序列,切成一个一个有意义的词,再用空格把它们重新连起来,骗过 wordcloud,让它以为这是英文文本。

这一步不是可有可无的优化,是中文词云能不能看的分水岭。原因有三个:一是切完词才能准确统计词频,不然统计的粒度是错的;二是切完词才能识别出关键信息,比如人名、地名、产品名;三是切完词,你才能往里面加停用词表,把「的、了、是」这些没信息量的词过滤掉。

4.3 用 jieba 把句子切成词

分词用 jieba,这是中文分词里最常用的库,装的时候已经一起装好了。核心就一行:

import jieba with open('novel.txt', 'r', encoding='utf-8') as f: text = f.read() # jieba.cut 返回的是一个生成器,用空格把切出来的词重新连成字符串 text = ' '.join(jieba.cut(text)) # 打印前 100 个字符看看切得对不对,这行排查时很有用 print(text[:100])

jieba.cut(text)返回的不是列表,是一个生成器——你可以理解成「边切边给你」,节省内存。所以不能直接打印看,得用' '.join(...)把它拼成一个用空格分隔的长字符串。这个字符串才是能喂给 wordcloud 的格式。

那句print(text[:100])别省。它是你排查问题的第一道关卡:分词切得对不对,打印前一百个字符一眼就看出来了。如果打出来是「他 走 进 房间 里 」这样的,说明切得不错;如果是「他走 进房 间里」这样乱七八糟的,那可能是文本编码有问题,或者混进了奇怪的符号。

jieba 有三种分词模式,资源里提到了,我按新手的使用频率排一下:

精确模式是默认的,jieba.cut(text)就是它。它试图把句子切得最准确,适合做词云、做文本分析。

全模式是jieba.cut(text, cut_all=True)。它会把所有可能成词的组合都扫出来,速度快但会有大量冗余,比如「北京大学」它会同时给出「北京」「大学」「北京大学」。做词云一般不用它,因为重复词太多,图会很乱。

搜索引擎模式是jieba.cut_for_search(text)。它在精确模式的基础上,对长词再切一刀,提高召回率。适合做搜索索引,做词云用得少。

新手就用默认的精确模式,别纠结。等你发现某些专有名词被切坏了,再去研究自定义词典——那是后面的事。

4.4 换形状:用一张蒙版图决定词云的轮廓

到这里,你的中文词云已经能正常出图了,但它是个规规矩矩的矩形。资源里的案例 04 教的是怎么把它变成任意形状,靠的是mask参数。

原理不复杂:你给它一张图,它把这张图当成一个「模子」,只在这个模子的轮廓范围内摆词。这张图叫蒙版。

from PIL import Image import numpy as np # 把蒙版图读进来,转成 numpy 数组,wordcloud 需要的是数组不是图片对象 mask = np.array(Image.open('mask.png')) wc = WordCloud( mask=mask, # 形状由这张图决定 font_path='simhei.ttf', background_color=None, mode='RGBA' ).generate(text)

两个关键点。第一,蒙版图必须先转成 numpy 数组,因为 wordcloud 内部是按像素矩阵来算的,它不认 PIL 的图片对象。第二,蒙版的规则是「白色的地方不画词,深色的地方画词」。所以你做蒙版的时候,想要词出现的地方要涂黑(或者深色),不想要的地方留白。

资源里用的是一个黑色的剪影做蒙版。你可以自己用画图工具做一张:白底,然后在中间画一个纯黑的形状,存成 PNG。形状可以是心形、动物、logo 轮廓、地图轮廓,随便你。但要注意几点:蒙版图不能太大,几百像素见方就够,太大会让生成速度慢到怀疑人生;蒙版最好是灰度图或者 RGB 图,带 alpha 通道的图有时候会出问题;形状内部的空白区域不要太细,词塞不进去会挤成一团。

4.5 上颜色:从蒙版取色和自定义配色

形状有了,接下来是颜色。案例 05 和 06 讲了两种完全不同的上色思路。

第一种是从蒙版图里取色。你那张蒙版图本身是有颜色的,wordcloud 可以把每个词放在它所在位置的颜色上,这样出来的词云颜色和原图自然融合:

from wordcloud import ImageColorGenerator # 根据蒙版图的颜色生成配色器 image_colors = ImageColorGenerator(mask) # 生成词云之后,用配色器重新上色 wc.recolor(color_func=image_colors)

注意recolor是在generate之后调用的,顺序别搞反。这种方式的优点是省事,颜色自动和底图协调,缺点是颜色受限于蒙版图,你想改颜色就得回去改图。

第二种是自己写一个颜色函数。案例 06 的做法是定义一个random_color,wordcloud 每画一个词就调用它一次,问它「这个词用什么颜色」:

import random def random_color(word, font_size, position, orientation, font_path, random_state): # hsl 三个参数:色相、饱和度、亮度 # 这里固定色相为 0,饱和度和亮度在 60% 到 80% 之间随机 s = 'hsl(0, %d%%, %d%%)' % (random.randint(60, 80), random.randint(60, 80)) return s wc = WordCloud( color_func=random_color, # 把函数交给它 mask=mask, font_path='simhei.ttf', background_color=None, mode='RGBA' ).generate(text)

这个函数的六个参数是 wordcloud 传进来的:当前词、字号、位置、方向、字体路径、随机状态。你实际用到的通常只有前几个,后面几个是给需要精细控制的场景准备的。返回值必须是一个颜色字符串,hsl(...)、rgb(...)、十六进制#FF0000都行。

hsl(0, 70%, 70%)里的三个数字分别是色相、饱和度、亮度。色相 0 是红色,120 是绿色,240 是蓝色。固定色相、只让饱和度和亮度随机,出来的是同一色系的深浅变化,看起来会很协调。如果你全随机,出来会像个调色盘,很花。

注意:颜色函数每画一个词就会调用一次,如果你的词有几千个,这个函数会被调用几千次。所以别在里面写耗时的操作,也别在里面print太多东西,不然终端会被刷爆。

4.6 把词的大小握在手里:关键词和权重

前面所有的例子,词的大小都是 wordcloud 自己算的——它数每个词出现多少次,出现多的就大。但有时候你不想按出现次数来,你想按「重要性」来。比如一篇小说里「悟空」出现了一千次,「师父」只出现了一百次,但你觉得「师父」更关键,想让它更大。这种时候就用案例 07 的方法:自己算权重,直接喂给词云。

import jieba.analyse with open('novel.txt', 'r', encoding='utf-8') as f: text = f.read() # 提取前 200 个关键词,withWeight=True 表示同时返回权重 freq = jieba.analyse.extract_tags(text, topK=200, withWeight=True) print(freq[:20]) # 看看前 20 个长什么样 # 返回的格式是 [(词, 权重), ...],转成字典才能用 freq = {i[0]: i[1] for i in freq} # 注意这里是 generate_from_frequencies,不是 generate wc = WordCloud( mask=mask, font_path='simhei.ttf', background_color=None, mode='RGBA' ).generate_from_frequencies(freq)

三个地方值得说。

extract_tags是 jieba 自带的关键词提取功能。topK=200表示只要前 200 个词,withWeight=True表示除了词本身,还返回一个权重分数。这个权重的算法是 TF-IDF 那一套,大意是「一个词在这篇文章里出现得多,但在所有文章里出现得少,它就越有代表性」。你不用深究公式,知道它给的是「重要性」而不是「频次」就行。

返回的freq是列表,每一项是个元组,比如('悟空', 0.8)。但 wordcloud 要的是字典,所以要用字典推导式转换一下,i[0]是词,i[1]是权重。

最关键的一点:generate变成了generate_from_frequencies。前者接收原始文本,自己分词自己统计;后者接收一个「词→权重」的字典,直接按你给的数据画。用后者就不能再传原始文本了,两者是并列的两种入口。

用generate_from_frequencies的好处是,你可以完全控制每个词的大小。权重可以是词频、可以是 TF-IDF 分数、可以是你自己打的分、甚至可以是从别的地方导入的数据。这也是词云真正变成「分析工具」而不是「玩具」的地方。

5. 新手最容易翻车的五个坑:现象、原因和解决办法

5.1 坑一:中文全是方块或者乱码

现象:代码跑通了,图也出来了,但上面全是「□□□」,或者是一堆看不懂的符号,一个汉字都没有。

原因:九成是没设font_path,或者设了但路径不对。wordcloud 默认用的是西文字体,里面没有汉字字形,渲染的时候只能用方块占位。还有一种可能是文本文件本身的编码不是 UTF-8,读进来的时候就已经乱码了,那后面再怎么处理都是乱的。

解决:先确认WordCloud()里有没有写font_path='你的字体文件.ttf'。再确认这个路径真的能找到文件——可以把路径拷到文件管理器里试一下。如果路径没问题还是方块,检查读文件那行有没有encoding='utf-8',如果没有,加上再试。实在不确定文本编码,可以用编辑器打开文件另存为 UTF-8。

5.2 坑二:文件找不到,报 FileNotFoundError

现象:运行代码,终端里红字一片,最后写着FileNotFoundError: [Errno 2] No such file or directory: 'xxx.txt'。

原因:这是新手出错频率最高的一类问题,几乎全是相对路径搞错了。代码里写的'text.txt'是相对路径,它相对于「你运行代码时所在的那个目录」,而不是「代码文件所在的目录」。这两者在编辑器里经常不是一回事。资源里大量使用'../xyj.txt'这种写法,那个..表示上一级目录,如果你的文件夹结构和作者不一样,这个路径就是错的。

解决:最稳的办法是把文本文件和代码文件放在同一个文件夹里,然后路径只写文件名,不加任何目录前缀。如果还不行,先打印一下当前工作目录:import os; print(os.getcwd()),看看程序到底在哪找文件,再把文件放到那个地方去,或者把路径改成绝对路径。

5.3 坑三:生成的图一片空白,或者只有寥寥几个词

现象:程序没报错,图也保存了,但打开一看几乎是白的,只有角落里有几个小词,甚至完全空白。

原因:可能性有几种。一是文本太短,或者全是重复内容,可用的词太少。二是蒙版图设得不对,词的可用区域被压缩到极小。三是分词之后没有用空格连接,整段被当成一个词,结果只能画出一个巨大的词或者什么都画不出。四是背景色和字体颜色撞了,比如白底白字,看着就像空白。

解决:先在代码里加一行print(len(text))和print(text[:200]),确认文本真的读进来了、分词真的做了。如果是蒙版的问题,先把mask参数去掉,看能不能正常出图,能出就说明是蒙版的问题。如果是颜色问题,把background_color改成'white'试试。

5.4 坑四:满屏都是「的、了、是、我们」

现象:词云出来了,形状颜色都挺好,但最大的几个词全是「的」「了」「是」「我们」「这个」这种毫无信息量的词,真正想看的词被挤到角落里。

原因:没有做停用词过滤。这些词在任何一段中文里出现频率都极高,但它们不携带任何信息。你不主动把它们排除掉,它们一定会霸占最大的位置。这不是 bug,是词云的默认行为——它只认频率,不认意义。

解决:wordcloud 有个stopwords参数,可以传一个集合进去,里面的词会被直接跳过:

stopwords = {'的', '了', '是', '我们', '这个', '一个', '和', '在'} wc = WordCloud(stopwords=stopwords, font_path='simhei.ttf', ...)

停用词表可以自己一条条加,也可以在网上找现成的中文停用词表,读进来转成集合。我自己的习惯是先跑一遍不加停用词的,看看哪些词冒出来最烦人,再把它们一个个加进去,迭代两三轮就干净了。

5.5 坑五:蒙版形状不对,或者直接报错

现象:设了mask参数,结果图还是矩形,或者形状完全不对,或者程序直接抛出一个和数组维度相关的异常。

原因:蒙版的读取方式不对。wordcloud 要的是 numpy 数组,如果你直接传一个 PIL 图片对象进去,它处理不了。另外蒙版的颜色规则是「白色不画词、深色画词」,很多人拿了一张白底黑字的图当蒙版,结果词全挤在字里面,看着像没生效。还有一种情况是蒙版图太大,几千像素见方,生成速度慢到以为程序卡死了。

解决:确认写了mask = np.array(Image.open('mask.png')),两步都不能少。确认蒙版是「想要词的地方是深色,不想要的地方是白色」。把蒙版缩到 500 到 800 像素见方,既快又够用。

6. 从「能跑通」到「能用在项目里」:下一步该学什么

跑完这七个案例,你已经能做出形状、颜色、权重都可控的词云了。接下来的问题是:怎么让它真正变成你的能力,而不是七段跑过就忘的代码。

我的建议是按这个顺序往下走。

第一站,把停用词和自定义词典用熟。这两个东西听起来不起眼,但它们决定了你的词云是「能看」还是「有用」。停用词决定你排除什么,自定义词典决定你保住什么。比如做一份产品评论的词云,「续航」「快充」这种词很容易被 jieba 切碎成「续」「航」,加进自定义词典就能保住它们。这一步练熟了,你的词云质量会明显上一个台阶。

第二站,把generate_from_frequencies用起来。前面说过,这个入口让你完全控制每个词的大小。你可以先用别的办法算权重——词频、TF-IDF、甚至是情感分析的得分——再喂给它。到这一步,词云就不再是「把文本丢进去出张图」,而是「我有了结论,用图表达出来」。

第三站,换个输出场景。词云能存成 PNG,就意味着它能进 PPT、进网页、进报告。试试把背景设成透明,把图贴到一张有底色的幻灯片上;试试调整width和height,做出适合手机屏的长图;试试把max_words调小,只留最关键的几十个词,让图更干净。这些参数改起来很快,但效果差别很大。

阶段该练什么练成的标志
入门跑通七个案例能独立生成一张中文词云
熟练停用词 + 自定义词典图里没有废话词,专有名词不被切碎
进阶自己算权重能按重要性而不是频率出图
应用调尺寸、透明度、词数图能直接放进汇报材料里

再说一个具体技巧:别一次调一个参数。新手常见的做法是改一下width,跑一次;改一下font_path,跑一次;改一下颜色,跑一次。这样调一下午也调不出满意的。正确做法是先固定形状和字体,把词的内容调干净,最后再调颜色和尺寸。顺序反了,你会一直在细枝末节上打转。

最后说个我自己的教训。我刚开始做词云那阵子,最常干的事就是代码跑通了、图出来了,看一眼觉得「还行」,然后就关掉去干别的了。结果过两周再做,发现自己连font_path该写在哪都忘了,又得从头翻代码。后来我给自己定了个规矩:每做完一个例子,必须把「这段代码解决了什么问题、改了哪几个参数、下次遇到类似需求怎么改」这三句话写在代码文件的顶部注释里。写不了这三句,说明我其实没搞懂,只是碰巧跑通了。从那以后我每次做完一个词云,都强制走一遍这个流程,翻车次数少了很多。

希望这些能帮你少绕几个弯,早点做出第一张自己想贴在报告里的词云。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询