2026/10/19 12:34:11

四大名著NLP实战:情感分析与文本挖掘全流程

四大名著NLP实战:情感分析与文本挖掘全流程 我正式接触自然语言处理是在一门文本挖掘课上当时的练习语料是某电商平台的商品评论。数据很规整观点很直白模型跑完也能出个准确率但我心里总觉得少了点意思——真实世界里的中文哪里是那么听话的句子后来我把练习语料整个换掉直接用四大名著做了一轮自然语言处理实战分词、词频统计、情感分析、文风对比一口气把基础动作练扎实了。也是在这个过程里我重新学会了怎么用AI编程助手干活从让它批量生成脚本到把它当成结对编程的搭档效率和踩坑率都让我印象深刻。这篇内容就来完整复盘一次四大名著NLP实战怎么做、AI编程助手怎么用才不坑、以及我为什么越做越觉得自然语言处理有意思。1. 为什么我把四大名著当作NLP入门语料1.1 从影评和商品评论切到古籍补上了我缺的那块拼图刚开始学NLP的时候我接触的几乎都是短平快文本影评、微博、商品评论。这些语料的特征太友好了——句子短、观点明确、情绪词直接堆在表面跑一个简单的词袋模型就能出不错的结果。问题在于一旦换到真实场景比如一本小说、一份报告、一段采访记录这些模型就肉眼可见地失灵。我印象最深的一次是试着分析一段古文分词结果乱七八糟人名被拆得七零八落情感打分更是完全没法看。那时候我意识到问题不在模型而在语料选择——我练手用的文本实在太“规矩”了根本没逼我把中文本身的复杂性当回事。后来我把思路反过来与其找简单的语料证明模型能用不如直接上一份复杂但有解法的语料。四大名著一下就跳进了视野。这套书是半文半白的语言风格既有古典汉语的紧凑又有白话小说的叙事节奏句子长度、词汇密度、情感色彩都比现代短文本复杂得多但又不至于像纯文言文那样让分词工具彻底失效。练手难度刚刚好。1.2 四大名著作为语料的四个天然优势认真做完之后回头看四大名著作为NLP语料有四个优点是普通数据集很难同时具备的。第一个是体量够大。四本书加起来几百万字足够支撑词频统计、文本分类、情感分析这些任务统计结果不会因为样本太少而飘忽不定。清洗之后我还按章回切分出了几百个独立文本文件天然就是一份带标签的语料库。第二个是风格差异极明显。四本书题材各不相同有家族兴衰、有历史战争、有市井江湖、有神魔冒险。各自的语言节奏、用词偏好、情绪密度差异非常大这让我可以拿它们做文风对比甚至做分类实验——只靠词频特征能不能自动判断一段话出自哪本书这种练手方式普通的影评数据集根本给不了。第三个是人物系统极其丰富。光是一套书里有名有姓的人物就有数百个对话、称谓、动作描写缠绕在一起想做命名实体识别、关系抽取、人物情感变化分析数据都现成。而且人物说话风格各有辨识度这为更进阶的角色对话建模提供了很好的素材。第四个是情感走向有肉眼可见的起伏。每本书的情感曲线都不是平的全书整体从展开到高潮再到收束情绪的波峰波谷非常清晰。把情感分析结果画成曲线之后可以直接和情节节点对照验证和解释都会变得特别有意思。1.3 语料准备这一步决定了后续所有分析的质量很多做NLP的人都想着赶紧跑模型结果在语料获取和清洗上栽了跟头后边每一步都跟着错。四大名著是公版文本网上可以找到非常多的纯文本版本但质量参差不齐。我自己整理了一套流程后面做任何中文文本项目都用它。先用脚本把全本按章回切成独立的txt文件每回一个文件。这个动作很关键因为后续按章节做情感曲线、按回目统计词频都得建立在清晰的切分基础上。切分之后统一转成UTF-8编码再把全角标点统一成半角把连续空行压缩成单空行把明显的校注、批注行单独挑出来存进另一个文件以防混入正文影响统计结果。清洗这一步我会做两次。第一次清洗后的文本作为“干净版”专门跑统计类任务保留原始版作为回溯对照。不要图省事直接覆盖原文件——我吃过这个亏后来发现某些回目被脚本切错了想恢复原始内容已经晚了。提示从网上找电子书时优先选带明确版权说明的公开版本再留意文件里的排版字符比如页码、换行符、每行首尾空格这些都会被分词和统计当成噪声。2. 四大名著情感分析的完整跑通过程2.1 工具选型别一上来就上深度学习面对“情感分析”任务很多初学者第一反应是找预训练模型甚至想直接微调一个大模型。我当时的建议是先做一轮传统NLP方案把任务本身吃透再考虑要不要上深度学习。我选的工具链很简单一个中文分词库配合自定义用户词典一个通用停用词表一个基于情感词库的加权打分器再加pandas做数据整理用绘图库画曲线。不用GPU也不用装一堆几十G的依赖普通笔记本就能跑完全程。为什么选这条路线因为情感分析在中文文本上的难点不在于模型够不够大而在于分词准不准、停用词合不合理、否定词怎么处理、人名地名会不会干扰打分。这些问题用传统工具反而看得更清楚。等你把错误原因都摸透了再去看深度学习模型会明白它到底在优化什么。2.2 预处理细节比想象中琐碎但每一步都有理由文本预处理我按四步走每一步都对着后续任务想清楚目的。第一步是按句子切分。我用中英文标点做切分依据把每个章节的长文本切成一句话一个单元。因为后续情感打分是对句子做的整段打分会被长句子里的转折和反讽搅浑切分到句级别才能看清情绪变化。第二步是术语保护。四大名著里人名、地名、官职名密集直接用通用分词很容易被拆成碎片。我把自己整理的人物名单和地名表做成自定义词典让分词器优先把它们当作整体。这里面最经典的坑是人物姓名被拆成单字调整词典前后分词结果的差异肉眼可见。第三步是去停用词但我留了一个心眼把否定词保留下来。很多初学者一把停用词表套上去“不”“没”“无”全被删了结果“不喜欢”变成了“喜欢”情感分析结果直接反转。这个坑必须单独拎出来说处理情感分析时否定词不是停用词。第四步是过滤掉太短的句子和纯标点行。章回标题、回末诗赞这类特殊文本我单独建了一个文件做词频统计的时候会用做情感分析的时候会排除避免它们干扰每个回目的整体情绪。2.3 词频统计、情感打分与结果解读预处理完之后我先把每一回的Token频次跑了出来然后用TF-IDF筛掉那些在每回都出现的高频通用词。这么做的目的是找出能代表该回特色的关键词集合。比如某些战争章节里“军”“城”“兵”会显著上升某些市井章节里“酒”“店”“银子”会冒头。这些关键词变化本身就是一种文本指纹。情感打分我用的是词库加权方案加载一个公开的中文情感词库给每个句子里的情感词标正负极性同时考虑否定词和程度副词。句子的情感分是词汇贡献之和。逐句打完分之后再按章回汇总得到每个回目的平均情感分。画出来的折线图挺有意思。每本书的情感曲线都不是平的有的书前期温度较高中段进入压抑区越往后曲线越阴沉有的书则在高涨和低落之间剧烈摆动几乎每一次大冲突都能在曲线上看到对应的低谷。把这根线对着小说的情节节点看很多段落的手法和情绪铺垫都会变得直观。顺带说说对比实验四本书各取同等长度的片段只基于词频向量算相似度结果同书内的章节距离明显更近跨书的章节距离拉得很开。这个实验很便宜但对理解文本向量化的意义帮助极大。2.4 我在这个环节翻过的车和总结的规矩整套流程我跑了三遍才稳定。第一遍死在编码上Windows环境下默认读GBK结果脚本一读就报错。第二遍死在人名被拆碎情感词表里“宝玉”被当成普通词处理。第三遍终于跑通但抽样检查时发现若干句子的情感分和人类判断相反追下去基本都是否定词被停用词表误删造成的。这也让我总结出三条规矩。第一每跑一步都要打印中间结果直接看分词片段和清洗后的句子而不是一口气跑到底再回头看。第二建立一个小规模的样本集里面包含正向、负向、中性、反讽、否定结构等常见情况每次改完代码先过样本集再跑全量。第三所有统计结果都要抽样人工复核不要盲目相信数字情感分析本身就是个概率判断不是精确计算。注意公开的通用停用词表不一定适合古籍文本使用前先检查表里有没有“不”“没”“别”这类否定词有的话务必针对性剔除或单独处理。3. AI编程助手在项目里的真实用法让代码快起来但不盲从3.1 什么环节最值得交给AI编程助手在NLP项目里真正耗费精力的往往不是算法设计而是大量模板化编程遍历几百个章节文件、清洗文本、统计词频、生成图表。这种活逻辑固定、重复度高、试错成本低最适合交给AI编程助手。我当时的具体分工是这样数据清洗和统计管道让AI生成第一版正则表达式直接让它写绘图代码让它按指定样式输出异常处理让它把常见的几个边界条件都补上。AI最擅长的事就是快速生成“能用”的代码而NLP项目里恰好有大量“能用就行”的环节。但有些东西我坚决不让AI代劳核心算法的选型、结果的分析口径、评价指标的定义。这些东西直接决定项目成不成需要自己理解清楚让AI代写等于把方向盘交了出去。3.2 我把需求拆清楚之后AI才真正好用用AI编程助手最忌讳的是把模糊需求直接丢给它比如“帮我写个情感分析程序”。这句话语义太宽AI只能给一套泛泛的脚手架根本没法直接用。后来我把需求拆成背景、目标、约束、样例四部分效果立刻不一样。拿我当时的实际需求举例。背景是“我在做四大名著情感分析文本已经按章节切分成txt文件每行是一段正文。”目标是“统计每个文件的总字数、行数、情感词数量输出为CSV文件。”约束是“用标准库完成文件读取第三方库只允许使用分词和统计相关的工具。”样例是“文件名格式为红楼梦001.txt文件内容为具体正文段落。”这样一写AI生成的代码几乎不需要大改就能跑通。核心原因是它知道了数据长什么样、输出要什么格式、在什么约束下工作。很多初学者抱怨AI代码不可用其实问题出在需求描述太粗糙AI只能猜。3.3 三件AI必然踩坑的事环境版本、中文编码、幻觉接口AI编程助手用多了我发现有三类问题几乎百分之百会出现。第一类是环境版本问题。AI的训练数据里有大量旧版本代码生成出来的API调用经常在当前环境里已经改名或者废弃。解决方法是养成先看“运行时报错信息”的习惯而不是直接复制到项目里。报错后把错误信息贴回给AI让它按当前环境修改。第二类是中文编码问题。AI默认使用UTF-8处理文本但Windows环境下很多旧txt文件是GBK编码。生成代码一旦没接触过这类文件读入立刻乱码。我的解决方法是让AI的代码里统一声明编码读取逻辑优先UTF-8失败则尝试GBK再失败就报错输出文件名。这个改动很便宜但极度实用。第三类是幻觉接口。AI会一本正经地生成一个看起来存在、实际上不存在的函数或参数。这种问题最隐蔽因为代码看起来逻辑完整但一运行就抛AttributeError。我后来养成了习惯AI生成的代码如果用一个我不认识的API先查一下当前环境的文档确认存在再使用。信任的前提是能验证。3.4 我的代码复核习惯先看逻辑再跑数据最后看边界AI生成的代码我不会直接全量跑而是有一套复核流程。先读一遍核心函数确认输入输出的数据流是自己期望的输入是文件路径列表输出是统计结果列表中间有没有偷偷把数据全量加载进内存导致爆掉。确认逻辑没问题后再用最小样例跑只选三五个章节文件看结果是否符合预期。最后一步查边界。空文件会不会崩超长的一行会不会影响统计特殊字符会不会导致编码报错这些边界条件AI生成时常常考虑不到需要人工补上。我的做法是把这些验证动作也一并写进代码里每个文件处理完都打印一行进度这样全量跑的时候出了问题能快速定位到具体文件。说白了AI编程助手对我的价值是省掉了敲样板代码的时间但理解、验证和兜底还是得自己来。把它当成一个很有经验但偶尔犯迷糊的初级搭档用起来最顺。4. NLP到底能做什么以及我为什么越做越感兴趣4.1 从四大名著往外看NLP的场景比我原来想的大太多做完四大名著这个项目我对自然语言处理能做什么的理解彻底变了。以前觉得NLP就是说让机器读懂话、翻译、聊个天实际上它的应用面广得多。稍微展开一下我接触到的领域文本分类用来做新闻归档、舆情分级情感分析用来做口碑监控和负面预警信息抽取用来把简历、合同、公告里的关键字段自动提出来问答系统是客服机器人的核心背后是意图识别和槽位填充文本生成则用在辅助写作、摘要生成、报告起草这些环节。这里面既有深度学习方案也有大量基于词典、规则、统计的传统方案后者在数据稀缺的中文细分场景里依然很有市场。四大名著的练手经历让我意识到NLP的每一项基础技能在一套复杂语料上都可以找到对应的应用。分词对应文本清洗词频对应关键词提取情感打分对应舆情判断文风对比对应作者识别与分类。换一个数据场景核心方法完全迁移得过去。4.2 我的兴趣落点古文语义分析这个细分方向四大名著做完之后我慢慢发现自己对古文语义分析这个细分方向越来越有兴趣。原因很朴素中文古籍的数字化和结构化远远不够大量文本堆在那里等着人去做断句、实体识别、人物关系抽取、情节事件结构化。这个方向和现代NLP有个很大的差异语料是半文半白甚至纯文言通用分词和情感词库效果都一般很多现代汉语里成熟的工具到了古文场景会失效。正因为不好做所以做出来是真正有价值的。四大名著是一套极好的起点规模适中、内容熟悉、结构清晰人物关系网复杂但标注起来相对可行。我之后做的一个小方向是人物关系抽取把每一回里同时出现的人物名取出来通过共现频次构建人物关系网再用对话归属做二次修正。这个方向不依赖大模型跑起来也快但对结构化文本的感知要求很高。一步步做下来我对“文本结构”的理解比单纯跑模型那会儿深得多。4.3 给同样想入坑NLP的人三条不那么鸡汤的建议第一从语料出发不要从模型出发。先找一份你真正感兴趣的文本再想任务。兴趣是最好的语料筛选器四大名著这种自带情节和情感的文本做起来不会觉得枯燥。第二把传统NLP方法跑通一遍再碰深度学习。词频、共现、TF-IDF、情感词加权这些方法笨但直观能帮你建立对文本的直觉。直接上深度学习很容易把注意力全放在调参上文本本身的特性反而被忽视。第三用AI编程助手给自己提速但每段生成的代码都要理解。AI能帮你跑通流程但帮你理解不了语料。今天偷懒跳过的细节将来会在更大的数据上以更严重的形式找回来。提示如果你想复现这套流程建议从单本、单任务开始比如先对某一本的名著做纯词频统计跑通后再加入情感分析和对比实验。步子迈太快容易踩进编码、清洗和分词质量三重坑里逐步递进反而出活更快。做完这三个阶段之后我对自然语言处理的态度有了一个挺大的变化。以前遇到新的文本数据我第一反应是“该上哪个模型”现在第一反应变成“先看看这份文本长什么样、脏在哪、特色在哪”。工具是越用越顺手但真正让项目有意思的永远是语料本身带来的问题。如果你也被四大名著这类语料吸引别犹豫下一份文本下载下来写个统计程序把古人下笔的字节节奏摸一遍你会有和我一样的体会的。