尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Python中文文本分析期末作业:jieba分词到词云可视化完整实践

发布时间:2026/9/26 1:57:36

资讯中心
01
ARTICLE

Python中文文本分析期末作业:jieba分词到词云可视化完整实践

Python中文文本分析期末作业:jieba分词到词云可视化完整实践
简介一份面向Python学习者与文本分析初学者的期末大作业完整工程以《三国演义》为语料完整演示中文文本分析全流程运用jieba分词与词频统计、wordcloud词云绘制、networkx人物社交关系建模、章节字数统计等模块覆盖从文本读取、清洗、词频统计到可视化呈现的典型方法。压缩包共有13个文件总大小约406.57MB内含可直接阅读的课程报告docx/pdf、完整Python源码、无需Python环境即可运行的exe程序以及png图片和HTML交互式图表等可视化结果结构清晰便于对照学习或直接扩展改造。目前已有6645人学习并下载使用。借助该工程学习者可以掌握中文分词与停用词处理、高频词提取、人物关系网络构建、数据可视化等关键实操技能也可作为课程设计或毕业设计的完整参考具有较强的复用价值。1. Python中文文本分析期末大作业这份项目包把分词到可视化整条链路都给你备齐了期末季总有人卡在同一个地方——数据爬下来了词也存好了但交上去的 Python 中文文本分析作业一眼就能看出是凑数的没有词频表格、没有可视化图表、结论全靠瞎猜。这份资源包是一份完整的期末大作业项目从文本加载、jieba 分词、停用词过滤到词云绘制和柱状图展示整条链路都是跑通的。对零基础的人来说照着里面的目录结构和脚本改数据就能出结果对已经写过爬虫但没做过文本分析的人来说这个包能帮你补上数据可视化这块最短的板。资源本身就按「数据输入 → 分词处理 → 统计输出 → 图表呈现」组织好了你要做的只是替换成自己的文本。2. 工程结构与环境选型为什么是 Python 3.8 加这几个库2.1 项目包里的文件分工先说清楚每个文件是干嘛的拿到压缩包解压后你会看到典型的期末大作业工程布局。这类结构不是我编的是这类项目最常见的组织方式project_root/ ├── data/ │ ├── raw/ # 原始文本比如爬来的评论或新闻 │ └── processed/ # 清洗后的分词结果、词频表 ├── src/ │ ├── segment.py # 分词与词频统计主脚本 │ ├── visualize.py # 词云与柱状图脚本 │ └── utils.py # 停用词加载、文本清洗等公共函数 ├── output/ │ ├── wordcloud.png │ ├── top20_words.csv │ └── 词频统计图.html └── 报告模板.mddata/raw 是你放原始文本的地方格式一般是 txt 或 csv。processed 是脚本自动生成的中间产物不建议手改。src 下面三个 py 文件是核心segment.py 负责把文本切成词并统计次数visualize.py 负责把统计结果画成图utils.py 放的是会被前两个脚本反复调用的函数比如读取停用词表、清理文本里的数字和特殊符号。这份资源对新手最友好的地方是输入输出都很明确你把文本丢进 data/raw跑到最后 output 里出图出表中间过程不需要调参。但如果你想换成自己的数据需要先搞清楚每个文件依赖的输入格式否则会跑不通。2.2 核心库选型为什么用 jieba 而不是 HanLP 或 THULAC中文文本分析第一步是分词全包方案常见的有 jieba、HanLP、THULAC、pkuseg 四个。期末大作业场景下我推荐 jieba理由很实际安装简单、依赖少、吃内存小而且词性标注和关键词提取都内置了。HanLP 功能更强但模型文件大部分功能还需要配 Java 环境pkuseg 分词准确率不错可对新手来说光是把模型下对就要折腾一阵。处理这个资源包时我的建议是直接按 requirements.txt 装依赖核心就这几个库pip install jieba0.42.1 pandas1.5.3 matplotlib3.7.1 wordcloud1.9.2版本号不用完全锁死但需要注意Python 3.11 以上装 wordcloud 需要下预编译的 whl 包直接用 pip 装容易编译失败。我自己在 Python 3.8 到 3.10 上都跑过这套组合没有出过问题。如果你用的是 3.11 或 3.12装 wordcloud 的时候建议加一句pip install wordcloud --only-binary :all:这句的意思是让 pip 只安装预编译好的二进制包不要现场编译能躲开大多数编译报错。pandas 在这个项目里的角色是管数据读 csv、做词频排序、导出结果都比用纯 Python 的字典加 sorted 方便一个量级。matplotlib 负责出图wordcloud 负责词云。这几个库加起来就是完整的可视化链路后面章节会逐一展开。3. 分词与词频统计从原始文本到结构化表3.1 jieba 三种分词模式与停用词过滤的组合用法分词是所有统计的前提jieba 支持精确模式、全模式和搜索引擎模式。期末大作业场景下用精确模式就够了jieba.cut 默认走的就是它它会按最合理的方式把句子切开比如「中华人民共和国」会切成一个完整词而不是拆成「中华」「人民」「共和国」三个。全模式会把所有可能的词都切出来适合做召回不适合做统计。搜索引擎模式是在精确模式基础上对长词再切一次适合搜索引擎场景做词频统计反而会引入噪音。这里贴一段 segment.py 里最核心的处理逻辑这个脚本会把原始文本变成词频表import jieba import pandas as pd import re from collections import Counter def load_stopwords(pathdata/stopwords.txt): # 读停用词表每行一个词支持 txt 和 csv with open(path, r, encodingutf-8) as f: return set(line.strip() for line in f) def clean_text(text): # 去数字、去英文字母、去空白符保留中文 text re.sub(r[0-9a-zA-Z], , text) text re.sub(r\s, , text) return text def segment_and_count(filepath, stopwords_path): # 第一步逐行读入原始文本并清洗 stopwords load_stopwords(stopwords_path) counter Counter() with open(filepath, r, encodingutf-8) as f: for line in f: line clean_text(line.strip()) if not line: continue # 第二步精确模式分词 words jieba.lcut(line) # 第三步过滤停用词、单字和标点 for w in words: if w in stopwords: continue if len(w) 2: continue counter[w] 1 # 第四步转成 DataFrame 并排序保留前 50 df pd.DataFrame(counter.items(), columns[word, count]) df df.sort_values(count, ascendingFalse).head(50) return df if __name__ __main__: df segment_and_count(data/raw/comments.txt, data/stopwords.txt) df.to_csv(data/processed/top50_words.csv, indexFalse, encodingutf-8-sig)代码逻辑分四步先清洗文本把数字、英文和空白全去掉确保统计对象只有中文然后拿 jieba.lcut 做精确切分返回的是一个词列表接着用停用词集合过滤掉「的」「了」「是」这类没有分析价值的虚词同时把单字词也丢掉最后用 Counter 累加次数转成 DataFrame 排序输出前 50 个高频词到 CSV。这里有个参数值得注意encodingutf-8-sig 比 utf-8 更稳因为 utf-8-sig 写入时会带 BOM 头Excel 打开 CSV 不会乱码。如果你以后要把词频表发给同学用 Excel 打开用 utf-8-sig 是血泪经验换来的习惯。3.2 用 TF-IDF 提取关键词别只盯着词频词频统计有个天然短板——「电影」「好看」这种在评论里反复出现的词会霸榜但它们不一定能代表文本主题。更专业的做法是算 TF-IDF核心思路是一个词在一篇文章里出现得多但在整个语料里很少出现那它才是这篇文章的关键词。jieba 内置了 TF-IDF 实现不需要额外装 sklearn。import jieba.analyse def extract_keywords(filepath, topK20): # 读取全文一次性交给 TF-IDF 提取 with open(filepath, r, encodingutf-8) as f: text f.read() # topK 控制返回个数withWeight 决定是否返回权重 keywords jieba.analyse.extract_tags( text, topKtopK, withWeightTrue, allowPOS(ns, n, vn, v, a) ) for kw, weight in keywords: print(f{kw}\t{weight:.4f})allowPOS 是词性过滤参数我只保留了地名、名词、动名词、动词和形容词这样专有名词和核心动词会优先被选出来。权重是归一化后的 TF-IDF 值用在报告里可以直接量化比较。需要注意TF-IDF 提取结果和词频统计结果常常差异很大期末报告里建议两个都放一个是基础统计一个是特征提取这样答辩时能解释的角度多一个。分词这一步做扎实了后面可视化才有意义。如果分词结果里全是「的」「了」「吗」画出来的词云和柱状图基本没法看所以停用词表的质量直接决定成品质量。资源包里附带了一份约 1200 词的通用停用词表但它不一定覆盖你的领域建议自己补充一些专属词。4. 数据可视化词云、柱状图和折线图的正确打开方式4.1 词云绘制字体路径是中文词云唯一的坑词云是文本分析作业里最出效果的图也是技术含量最容易被低估的部分。wordcloud 这个库本身不复杂但中文词云几乎必然会遇到一个问题默认字体不支持中文字符结果就是词全变成了方框。解决方式只有一个显式指定中文字体路径。from wordcloud import WordCloud import matplotlib.pyplot as plt def draw_wordcloud(csv_path, output_path): # 读词频表转成字典传给 WordCloud import pandas as pd df pd.read_csv(csv_path) freq_dict dict(zip(df[word], df[count])) wc WordCloud( font_pathC:/Windows/Fonts/simhei.ttf, # 黑体必须指定 width1200, height800, background_colorwhite, max_words150, max_font_size150, colormapviridis ) wc.generate_from_frequencies(freq_dict) wc.to_file(output_path)font_path 在 Windows 上一般指向 simhei.ttfMac 上是 /System/Library/Fonts/PingFang.ttcLinux 上要看你装了哪个中文字体。width 和 height 控制画布尺寸期末作业建议 1200×800 起步太小的图打印出来会糊。max_words 控制最多显示多少个词150 是经验值——词太少显得单薄词太多画面会乱。colormap 控制颜色风格viridis 是蓝绿色渐变打印和投影都看得清。generate_from_frequencies 是直接吃词频字典的接口比 generate(text) 更可控因为你已经做过停用词过滤了不会再被虚词污染。词云图放报告首页非常加分但它只能展示分布展示不了趋势所以还需要柱状图和折线图配合。4.2 matplotlib 中文乱码与柱状图画法matplotlib 画中文图同样有字体问题但解决方式比 wordcloud 简单不需要找字体文件路径直接用 rcParams 把默认字体切到中文字体就行。下面这段是把 top10 词频画成横向柱状图的代码横排柱状图在词多的时候比竖排好读词名在左边条形朝右延伸不会出现词被截断。import matplotlib.pyplot as plt import pandas as pd # 全局设置中文字体SimHei 是黑体几乎所有 Windows 都有 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 解决负号显示为方块的问题 def draw_bar(csv_path, output_path): df pd.read_csv(csv_path).head(10) df df.iloc[::-1] # 反转顺序让词频最高的画在最上面 fig, ax plt.subplots(figsize(10, 8)) ax.barh(df[word], df[count], color#2E86AB) ax.set_xlabel(词频次数) ax.set_title(Top10 高频词统计) # 在条形右侧标数字方便答辩时直接读 for i, v in enumerate(df[count]): ax.text(v 0.5, i, str(v), vacenter, fontsize10) plt.tight_layout() plt.savefig(output_path, dpi200)axes.unicode_minus 这个参数是第二个坑不设成 False 的话坐标轴的负号会显示成方块。barh 是横向柱状图函数第一个参数是 y 轴标签第二个是长度数值。figsize 控制图片尺寸10×8 是报告插图的标准比例。dpi200 保证导出图片放大后不糊。savefig 之前最好调用 tight_layout否则标题和标签可能被裁掉。期末报告里柱状图搭配词云是标配但数据可视化里面最容易区分及格和良好了优秀作业往往还会加一张按时间维度的折线图比如把评论按周分组统计词频变化趋势。这时候需要你的原始数据里带有时间字段否则做不了。资源包里有一份示例数据带了日期列可以拿来练手。5. 避坑与排查文本分析作业最容易翻车的五个问题5.1 UnicodeDecodeError读文件读着读着就崩了现象运行 segment.py 时报 UnicodeDecodeError提示 gbk 或 utf-8 编解码失败脚本直接中断。原因中文文本文件最常见的编码是 utf-8 和 gbk 两种Windows 上记事本另存的默认编码是 gbk而代码里指定的读取编码是 utf-8两边对不上就崩。解决读取文件时不要写死编码先尝试 utf-8失败再回退 gbk。我把这段写进 utils.py 里def read_text_safe(path): for enc in [utf-8, gbk, utf-8-sig]: try: with open(path, r, encodingenc) as f: return f.read() except UnicodeDecodeError: continue raise RuntimeError(f无法识别文件编码: {path})从这以后我处理任何外部文本都走这个函数不再手工猜编码。你拿到别人的数据时编码不可见这是最常见的翻车点。5.2 词云全是方框font_path 参数没生效现象词云图生成成功图片能打开但所有的词都显示成方块或问号。原因wordcloud 默认字体是 DroidSansMono不支持中文。即便你代码里写了 font_path但如果路径写错wordcloud 不会报错而是静默使用默认字体输出一张全方块的图。解决先确认字体文件存在再在代码里硬编码路径。我一般会在脚本开头打印一下字体路径是否存在import os assert os.path.exists(font_path), f字体文件不存在: {font_path}这个断言能让问题在生成图片之前暴露出来而不是等图片出来了才发现。5.3 jieba 把关键专有名词切碎了现象「深度学习」被切成「深度」「学习」「健康码」被切成「健康」「码」。词频榜上这些碎片很长一段时间内都有一定频次但实际价值极低。原因jieba 的默认词典是通用的没有你这份语料里的领域词和专有名词。通用词典切不好专业词是已知缺陷不是配置错误。解决加载自定义词典把领域词一次性告诉 jieba。这个方法成本最低import jieba # 每行格式词 词频 词性词频越高越倾向于整体保留 jieba.load_userdict(data/userdict.txt) jieba.add_word(健康码, freq200, tagn)我在 userdict.txt 里写过约 50 个课程相关的专有名词再跑一遍分词之前被切碎的词就都保留了整词形态。freq 参数建议给 100 到 500 之间太小不起作用太大影响整体粒度。5.4 词频榜首被数字和英文霸占现象统计完词频排在前面的是「2022」「Coronavirus」「GDP」这类词中文词被挤到后面图没法直接用于报告。原因原始文本里有大量中英混排内容清洗函数只处理了纯数字和纯英文但像「2022年」这种中英数字混合的字符串被拆成了碎片。解决在 clean_text 里加强规则连续分词时把含数字的邻接词也干掉了。注意这个方法牺牲掉了一部分英文词但你做中文文本分析丢掉英文词对结论基本无影响。def clean_text(text): # 先把所有数字和英文统一替换为占位符再删除 text re.sub(r[0-9a-zA-Z], , text) # 去掉孤立标点保留中文句读 text re.sub(r[^\u4e00-\u9fa5。、\n], , text) return text5.5 程序跑得慢内存被停用词过滤拖垮了现象文本量一大segment.py 要跑几分钟甚至十几分钟CPU 占用却只有单核感觉像卡死了。原因常见写法是 for 循环里逐词去查停用词表停用词量一大就会反复遍历。更隐蔽的问题是读入文本后没有按行增量处理一次性把整个文件塞进内存。解决改成逐行读取逐行处理同时把停用词表换成集合类型。set 的查找时间复杂度是 O(1)列表是 O(n)数据量大时这个差距是数量级的。上面的 3.1 代码已经用了这两种方式逐行读文件停用词存 set。如果你拿到的是超大语料还可以加一行 jieba 初始化时关闭并行jieba.enable_parallel(4) # 多进程分词适合多核机器注意 enable_parallel 只支持 Python 3.8 及以下版本3.9 会报错这属于老代码的遗留限制不是必经步骤。6. 把结论写进报告用情感分析和趋势图让作业上一个台阶期末大作业拿到及格分不难但想拿优秀通常需要在基础词频和可视化之外加一层分析维度。两个性价比最高的加分方向是情感分析和按时间维度的趋势图。情感分析不需要你理解复杂算法snownlp 库已经封装好了一行代码就能出情感值。趋势图则依赖数据里带时间字段如果你的原始数据没有日期列可以用文本里包含的时间词做近似分组。snownlp 的用法很简单。先把整篇文本按句切分逐句做情感判断最后取平均值这样比直接对全文算更准确——因为中文一句话里经常同时出现积极词和消极词整段算会把它们抵消掉。from snownlp import SnowNLP def sentiment_analysis(text): # 按句号拆句逐句计算情感值 sentences [s for s in text.split(。) if len(s) 5] scores [SnowNLP(s).sentiments for s in sentences] # 均值大于 0.6 判定为正向小于 0.4 判定为负向 avg_score sum(scores) / len(scores) if scores else 0.5 return avg_score, scoressentiments 返回的是 0 到 1 之间的概率值越接近 1 越积极。期末报告里可以这么写对 1200 条评论逐条计算情感值平均分 0.62其中正面评价占比 68%再结合高频词里的「方便」「快捷」可以进一步佐证用户整体满意。这就把分词的统计结果和情感分析的结论串起来了答辩的时候有数据有结论有逻辑比干贴图好看得多。另一个加分项是趋势折线图如果你的数据有时间字段按周统计词频后画一条折线能说明某个主题的讨论热度变化。我当时做的是把评论按周分桶统计每周「排队」这个词的出现次数最后画出明显的峰值曲线。这个图的技术含量不高但展现的思路是「我不只会统计还会从时间维度观察现象」这在期末作业里非常区分度。最后说一点我自己的习惯。每次拿到新的文本数据我都会强制走一遍固定流程先跑分词看 top20 词人工扫一眼有没有切碎或被噪音污染的词修完自定义词典再跑一遍确认词频表干净了才画图出表。这套流程多花不了几分钟但能让你交出去的每一张图都不带硬伤。希望这份项目包能帮你少踩几个我当年踩过的坑把时间花在真正能加分的情感分析和结论提炼上而不是耗在编码和字体上。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。