☰
微博评论文本情感分析:SVM、朴素贝叶斯与AdaBoost三分类器实现
2026/10/11 21:17:58 网站建设 项目流程

简介:一套微博评论文本情感分析毕业设计资源,整合SVM、朴素贝叶斯与AdaBoost三类经典算法,并附完整论文文档。面向计算机、通信、人工智能、自动化等相关专业的学生、教师或从业者,适用于课程设计、大作业及毕业设计参考,帮助解决中文文本情感分类从数据预处理、模型训练到结果评估的问题。压缩包共69个文件,大小约6.38MB,其中31个Python源码覆盖训练、测试、词云绘制、ROC曲线等环节;15个npy文件保存模型参数,13个txt文件包含语料、停用词与词典,另有4个model模型文件和1份docx论文文档。代码均已调试测试且可运行,作者答辩评审分达98分,具有完整的学习路径与较高的参考价值。目前已有131人学习使用,适合想掌握微博评论情感分析完整流程的入门与进阶者,亦可作为二次开发的基础。

1. 微博评论文本情感分析:一套能跑通三个分类器的完整毕设

很多做自然语言处理毕设的人,容易一上来就钻进算法推导,把 SVM、朴素贝叶斯、AdaBoost 的公式抄了厚厚几页,最后却发现连一条微博评论都跑不出结果。这套毕业设计项目把三条路都备好了:源码里同时实现了 SVM、朴素贝叶斯、AdaBoost 三套文本情感分析方案,并配了完整的论文文档、训练语料和中间模型文件。它适合两类人:一是打算拿文本分类做毕设或课程作业的同学,需要一份能复现、能改、能写进论文的项目;二是刚接触中文情感分析、想理解传统统计模型怎么处理短文本的从业者。这个项目不是空壳代码,而是把分词、特征构造、模型训练、评估、绘图这一整条链路都跑通的成品。

2. 项目结构与数据准备:先盘清文件,再决定从哪个脚本入手

2.1 解压后目录里到底有什么:文件清单与职责划分

下载解压后,你会看到一堆名字相近的文件,如果不先分清楚功能,很容易把训练脚本和测试脚本搞混,跑出来一堆报错。下面这张表是我整理出来的主线文件,用来帮助你快速定位入口:

文件名作用
Bayes.py朴素贝叶斯分类器的训练与预测入口
SVM.py / svm_train.py支持向量机模型的训练与评估入口
adaboostNB.py / multi_adaBoost.pyAdaBoost 与朴素贝叶斯弱分类器结合的实现
new_train.py / training.py预处理后重新组装训练集的辅助脚本
two_nb.py / two_class二分类情感正负判定的相关实现
using_sklearn.py调用 sklearn 库进行快速验证的脚本
cut.py / word/cut.py中文分词脚本
stop.txt / new_word.txt停用词表和自定义词典
ntusd / ntusd-positive.txt / ntusd-negative.txt中文情感词典与正负向语料
doc/基于AdaBoost算法的情感分析研究.docx配套毕业论文文档
model/gnb.model_02.npy 等训练好的模型文件,用 numpy 保存
draw_pic.py / draw_word.py / word_cloud准确率曲线与词云绘制的辅助脚本

我一般会先打开 doc 目录下的论文,因为论文里的算法流程往往比代码注释更完整。论文里写的特征提取方式、数据切分比例、评估指标,就是代码里最核心的那几条变量的来源。先读论文再动代码,能节省大量猜参数的时间。

2.2 中文分词和停用词过滤:不要直接拿原始评论训练

中文文本和英文不同,词与词之间没有天然空格,如果不先分词,句子里“太好看”和“太难看了”这种词频特征完全无法区分。项目里 cut.py 做的就是这个事。常见的做法是使用 jieba 的精确模式分词,再挂一个自定义词典,把微博环境里的网络新词单独丢进去。

import jieba import codecs def load_stopwords(path='stop.txt'): with codecs.open(path, 'r', encoding='utf-8') as f: return {line.strip() for line in f if line.strip()} def cut_text(text, stopwords): # 精确模式,不做搜索引擎式切分 words = jieba.lcut(text) # 过滤单字、停用词,减少无意义特征 return [w for w in words if len(w) > 1 and w not in stopwords] if __name__ == '__main__': stop = load_stopwords() sample = '这个手机真的太卡了,不推荐购买' print('/'.join(cut_text(sample, stop)))

