
简介面向文本挖掘与数据可视化初学者及中级 Python 用户的词云实战教程围绕个性化词云生成流程展开帮助解决中文文本可视化、关键词呈现与报告演示中的落地问题。压缩包含 1 个 PDF大小约 2.07MB内容按概念、库用法、环境配置与 7 个案例组织从最简调用、中文不分词与分词处理延伸到蒙版形状、自定义配色、关键词及权重提取等进阶做法并配有代码示例与运行结果。已有 109 人学习适合在项目报告、数据分析、社交媒体监控或教学场景中按案例复现读者可掌握 wordcloud 与 matplotlib 的配合方式理解文本预处理、权重计算、词云生成及保存展示的完整链路也能参考教程给出的环境版本快速上手。1. 需求切入从一段文本到一张能交作业的词云图要把一段中文文本变成能放进报告里的词云图很多人的第一反应是找一份 Python 词云完整教程最好带 7 个案例能直接照着跑。作为一份 python 课程资源这套材料最有价值的地方不是“生成一张图”四个字而是把最简调用、中文不分词、中文分词、蒙版形状、蒙版颜色、自定义颜色函数、关键词权重七个台阶排成了一条可复现的路线。词云看着像视觉活实际是文本预处理和参数控制的活字体路径错一个字符中文全变方块分词少一个空格词频统计直接失真蒙版背景不是纯白形状就变成一块矩形。这份方案适合需要交课程设计、做数据分析报告、给社团活动做展示的人也适合想快速摸清 wordcloud 参数的开发者。后面按环境基线、案例递进、关键实现、避坑排查、验收答辩展开。2. 环境与依赖设计Python 3.7 与 wordcloud 1.9.3 的复现基线词云项目的第一个交付物不是图片而是一套别人能复现的环境。课程资源里最容易省掉的就是版本说明结果同一段代码在别人机器上跑出方块字、报 PIL 兼容错误或者 jieba 分词结果跟演示图对不上。这套教程给的是 Python 3.7、wordcloud 1.9.3、matplotlib 3.5.3、PyCharm 编辑器版本不算新但组合稳定适合做课程设计底稿。我一般会把版本写进requirements.txt再配一个最小冒烟脚本先确认环境能出图再谈蒙版和配色。2.1 版本基线与目录结构先把目录定下来后面七个案例都往同一个结构里放避免代码里到处出现../猜路径。建议按“数据、字体、蒙版、输出、脚本”分开放路径少一层调试时少一堆 FileNotFoundError。目录/文件用途设计说明data/存放constitution.txt、xyj.txt等文本文本统一 UTF-8避免 Windows 默认编码干扰fonts/存放中文字体文件文件名为英文路径不用中文和空格masks/存放black_mask.png、color_mask.png形状蒙版和颜色蒙版分开放output/存放生成的 png每次运行覆盖同名文件答辩时好找cases/七个案例脚本一个案例一个文件方便对照requirements.txt版本锁定只写直接依赖不锁死间接依赖版本基线建议这样理解Python 3.7 是教程给出的运行环境不是唯一选择wordcloud 1.9.3 和 matplotlib 3.5.3 是这套案例验证过的组合。新手最容易踩的坑是只装 wordcloud 不装 pillow 和 numpy结果蒙版案例一跑就报模块缺失。jieba 负责中文分词和关键词权重Pillow 负责读蒙版图numpy 负责把图片转成数组四个依赖要一起装。2.2 安装命令与最小冒烟测试安装不用追求最新版先按教程版本走。虚拟环境能少污染系统 PythonPyCharm 里新建项目时直接把解释器指到venv就行。# 在项目根目录创建虚拟环境 python -m venv venv # macOS / Linux 激活 source venv/bin/activate # Windows 激活 # venv\Scripts\activate # 按教程版本安装核心依赖 pip install wordcloud1.9.3 matplotlib3.5.3 jieba pillow numpy这段命令的逻辑是先隔离环境再装词云、绘图、分词、图像读取和数组处理五个依赖。wordcloud1.9.3固定版本避免新版参数行为差异matplotlib3.5.3跟教程展示代码一致jieba不锁小版本中文分词接口稳定pillow和numpy不写版本让 pip 按 Python 3.7 选兼容版本。安装完不要急着跑七个案例先做一个最小冒烟测试。# smoke_test.py # 最小验证不读文件、不用中文、不设蒙版只确认 wordcloud 能出图 from wordcloud import WordCloud wc WordCloud(width400, height200, background_colorwhite) wc.generate(python word cloud smoke test) wc.to_file(output/smoke.png) print(smoke ok)这段代码只做一件事用英文短语生成一张小图。width和height控制画布尺寸background_color设白色背景generate接收原始文本to_file输出 png。跑通后看output/smoke.png是否存在存在就说明 wordcloud、Pillow、numpy 的链路通了。如果这一步就报错先别改中文参数回头查依赖安装顺序和 Python 解释器是不是 PyCharm 当前选中的那个。提示PyCharm 里经常出现“终端装好了、运行还是 ModuleNotFoundError”多半是项目解释器和终端虚拟环境不是同一个先看右下角解释器路径。2.3 参数默认值与第一次改参的顺序wordcloud 的参数很多第一次改参不要从颜色函数开始先把“能不能出词、词大不大、中文显不显示”三件事控制住。下面这几个参数是七个案例里复用频率最高的。参数作用建议起始值注意点font_path指定中文字体项目内fonts/下的 ttf不设中文变方块width/height画布宽高800 / 600有 mask 时以蒙版尺寸为主background_color背景色white或None透明背景要配modeRGBAmax_words最多显示词数200太多会挤太少会空max_font_size最大字号不设或 120设太小会压不住重点词relative_scaling词频与字号关联度0.5 左右调大更强调高频词prefer_horizontal水平词比例0.9中文竖排阅读体验差尽量高mask形状蒙版数组np.array(Image.open(...))背景要纯白形状区非白第一次改参的顺序我一般这样走先固定font_path再调width/height然后加max_words最后才动relative_scaling和颜色。因为字体错是硬错误尺寸错是布局问题词数错是信息密度问题颜色只是表现层。顺序反过来出了方块字还以为是配色函数写坏了排查成本翻倍。3. 七个案例的递进设计从最简调用到关键词权重七个案例不是七个孤立 demo而是一条从“能出图”到“可控出图”的路线。案例 01 只验证库调用案例 02 用中文不分词做对照让人看到不分词的后果案例 03 引入 jieba把中文文本切成词案例 04 到 06 逐层加蒙版形状、蒙版颜色、自定义颜色函数案例 07 用jieba.analyse.extract_tags提取关键词和权重再走generate_from_frequencies。这条路线的好处是每一层只增加一个变量答辩时被问“为什么这个词大”能顺着案例讲清楚。3.1 案例分组与依赖边界先看七个案例各自解决什么问题避免一上来就堆蒙版和颜色结果连基础词频都没跑通。案例核心能力新增依赖/参数适用场景01 最简调用英文文本生成词云WordCloud().generate第一次验证环境02 中文不分词展示不分词效果font_path、mode、background_color教学对照不作为生产方案03 中文分词jieba 切词后生成jieba.cut、 .join中文报告、课程设计04 蒙版形状用图片轮廓限制词云形状mask、Pillow、numpy活动海报、品牌图形05 蒙版颜色从蒙版图取色ImageColorGenerator需要跟主视觉配色一致06 自定义颜色函数自己控制颜色分布color_func需要固定色系或随机色07 关键词权重用关键词权重替代纯词频jieba.analyse.extract_tags文本挖掘、主题分析这张表建议直接放进课程设计的需求说明里。案例 02 容易被误解成“中文也能跑”其实它只是把不分词的文本丢给 WordCloud默认按空格和正则切分中文长句很容易被当成一个大块词云看着有字但频率信息已经失真。案例 03 才是中文场景的起点。3.2 案例 01 到 03先跑通再做中文对照案例 01 的代码最短价值在于把“读文本、生成对象、显示、保存”四步拆开。很多教程把显示和保存混在一起出图失败时分不清是生成失败还是保存失败。# case01_minimal.py # 最简调用英文文本不设字体不设蒙版 from wordcloud import WordCloud import matplotlib.pyplot as plt # 读取同目录下的文本确保文件编码为 UTF-8 text open(data/constitution.txt, encodingutf-8).read() # 生成词云对象先用默认参数 wc WordCloud().generate(text) # 显示bilinear 让缩放更平滑axis off 去掉坐标轴 plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() # 保存到 output 目录方便答辩时直接拿图 wc.to_file(output/case01_wordcloud.png)这段代码的逻辑是“读、生成、显示、保存”。WordCloud()不传参数时用默认画布和默认字体适合英文generate(text)内部会做分词和词频统计plt.imshow只负责展示wc.to_file才是落盘。参数上先不用调跑通后看输出图里单词大小是否跟词频大致对应如果全是小词再考虑调max_font_size或relative_scaling。案例 02 用中文文本但不做分词只加字体和透明背景。它的作用是让人直观看到“中文不分词”长什么样不是让你直接交作业。# case02_chinese_no_segment.py # 中文不分词只加字体和透明背景用来做对照 from wordcloud import WordCloud import matplotlib.pyplot as plt with open(data/xyj.txt, r, encodingutf-8) as f: text f.read() # font_path 必须指向真实存在的中文字体文件 wc WordCloud( font_pathfonts/Hiragino.ttf, width800, height600, modeRGBA, background_colorNone, ).generate(text) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/case02_no_segment.png)这里新增了三个参数font_path解决中文显示modeRGBA支持透明通道background_colorNone让背景透明。注意font_path是硬路径文件不存在会直接报错或回退到默认字体中文就成方块。案例 02 的输出通常会出现大块连续文本或词边界模糊这正是案例 03 要解决的问题。案例 03 引入 jieba把中文长句切成词再用空格拼回去。WordCloud 默认按空格分词所以 .join(jieba.cut(text))这一步不能省。# case03_chinese_segment.py # 中文分词jieba 切词后用空格连接再交给 WordCloud from wordcloud import WordCloud import matplotlib.pyplot as plt import jieba with open(data/xyj.txt, r, encodingutf-8) as f: text f.read() # jieba.cut 返回生成器必须用空格拼成字符串 text .join(jieba.cut(text)) print(text[:100]) # 打印前 100 个字符检查分词是否正常 wc WordCloud( font_pathfonts/Hiragino.ttf, width800, height600, modeRGBA, background_colorNone, ).generate(text) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/case03_segment.png)这段代码的关键是jieba.cut(text)返回的是生成器直接传给 WordCloud 不行必须 .join(...)变成空格分隔的字符串。print(text[:100])是调试手段看一眼前 100 个字符有没有被切成“孙悟空 师徒 取经”这类词块。如果打印出来还是长句说明 jieba 没装好或文本编码不对。参数上jieba.cut默认精确模式课程设计够用要召回更多长词可以换搜索引擎模式但词云会更密建议先精确模式出基线图。3.3 案例 04 到 06蒙版形状、蒙版颜色和自定义颜色蒙版案例是词云从“图”变成“视觉物料”的分水岭也是最容易翻车的地方。案例 04 只加形状案例 05 从蒙版图取色案例 06 自己写颜色函数三层递进每层只多一个变量。# case04_mask_shape.py # 蒙版形状用黑白蒙版限制词云轮廓 from wordcloud import WordCloud from PIL import Image import numpy as np import matplotlib.pyplot as plt import jieba with open(data/xyj.txt, r, encodingutf-8) as f: text f.read() text .join(jieba.cut(text)) # 蒙版图形状区域非白背景纯白转成 numpy 数组 mask np.array(Image.open(masks/black_mask.png)) wc WordCloud( maskmask, font_pathfonts/Hiragino.ttf, modeRGBA, background_colorNone, ).generate(text) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/case04_mask_shape.png)这段代码新增mask参数PIL.Image.open读图np.array转数组。蒙版图的规则通常是要填词的形状区域用黑色或深色背景用纯白WordCloud 会把白色区域当成不填词的背景。如果蒙版背景是浅灰或带渐变形状边缘会糊甚至整张图变成矩形。参数上给了mask后width/height不再主导画布输出尺寸跟蒙版像素相关蒙版太大跑得慢建议先缩到 800 到 1200 像素宽再试。案例 05 在蒙版基础上加ImageColorGenerator从蒙版图里取颜色让词的颜色跟原图主色一致。# case05_mask_color.py # 蒙版颜色从彩色蒙版图中提取颜色 from wordcloud import WordCloud, ImageColorGenerator from PIL import Image import numpy as np import matplotlib.pyplot as plt import jieba with open(data/xyj.txt, r, encodingutf-8) as f: text f.read() text .join(jieba.cut(text)) mask np.array(Image.open(masks/color_mask.png)) wc WordCloud( maskmask, font_pathfonts/Hiragino.ttf, modeRGBA, background_colorNone, ).generate(text) # 从蒙版图生成颜色映射再重着色 image_colors ImageColorGenerator(mask) wc.recolor(color_funcimage_colors) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/case05_mask_color.png)这里的逻辑是先用蒙版生成词云再用ImageColorGenerator(mask)建颜色生成器wc.recolor(color_funcimage_colors)按蒙版对应位置取色。参数上mask同时承担形状和颜色来源所以彩色蒙版不能随便换换图就等于换配色。recolor要在generate之后调用顺序反了不生效。案例 05 的输出通常比案例 04 更接近海报但颜色会受蒙版局部色块影响出现某些词颜色太浅这时才需要案例 06 的自定义颜色函数。案例 06 完全自己控制颜色适合固定色系或做随机但可控的配色。# case06_custom_color.py # 自定义颜色函数返回 hsl 颜色字符串 from wordcloud import WordCloud from PIL import Image import numpy as np import matplotlib.pyplot as plt import random import jieba with open(data/xyj.txt, r, encodingutf-8) as f: text f.read() text .join(jieba.cut(text)) def random_color(word, font_size, position, orientation, font_path, random_state): # 色相固定为 0饱和度和亮度在 60% 到 80% 之间随机 return hsl(0, %d%%, %d%%) % ( random.randint(60, 80), random.randint(60, 80), ) mask np.array(Image.open(masks/color_mask.png)) wc WordCloud( color_funcrandom_color, maskmask, font_pathfonts/Hiragino.ttf, modeRGBA, background_colorNone, ).generate(text) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/case06_custom_color.png)颜色函数的签名必须按word, font_size, position, orientation, font_path, random_state来写返回值要是 matplotlib 能解析的颜色字符串比如hsl(...)、#RRGGBB或英文颜色名。这段代码把色相固定在红色系饱和度和亮度随机适合做单一主色的活动图。参数上random.randint(60, 80)的范围控制颜色深浅调低会更暗调高会更亮如果想让颜色跟词频走可以在函数里用font_size做分支但别写太复杂否则每次生成都像开盲盒。3.4 案例 07关键词权重与generate_from_frequencies案例 07 是整套教程里最像“文本挖掘”的一步。前面案例都是把分词后的文本丢给 WordCloud 让它自己算词频案例 07 先用jieba.analyse.extract_tags提关键词和权重再用generate_from_frequencies按权重生成。# case07_keyword_weight.py # 关键词权重jieba 提词和权重WordCloud 按权重生成 from wordcloud import WordCloud, ImageColorGenerator from PIL import Image import numpy as np import matplotlib.pyplot as plt import jieba.analyse with open(data/xyj.txt, r, encodingutf-8) as f: text f.read() # topK 控制关键词数量withWeightTrue 返回 (词, 权重) freq jieba.analyse.extract_tags(text, topK200, withWeightTrue) print(freq[:20]) # 检查前 20 个关键词和权重 # 转成 WordCloud 需要的字典格式 freq {i[0]: i[1] for i in freq} mask np.array(Image.open(masks/color_mask.png)) wc WordCloud( maskmask, font_pathfonts/Hiragino.ttf, modeRGBA, background_colorNone, ).generate_from_frequencies(freq) image_colors ImageColorGenerator(mask) wc.recolor(color_funcimage_colors) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/case07_keyword_weight.png)这段代码的关键是extract_tags(text, topK200, withWeightTrue)返回列表元素是(词, 权重)必须转成{词: 权重}字典再传给generate_from_frequencies。topK控制关键词数量200 是教程给的起点调小会让图更聚焦调大权重会扁平重点词不突出。withWeightTrue不能省否则只有词没有权重generate_from_frequencies拿不到大小依据。案例 07 适合做主题分析页答辩时能解释“这个词大不是因为出现次数多而是因为 TF-IDF 权重高”比单纯说词频更有说服力。4. 关键实现拆解分词、蒙版、配色与输出参数七个案例跑通后真正决定交付质量的是四个实现点分词和停用词、蒙版和尺寸、颜色函数、输出和展示。这四个点每个都有参数可调也都有失败表现。我的习惯是每个点单独写一个小脚本改一个参数看一次输出不在一张图上同时改五个变量否则出了问题连后悔药都没地方买。4.1 分词与停用词让词云里的词像“词”中文词云最常见的问题不是图不好看而是图上飘着“的、了、在、是”这些高频虚词真正的主角被挤到角落。jieba 只负责切词不负责去停用词停用词表要自己加。# segment_with_stopwords.py # 分词后过滤停用词再拼成空格分隔字符串 import jieba with open(data/xyj.txt, r, encodingutf-8) as f: text f.read() # 停用词按行放实际项目可换成更完整的表 stopwords set() with open(data/stopwords.txt, r, encodingutf-8) as f: for line in f: stopwords.add(line.strip()) words [] for word in jieba.cut(text): word word.strip() # 过滤空串、单字和停用词单字是否保留看场景 if len(word) 1 and word not in stopwords: words.append(word) text .join(words) print(text[:200])这段代码的逻辑是“切词、清洗、拼接”。stopwords用集合查找比列表快len(word) 1过滤单字中文里“的”“了”大多是单字但人名地名也可能是单字课程设计里先过滤单字能明显提升可读性word not in stopwords去掉停用词。参数上停用词表不要用英文表直接套中文也不要把“不”“无”这类否定词随便删掉做情感分析时会改变语义。停用词表建议单独放data/stopwords.txt答辩时能说明“这张图去掉了 30 个停用词”比说“调了参数”更具体。4.2 蒙版与尺寸形状由蒙版决定清晰度由画布决定蒙版不是随便找一张图就能用。WordCloud 把蒙版里白色区域当背景非白区域填词所以蒙版图要先处理成“形状区域深色、背景纯白”。如果原图是透明背景 png读进来 alpha 通道可能让数组变成四通道形状判断会出问题。# prepare_mask.py # 把蒙版统一处理成 RGB 白底图避免透明通道干扰 from PIL import Image import numpy as np img Image.open(masks/source_mask.png).convert(RGB) # 如果背景不是纯白可以按阈值二值化浅色变白深色保留 arr np.array(img) # 亮度大于 240 的像素视为背景统一刷白 brightness arr.mean(axis2) arr[brightness 240] [255, 255, 255] Image.fromarray(arr).save(masks/black_mask.png) print(arr.shape)这段代码先convert(RGB)去掉 alpha 通道再按亮度阈值把浅色背景刷白。arr.mean(axis2)算每个像素三通道平均值brightness 240是经验阈值背景偏灰时调到 220 或 230arr[brightness 240] [255, 255, 255]把背景统一成纯白。输出arr.shape能看到(高, 宽, 3)高宽就是蒙版尺寸。蒙版太大时词云跑得慢建议先缩到 1000 像素宽以内蒙版太小词会挤max_words要相应调低。注意width/height和mask同时给时以蒙版尺寸为主别再手动设画布否则容易出白边。4.3 颜色函数与 ImageColorGenerator配色要可解释颜色这块有两个选择用ImageColorGenerator从蒙版取色或者写color_func自己控制。前者适合“图里有主视觉”的场景后者适合“固定品牌色”或“按词频分色”的场景。两条路不要混着调先选一条跑通。# color_by_frequency.py # 按词频字号分色高频词深色低频词浅色 from wordcloud import WordCloud import matplotlib.pyplot as plt text python data text cloud visual analysis report wc WordCloud(width800, height400, background_colorwhite).generate(text) def color_by_size(word, font_size, position, orientation, font_path, random_state): # font_size 越大颜色越深这里用灰度做演示 gray max(0, 180 - int(font_size * 2)) return rgb(%d, %d, %d) % (gray, gray, gray) wc.recolor(color_funccolor_by_size) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/color_by_frequency.png)这段代码用font_size反推灰度字号越大灰度越低颜色越深。max(0, 180 - int(font_size * 2))防止灰度变负rgb(...)返回 matplotlib 能解析的字符串。参数上font_size是 WordCloud 传进来的字号不是词频但字号通常跟权重正相关拿来做分色够用。recolor要在generate之后调用且color_func签名不能少参数。如果颜色函数返回None或格式不对词会变黑或直接报错这是常见翻车点。4.4 输出与展示to_file和plt.show各管一段展示和保存分开写答辩时少一类“图呢”的问题。plt.show()只在交互环境弹窗wc.to_file()才是落盘。要控制输出分辨率优先调width/height或scale不要指望plt.savefig救场。# output_control.py # 输出控制高分辨率保存展示用低分辨率预览 from wordcloud import WordCloud import matplotlib.pyplot as plt text python word cloud output resolution control wc WordCloud( width1600, height1000, scale2, # 实际输出像素 width*scale, height*scale background_colorwhite, max_words150, ).generate(text) plt.imshow(wc, interpolationbilinear) plt.axis(off) plt.show() wc.to_file(output/high_res.png) print(wc.width, wc.height) # 看实际画布尺寸scale2会把输出像素放大两倍适合打印或放 PPTwidth/height控制基础画布max_words控制信息密度。print(wc.width, wc.height)能看到最终尺寸避免“看着清楚、导出糊了”。参数上scale太大会吃内存1600×1000 再乘 2 已经够课程设计用背景色用white比透明背景更稳透明背景在 Word 里贴图容易变黑底这是很多人答辩前才发现的坑。5. 避坑与排查字体、编码、蒙版和权重的四条高频翻车线词云项目的错误表现很直观方块字、整张图空白、形状不对、颜色全黑。每个现象背后通常只有一个原因按“现象 → 原因 → 解决”排查比盲目改参数快得多。下面四条是这套七个案例里最容易翻车的地方每条都建议在交付前跑一遍。5.1 中文全变方块font_path没指对或字体不支持现象词云能生成但所有中文都是方框英文正常。原因WordCloud 默认字体不含中文字形font_path没传、路径写错、字体文件损坏都会回退到默认字体。路径里带中文或空格时Windows 上还可能被截断。解决把字体文件放进fonts/用相对路径或绝对路径都行先确认文件存在。可以在代码里加一行import os; print(os.path.exists(font_path))。字体选择上教程用Hiragino.ttf你本机没有就换系统里有的中文字体文件不要写一个不存在的文件名硬跑。注意字体文件不要用中文名比如“微软雅黑.ttf”改成msyh.ttf少一层编码问题。5.2 中文词云像一锅粥分词后没加空格现象中文能显示但图上是一大段连续文字或者词边界完全不对词频统计没有意义。原因WordCloud 默认按空格和正则切词jieba.cut(text)返回的是生成器直接传给generate不会自动变成空格分隔字符串。案例 02 就是故意展示不分词的效果不能拿它当生产代码。解决固定写text .join(jieba.cut(text))并在生成前print(text[:100])检查前 100 个字符。如果打印出来是“孙悟空师徒四人”说明没空格是“孙悟空 师徒 四人”才说明分词结果被正确拼接。停用词过滤放在拼接之前顺序别反。5.3 蒙版形状不生效背景不纯白或透明通道干扰现象明明给了蒙版输出还是矩形或者形状边缘被啃掉一块。原因WordCloud 把蒙版白色区域当背景非白区域填词。蒙版背景是浅灰、渐变或透明 png 时数组里没有纯白形状判断就乱了。四通道 RGBA 图直接转数组也可能让 WordCloud 读错通道。解决先用Image.open(...).convert(RGB)去掉 alpha再按亮度阈值把浅色背景刷成纯白参考 4.2 的prepare_mask.py。蒙版尺寸不要太大先缩到 1000 像素宽以内试跑。形状区域用深色背景用纯白别用浅灰背景配深色形状边缘会毛。5.4 关键词权重不生效字典格式或withWeight漏了现象案例 07 跑出来跟案例 03 差不多或者直接报TypeError说权重不是数字。原因jieba.analyse.extract_tags默认返回词列表不加withWeightTrue就没有权重返回的是(词, 权重)元组列表不转成{词: 权重}字典generate_from_frequencies不认。解决固定写freq jieba.analyse.extract_tags(text, topK200, withWeightTrue)然后freq {i[0]: i[1] for i in freq}。生成时用generate_from_frequencies(freq)不要再用generate(text)。topK先 200图太密就降到 100图太空就升到 300但权重会越来越平重点词反而不突出。停用词要在提关键词之前过滤否则“的”可能拿到高权重。6. 验收与答辩用三张图和一份参数表讲清方案词云项目的验收不看“好不好看”这一句主观评价而看能不能复现、能不能解释、能不能替换数据。我一般准备三张图一张基础分词图、一张蒙版形状图、一张关键词权重图。三张图分别对应“文本预处理”“视觉控制”“文本挖掘”三个能力点答辩时按这个顺序讲老师或评审顺着听就知道你不是只跑了一个 demo。6.1 验收清单与答辩讲法验收时先跑一遍环境再看输出文件是否齐全最后用参数表解释每个图的差异。下面这张表可以直接当答辩提纲。验收项检查内容通过标准环境复现Python 3.7、wordcloud 1.9.3、matplotlib 3.5.3 能装最小冒烟脚本能出smoke.png中文显示字体路径存在中文无方块案例 03 图中中文可读分词效果分词后字符串有空格停用词已过滤前 100 字符打印可检查蒙版形状蒙版纯白背景输出非矩形案例 04 轮廓清晰颜色控制ImageColorGenerator或color_func生效案例 05/06 颜色可解释权重生成extract_tags带withWeight字典格式正确案例 07 重点词明显大于普通词输出文件output/下 png 齐全命名清楚答辩时能快速定位答辩讲法上不要从“词云是什么”开始直接从一张图切入“这张图里‘孙悟空’最大是因为它在分词后词频最高这张蒙版图里词沿轮廓分布是因为mask参数把白色背景排除了这张关键词图里‘取经’变大是因为extract_tags给了它更高的 TF-IDF 权重。”三句话分别对应数据、视觉、算法评审再问也跑不出这个范围。如果被问“为什么不用最新版本”就答“教程验证组合是 1.9.3 3.5.3课程设计优先复现稳定不追新”被问“蒙版为什么不用彩色图直接上”就答“彩色图先转 RGB 并刷白背景避免透明通道干扰形状判断”被问“词云有什么局限”就答“它展示频率和权重不展示语法关系所以适合做入口图不适合替代完整文本分析”。这些回答都不需要临场编提前写进备注即可。从那以后我每次交词云方案都强制先跑一遍最小案例再固定字体路径和输出目录最后才动蒙版和颜色。希望帮到你。本文还有配套的精品资源点击获取