这段代码里,jieba.lcut 返回的是分词后的列表,过滤条件len(w) > 1是为了去掉“的”“了”“啊”这类单字虚词。如果你有行业词库,比如“性价比”“售后客服”,可以在调用前加一句jieba.load_userdict('new_word.txt')。分词结果直接决定了词表质量,这一步做不好,后面三个分类器都会一起翻车。

2.3 语料标签格式与训练集拆分

项目里的 ntusd-positive.txt 和 ntusd-negative.txt 是情感词典,train.txt 和 DS.txt 则是训练语料。从这类项目的常见组织方式来看,每行数据一般是标签和文本用制表符分隔,左边是 0 或 1,右边是已经分词后的句子,也有直接把原始文本放进去,等 cut.py 跑完再合并标签的版本。

你可以先执行下面的命令,确认一下文件前几行的格式:

head -5 train.txt

如果看到的是“1\t产品 很好 值得 购买”这种带\t的行,说明标签在前、文本在后,后面训练脚本读取时就按这个顺序解析。如果看到的是纯文本,那就要先运行python cut.py生成新的训练集,再交给分类器。数据拆分时,我建议按 8:2 切分训练集和测试集,如果项目里已经有现成的 train.txt 和 test.py,就沿用现成结构,避免自己改坏标签顺序。

3. 三种分类器的核心实现:SVM、朴素贝叶斯、AdaBoost 代码怎么选

3.1 朴素贝叶斯:Bayes.py 与 two_nb.py 的模型差异

朴素贝叶斯是文本分类里经典中的经典,它不是因为它假设最合理,而是因为短文本场景里词与词之间的相关性本来就弱,条件独立假设勉强成立,训练又极快,很适合微博评论这种短文本。project 里有两个相关文件:Bayes.py 是主入口,two_nb.py 则是二分类下对两种贝叶斯变体的对比实现。

项目 model 目录下保存了多个gnb.model_*.npy文件,gnb在高斯朴素贝叶斯和多项朴素贝叶斯这两种叫法里都有出现。如果你想快速验证特征效果,可以直接用 sklearn 构建一个多项朴素贝叶斯模型:

from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB # corpus 是分词后用空格连接的句子列表,labels 是 0/1 标签 vectorizer = CountVectorizer(ngram_range=(1, 1), min_df=1) X = vectorizer.fit_transform(corpus) clf = MultinomialNB(alpha=1.0) clf.fit(X, labels)

这里alpha=1.0对应拉普拉斯平滑,避免某个词在训练集中没出现时概率直接归零。手写贝叶斯时还要注意用 log 概率相加,否则几百个词的概率连乘会下溢成 0。项目里的 Bayes.py 一般就是自己做词频统计和概率计算,好处是答辩时你能打开文件讲清每一步,而不是黑匣子。

3.2 支持向量机:SVM.py 与 svm_train.py 的线性核设置

SVM 在文本分类里的表现通常优于朴素贝叶斯,原因在于文本特征维度虽然高,但很多特征是冗余的,SVM 只关心支持向量,训练结果对稀疏特征更稳。项目里有 SVM.py、svm_temp.py 和 svm_train.py,说明至少包含一个可独立运行的训练流程和对比实验。

短文本情感分类我一般先试线性核,因为词频特征维度高,RBF 核容易过拟合,还要多调一个gamma,性价比不高。以下代码是常见的 sklearn 快速验证方式:

from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC vectorizer = TfidfVectorizer(max_features=5000) X = vectorizer.fit_transform(train_sentences) model = SVC(kernel='linear', C=1.0, probability=True) model.fit(X, train_labels)

max_features=5000是限制特征数量,避免每一条评论里的独特词把维度撑爆;C=1.0控制误分类惩罚力度,C 调得越大,模型对训练集越忠实,也越容易过拟合。如果你在 svm_train.py 里看到 RBF 核,建议先改成 linear 看下指标,再决定要不要调gamma。

3.3 AdaBoost:adaboostNB.py 中的弱学习器与权重更新

AdaBoost 的思路是串行训练一组弱分类器,每个弱分类器都把注意力放在前一轮分错的样本上,最后加权投票得到强分类器。项目里 adaboostNB.py 这个名字暗示弱学习器用的是朴素贝叶斯,这个组合在公开论文里很常见,答辩时也容易讲清楚原理。

自己实现 AdaBoost 时,核心是样本权重更新公式。下面这段简化逻辑展示了每一轮迭代的关键步骤:

import numpy as np def adaboost_train(X, y, n_estimators=10): # y 必须转换为 +1 / -1 n = len(y) w = np.ones(n) / n models = [] alphas = [] for _ in range(n_estimators): model = train_weak_learner(X, y, sample_weight=w) pred = model.predict(X) err = np.sum(w * (pred != y)) if err >= 0.5: break alpha = 0.5 * np.log((1 - err) / err) w = w * np.exp(-alpha * y * pred) w = w / np.sum(w) models.append(model) alphas.append(alpha) return models, alphas

这里alpha是弱分类器的投票权重,分错率越低,alpha 越大。w = w * np.exp(-alpha * y * pred)是权重更新的核心:当预测正确时y * pred = 1,权重被缩小;预测错误时权重被放大。注意y必须取 +1 和 -1,不能用 0/1 标签,否则公式方向就反了。multi_adaBoost.py 里可能封装了多分类版本,实际跑微博情感二分类时,用 adaboostNB.py 更直接。

4. 从训练到评估的完整流程:命令、参数和模型持久化

4.1 预处理与训练命令:先跑 cut.py 再跑 new_train.py 的顺序

我的习惯是不管项目里有没有现成训练结果,都从预处理开始完整跑一遍,这样才能确认环境没问题。顺序一般是先分词,再组装训练集,然后跑三个分类器。可以按下面的命令执行:

python cut.py python new_train.py python Bayes.py python svm_train.py python adaboostNB.py

很多新手容易直接跳过 cut.py 去跑后面的脚本,结果一加载数据就发现文本里全是空格分隔的中文短语,误以为数据坏了。实际上这是分词后的中间格式,并不是原始语料。new_train.py 的作用是把分词结果和标签重新拼成模型需要的输入文件,它在中间起到“承上启下”的作用,不要省略。

如果你改了自己的语料,建议处理完先打印训练集前两行,确认标签数量和文本长度都正常,再进入训练环节。模型训练成功后,控制台通常会输出准确率或 F1 值,这个值会随后续参数调整而变化。

4.2 模型保存与加载:gnb.model_01.npy 这类文件怎么用

项目里 model 目录下有很多.npy文件,比如gnb.model_05.npy、gnb.model_01.npy。这些是训练完成后用 numpy 保存的参数文件,而不是 sklearn 的 pickle 模型。加载方式一般是:

import numpy as np model_data = np.load('model/gnb.model_05.npy', allow_pickle=True).item() print(model_data.keys())

allow_pickle=True是 numpy 加载对象字典时必须的参数,item()可以把单个元素数组还原成字典。加载后你通常会看到词表、先验概率、条件概率这些键。如果你只是想直接做预测,就忽略具体键名,直接用保存的模型数据去算后验概率。

要提醒一句:这些.npy文件的字段顺序和训练脚本里的特征顺序强绑定,如果你修改了词表或分词规则,原来的模型文件就过期了,必须重新训练,否则预测时特征维度会对不上。

4.3 评估指标与可视化:ROC曲线、准确率和词云图

训练完成后,项目里还有一批评估脚本,比如 roc_temp.py 用于绘制 ROC 曲线,draw_pic.py 用于绘制训练过程对比图,draw_word.py 用于生成情感词云图。评估时最常用的指标是准确率、召回率、F1 和 AUC。

python roc_temp.py python draw_pic.py python draw_word.py

ROC 曲线适合观察不同阈值下的综合表现,尤其当正负样本不平衡时,AUC 比准确率更能反映模型真实能力。我跑这类情感分析项目时,会重点看 F1 而不是单纯看准确率,因为微博评论中“中性”样本经常被错误划入负类,单一指标容易掩盖问题。

词云图也是一道重要工序,用 WordCloud 生成的高频词图可以直接放进论文的“数据分析”部分。但如果你在 Windows 上运行,必须先设置中文字体,否则出来的图片全是方框。项目里提供了 simhei.ttf,就是用来解决这个问题的。

5. 避坑指南:复现这个项目最容易翻车的五个地方

5.1 中文路径触发分词工具初始化失败

现象:运行 cut.py 时,jieba或pynlpir在加载词典阶段报错,提示找不到文件或初始化失败。原因:项目所在目录或 Windows 临时目录中存在中文路径,分词工具对这部分兼容性不好。解决:把整个项目拷贝到纯英文路径下,比如D:\weibo_sentiment\,再运行一次;如果还报错,就手动设置临时目录环境变量TEMP为英文路径。

5.2 预测时词表不一致导致维度对不上

现象:训练时准确率很高,但用保存的模型预测新评论时,报出特征数量不一致,或者预测结果全是同一类。原因:训练脚本里构建词表的逻辑和预测脚本不同步,比如训练时用了 new_word.txt,预测时却忘记加载自定义词典。解决:把词表构建逻辑统一封装成一个方法,训练和预测都调用同一个方法;同时确保停用词版本一致,不要让两边的过滤规则漂移。

5.3 AdaBoost 在不平衡语料上训练不收敛

现象:adaboostNB.py 训练过程中,弱分类器权重一直很小,迭代几轮就提前结束了,最终准确率还不如单个贝叶斯。原因:微博情感数据里负向样本远远多于正向样本,AdaBoost 对不平衡数据很敏感,前面的弱分类器学到的几乎全是多数类,误差率超过 0.5 后直接退出。解决:先对多数类做降采样,让正负样本比例接近 1:1;或者给少数类样本更高的初始权重;如果用了 sklearn,还可以设置class_weight='balanced'。

5.4 词云图中文显示为方框

现象:draw_word.py 生成的图片是正常的词形状,但所有汉字都变成方框或乱码。原因:WordCloud 默认字体不支持中文,Matplotlib 也用的是英文字体。解决:在代码中显式指定字体路径,例如font_path='./simhei.ttf',并把它传给 WordCloud 构造函数;如果是 Matplotlib 绘制的图,还需要用plt.rcParams['font.sans-serif'] = ['SimHei']设置中文字体。

5.5 论文指标与自己跑出来的结果不一致

现象:论文里写的准确率达到 92%,你自己训练后只有 85%,反复调参也追不上。原因:论文里的结果可能来自不同的数据切分比例,或者它用了数据增强、预处理过滤规则,代码里却没同步更新。解决:先不回改代码,而是把论文中描述的“训练集 7:3”“去掉长度小于 2 的词”“添加自定义停用词表”这几个条件逐一对照代码;最稳妥的做法是固定随机种子,每一次实验都记录数据切分方式,保证论文复现时变量可控。

6. 进阶技巧:把微博语料替换成你自己的文本分类数据

6.1 替换语料后的最低改动路径

如果你想把这个项目改成京东商品评论或新闻标题的情感分析,不需要重写算法,只需要保证新数据格式和原项目一致。最简单的方式是写一个转换脚本,把自己的 Excel 或 CSV 文件变成“标签\t文本”的 train.txt。

python from_database.py

项目里已经有 from_database.py,可能是从数据库或 Excel 读取数据的脚本。你只需要修改它的数据源路径和字段映射,把原有的文本列和标签列对应到 train.txt 格式,然后重新跑 cut.py 和 new_train.py。这里的关键是确认标签数据是平衡的,很多商品评论其实是中性的,直接并进去会让三个分类器全部失效。

6.2 调词典和停用词让模型更贴场景

微博评论和商品评论的高频词差异很大,比如“物流”“客服”“性价比”,这些词在微博语料里很少出现。把它们加进 new_word.txt,再调整 stop.txt,去掉一些微博专用的网络词,可以明显提高模型在新场景下的表现。

添加自定义词典时要注意,每行一个词,不要带词频和词性,jieba 默认就能识别。停用词表也不要加得太狠,否则“不推荐”里的“不”被去掉,原本强烈的负面信号会变得难以识别。每改一次词典和停用词表,就重新训练一次,观察指标变化。

6.3 用交叉验证替代固定切分,拿到更可信指标

毕设论文里单一结果很容易被评审质疑,尤其是只给一次随机切分的结果。建议把代码里的固定 train_test_split 换成 5 折交叉验证,这样得到的均值和方差更能说明模型稳定性。

from sklearn.model_selection import cross_val_score # clf 是训练好的分类器,X 是特征矩阵,y 是标签 scores = cross_val_score(clf, X, y, cv=5, scoring='f1_macro') print(scores.mean(), scores.std())

交叉验证多跑几轮,也能让你发现数据里某几折特别差,从而定位到语料分布不均的问题。从那以后,我每次做情感分析项目,都会强制走一遍交叉验证,并且把每一折的 F1 值记录在论文附录里,而不是只留一个最好看的结果。希望帮到你。

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

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

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

立即咨询