每年到这个节点,我总会碰到几波咨询毕设的,其中"基于django+机器学习的电商评论情感分析"绝对是出现频率最高的题目之一。标题挂着"源码+文档+远程调试,全包定制"的要么是代做广告,要么是二手倒卖,但这类题目本身的技术含量和完成度,其实被很多人低估了。今天我不聊代做那点事,就把它当做一个正经的工程技术项目来拆一遍:题目背后的核心难点在哪、技术栈为什么这么搭、从数据到模型再到网页的完整链路怎么走、以及那些你只有真正动手才会踩到的坑。
这个题目本质上是一个"文本分类 + Web 展示"的全栈项目,适合计算机、大数据、电子商务、信息管理等相关专业的毕业设计,也适合想入门 NLP 应用开发的初学者参考。它既不需要搞多前沿的算法,也不用烧钱租显卡,一台普通笔记本就能完整跑通,但对工程整合能力的要求相当全面:数据处理、模型训练、后端接口、前端展示、论文撰写一条龙。下面我从头到尾把这条链路捋一遍。
1. 题目拆解:一个情感分析毕设的真实工作量
1.1 情感分析到底解决什么问题
情感分析(Sentiment Analysis),学术上叫意见挖掘,本质上是让机器判断一段文本传递的情绪倾向。放到电商场景里,具体任务就是从用户评论中判断"这个评论是好评、差评还是中性",更细一点还能分析出用户具体在夸哪个方面(物流快、质量好、服务差)或者吐槽哪个点(尺寸不符、客服敷衍)。
很多同学一看题目就慌了,觉得"NLP + 机器学习"门槛很高。实际上单论电商评论情感分析这个场景,它已经被研究得很透,属于文本分类里最经典、最容易落地的一类问题。你不需要做生成式模型,不需要搞大模型微调,核心就是一句话:把评论文本变成向量,然后喂给一个分类器,让分类器输出"正面/负面"的标签。就这么简单。
1.2 电商评论场景的特殊性
电商评论跟新闻文本、社交文本相比有几个明显特点,直接决定了你的技术选型:
- 口语化严重:"东西不错就是有点小贵""物流贼快""也就那样吧",大量省略主语、乱用标点、夹杂表情符号。
- 短文本为主:大多数评论就几十个字,不像新闻那样有丰富的上下文,所以特征很稀疏。
- 正负样本不均衡:真实场景里好评天然占比高,很多人买到满意的东西懒得评价,买到不满意的才疯狂吐槽,但总体看好评仍然远多于差评。
- 隐含情感表达:"这价格还要啥自行车"表面看是句调侃,实际是好评;"用了一次就坏了"没有直接负面词,但明显是差评。这类表达对模型的语义理解能力有要求。
这些特点决定了你不能拿一套通用 NLP 流程硬套,必须针对中文电商评论做专门的数据清洗和特征处理。
1.3 交付物清单:源码之外还要有什么
凡是认真做过毕设的人都知道,老师看的绝不只是"能跑"。一个完整可交付的情感分析系统至少要包含这几块:
- 可运行的 Django 项目源码,包含数据预处理脚本、模型训练脚本、Web 应用代码;
- 训练好的模型文件(.pkl / .h5 之类),保证拿到源码能不重新训练直接启动;
- 项目文档,包括需求分析、系统设计、数据库设计(虽然这个项目可能用不到数据库)、接口说明;
- 毕业论文或设计报告,这是大头,后面我会专门讲怎么组织;
- 一个稳定的演示环境,能现场展示单条分析、批量分析、可视化图表这些功能。
把这些模块列出来你就会发现,这个题目的难点压根不在算法本身,而在"把算法包装成一个完整系统"这件事上。很多同学模型调得飞起,最后卡在 Django 部署和前后端联调上,那才叫冤枉。
2. 技术选型逻辑:为什么是 Django + 机器学习,而不是别的
2.1 Django 在这个项目里的真实职责
先说 Django。它的定位是 Web 框架,负责对外提供页面和接口。为什么毕设选它而不是别的?几个很实在的理由:
- Python 生态一致:机器学习这边用的 sklearn、TensorFlow、PyTorch 全是 Python 的,Django 也是 Python,模型文件直接可以
joblib.load()/keras.models.load_model()加载,完全不用跨语言调用,这是最省事的一条路。 - 自带后台和管理界面:Django 的 admin 模块免费送一个管理后台,可以拿来管理评论样本、查看标注数据,演示的时候也是加分项。
- 开发效率高:ORM 让你不用写原生 SQL,模板系统让你快速搭页面,对主要精力在机器学习上的毕设来说非常友好。
相比之下,Flask 更轻量但很多东西要自己拼,FastAPI 虽然后起之秀但很多学校老师没听过,答辩容易被质疑选型理由。Django 是"大而全"的稳妥牌,就业市场上 Python Web 岗位提到 Django 的概率也高,选它从答辩和工作两个角度都说得过去。
2.2 机器学习算法的选型路线
算法部分要分两层看:传统机器学习层和深度学习层。毕设做到什么程度,取决于你想拿什么档次的成绩。
- 传统机器学习:朴素贝叶斯(MultinomialNB)、逻辑回归、线性 SVM、随机森林。这几个是文本分类的经典基线模型,训练快、解释性强,论文里可以画很多对比分析的图。
- 深度学习方法:TextCNN、LSTM、BiLSTM。这些模型能捕捉词序和上下文信息,对"这价格还要啥自行车"这类句子效果明显更好,但训练时间和调参难度也上来。
- 预训练模型(进阶项):BERT 及各种中文预训练模型(如中文 RoBERTa、ERNIE),效果确实好,但显存占用大、推理慢,普通毕设不一定有必要。我建议最多作为"改进方向"写进论文的展望,不要当作主方案,否则光是环境配置就够你喝一壶。
核心选型建议:主方案做"TF-IDF + 机器学习"和"Word2Vec + 深度学习"两套对比,既覆盖了基础要求又体现工作量,答辩时数字也漂亮。
2.3 系统分层与数据流转
整个系统从架构上分四层,理解了这个分层,后面做起来思路就非常清晰:
数据层:评论数据集 → 清洗/标注 → 训练集/测试集 模型层:文本向量化 → 分类模型 → 评估/调优 → 模型持久化 应用层:Django 视图 → 加载模型 → 推理预测 → 返回结果 展示层:单条输入框 → 批量分析 → 图表可视化数据从原始爬虫文件或公开数据集进来,经过预处理变成干净的训练语料,训练出的模型通过 pickle/joblib 保存成文件,Django 启动时加载模型,用户在前端输入评论,请求打到视图函数,视图调用预处理和模型,把预测结果返回给前端渲染。这条链路每环都可以独立测试,建议按这个顺序开发,不要一上来就写 Django,先把模型跑通再说。
3. 数据预处理:中文评论比英文难在哪里
3.1 数据集的选择与标注策略
数据是情感分析项目的命根子。公开的电商评论数据集可以找到不少,但来源和质量参差不齐。毕设场景下我建议用以下几种来源组合:
- 公开的某平台商品评论数据集(通常包含评论文本和评分);
- 自己写爬虫抓取(如果敢用爬虫,要注意遵守网站协议,仅作学术用途);
- 中文情感语料库或者开源的中文酒店/购物评论数据。
数据规模上,二分类(正/负)至少准备 1 万条以上,最好能到 3~5 万条。太少模型容易欠拟合,太多你预处理和训练的时间也受不了。如果原始数据带评分,可以直接用评分做弱标注:4~5 星算正面,1~2 星算负面,3 星可以扔掉或单独归为中性。这是学术论文里常见的做法,省去了大量人工标注时间,但要在论文里说明清楚,因为评分和真实情感并不完全一致(有人给 3 星却写了段好评)。
3.2 分词、停用词与传统特征
中文文本和英文最大的区别是没有天然的空格分词,所以分词是中文 NLP 的第一道工序。主流方案是 jieba,也考虑用 jieba 的全模式和搜索引擎模式做对比实验。核心代码很简单:
import jieba text = "这个手机续航不错,就是屏幕有点暗,整体性价比很高" seg_list = jieba.cut(text, cut_all=False) print(" | ".join(seg_list)) # 这个 | 手机 | 续航 | 不错 | , | 就是 | 屏幕 | 有点 | 暗 | , | 整体 | 性价比 | 很高分词之后是清洗和去停用词:
- 去除网址、@ 用户、纯数字、无意义符号;
- 去停用词("的""了""就""也"这类高频但无信息的词),需要用一份中文停用词表;
- 去重:同一用户对同一商品的重复评论、完全相同的刷单评论,否则会污染训练集;
- 可选:繁体转简体、表情符号替换成情感词(比如"哈哈哈哈"转为"开心")。
传统机器学习里,最经典的特征就是 TF-IDF。它的思路是:一个词在文档中出现次数多(TF 高)、但在整个语料中出现得少(IDF 高),那它就对这篇文档有很强的区分度。比如"差评""退款"这类词在差评里密集出现但总体少见,TF-IDF 会给它很高权重:
from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(max_features=5000, ngram_range=(1, 2)) X_train = vectorizer.fit_transform(train_texts) X_test = vectorizer.transform(test_texts)注意这里fit_transform和transform的区别:一定要只用训练集 fit,测试集只能 transform,否则会造成信息泄露,测试集数据提前"见到"了词表,评估结果虚高。这个细节毕业论文里可以单独写,老师会觉得你真懂。
3.3 词向量与序列化表示
传统 TF-IDF 是离散的、稀疏的表示,无法体现词与词之间的语义关系。深度模型一般用的是稠密词向量:先通过 Word2Vec 或 GloVe 把每个词映射到固定维度的向量空间,语义相近的词在向量空间里距离更近。比如"好评"和"点赞"的向量就很接近。
用 gensim 训练词向量,或者直接加载开源的中文词向量:
from gensim.models import Word2Vec # 语料是分词后的句子列表,每句是一个词列表 sentences = [jieba.lcut(s) for s in train_texts] model = Word2Vec(sentences, vector_size=100, window=5, min_count=2, sg=1) model.save("word2vec.model")然后把每条评论映射成词向量序列,再 padding 到固定长度(比如 128 个词),超过截断、不足补零。这步做完,数据才能喂给 LSTM 或 TextCNN。
4. 模型训练与外评估:从跑通到能答辩
4.1 先跑传统机器学习模型做基线
我强烈建议所有做这个题目的同学,先跑传统机器学习模型,而不是直接上深度学习。原因有三:一是速度快,一分钟内出结果,方便快速验证数据管道有没有问题;二是结果稳定,不依赖随机种子;三是论文有对比素材。
以 TF-IDF 特征为例,把数据 8:2 切分,然后分别跑逻辑回归、朴素贝叶斯、线性 SVM:
from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import MultinomialNB from sklearn.svm import LinearSVC from sklearn.metrics import accuracy_score, f1_score X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) models = { "LogisticRegression": LogisticRegression(max_iter=1000), "MultinomialNB": MultinomialNB(), "LinearSVC": LinearSVC() } for name, model in models.items(): model.fit(X_train, y_train) pred = model.predict(X_test) print(f"{name}: 准确率 = {accuracy_score(y_test, pred):.4f}, " f"F1 = {f1_score(y_test, pred):.4f}")实际跑出来的典型结果是:线性 SVM 通常略优于逻辑回归,朴素贝叶斯在某些数据集上也相当能打。这个阶段不用追求极致准确率,重点是得到一组可比对的基线数值,比如准确率 0.85~0.90 左右就很正常。
4.2 再接 LSTM 或 TextCNN
传统模型的瓶颈在于忽略词序。比如"不是不好"和"不好"语义完全相反,但如果只看词的权重,很容易搞混。这时就需要深度学习模型。
TextCNN 的原理很直观:把评论看成一维的"信号",用多个不同尺寸的卷积核去扫,提取局部 n-gram 特征,再接池化层和全连接层。它实现简单、训练快,是文本分类性价比最高的深度模型之一。LSTM 则是按顺序读词,能记住前面出现过的重要信息,适合处理"虽然……但是……"这种句式。
用 Keras / TensorFlow 实现一个简单的 TextCNN:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, Conv1D, GlobalMaxPooling1D, Dense, Dropout model = Sequential([ Embedding(vocab_size, 128, input_length=max_len), Conv1D(128, 5, activation='relu'), GlobalMaxPooling1D(), Dense(64, activation='relu'), Dropout(0.5), Dense(1, activation='sigmoid') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(X_pad_train, y_train, epochs=10, batch_size=64, validation_split=0.1)注意几个会让结果难看的坑:Embedding 层如果随机初始化而不加载预训练词向量,需要更多训练轮次才能收敛;Dropout 不要加太大,0.3~0.5 即可;epochs 建议配合早停(EarlyStopping),防止过拟合,因为毕设数据量不大,过拟合非常容易发生。
4.3 评测指标、混淆矩阵与结果对比
很多毕设论文写"模型准确率达到 90%",然后就没了。这其实是不够的。二分类问题必须看一组指标:准确率、精确率、召回率、F1 值、混淆矩阵。
举个例子:如果 100 条评论里 90 条好评、10 条差评,模型无脑全预测为好评,准确率都有 90%。但这明显是一个废物模型。所以一定要看差评这一类的召回率——有多少差评被你漏掉了。用混淆矩阵可以看出模型到底在哪个类别上犯错:
from sklearn.metrics import confusion_matrix, classification_report print(classification_report(y_test, pred, target_names=['负面', '正面'])) print(confusion_matrix(y_test, pred))论文里建议同时放三张表:传统模型对比表、深度模型对比表、以及优劣错误案例分析表。案例分析尤其加分——找几个预测错误的评论,分析为什么错,比如"遇到反讽句式无法理解""缺少领域词典"等,这体现了你的思考深度。
5. Django 集成:把模型装进网页的完整链路
5.1 模型持久化与加载策略
训练完模型的最终归宿不是 jupyter 而是文件。传统机器学习模型用 joblib 保存,比 pickle 在 numpy 数组上的效率更高:
import joblib joblib.dump(vectorizer, "models/tfidf_vectorizer.pkl") joblib.dump(model, "models/sentiment_model.pkl")深度学习模型用model.save("models/textcnn_model.h5"),同时也要保存分词器和词表,否则部署时没法对用户输入做同样处理。这里我踩过一个坑:光保存模型不行,预处理管线必须和模型一起保存。比如 TF-IDF 的vocabulary_、分词用的词典、padding 用的max_len,这些都要持久化,否则新来的文本无法转成和训练时一致的表示。
Django 端加载模型要注意时机。最忌讳在每个请求里都load_model(),模型加载一次要好几秒,用户点一下等五秒,演示直接翻车。正确做法是模块加载时只执行一次,用全局变量保存:
# sentiment_service.py import joblib _vectorizer = None _model = None def get_model(): global _vectorizer, _model if _model is None: _vectorizer = joblib.load("models/tfidf_vectorizer.pkl") _model = joblib.load("models/sentiment_model.pkl") return _vectorizer, _modelDjango 的开发服务器是单进程多线程的,模块级全局变量在开发阶段完全够用。如果将来要上生产,就再考虑 Redis 缓存或者独立推理服务,但毕设不需要。
5.2 单条分析接口与批量分析
有了服务模块,视图层就很薄了。设计两个核心功能:单条分析和批量分析。
单条分析是一个简单的 POST 接口,前端输入框传入评论文本,后端做分词、向量化、预测,返回情感标签和置信度:
# views.py from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from .sentiment_service import get_model import jieba @csrf_exempt def analyze_one(request): if request.method == "POST": text = request.POST.get("text", "") if not text.strip(): return JsonResponse({"error": "评论不能为空"}, status=400) vec, model = get_model() # 这里要做和训练时完全一样的预处理 text_seg = " ".join(jieba.cut(text)) x = vec.transform([text_seg]) pred = model.predict(x)[0] proba = model.predict_proba(x)[0].tolist() label = "正面" if pred == 1 else "负面" return JsonResponse({"label": label, "proba": proba, "text": text}) return JsonResponse({"error": "仅支持POST请求"}, status=405)批量分析则是用户上传一个 CSV 文件,后端逐行预测,然后汇总统计并让用户下载结果文件。这个功能演示效果好,因为能直观展示模型的批量处理能力,数据量可以搞个几千条,几秒钟处理完,视觉效果很震撼。
5.3 前端展示与可视化
前端不求花哨,但要有几个关键元素:一个大的输入框、一个"分析"按钮、结果区域(情感标签+置信度+标签颜色)。再加一个批量分析的上传表单区域和结果下载按钮。
可视化是让毕设显得完整的重要一步。用 ECharts 或 Chart.js 画三个图:情感占比饼图(正面多少、负面多少)、不同类别评论数量的柱状图、以及 API 响应时间的折线图(可选)。这些图表的数据可以从批量分析的结果中统计出来,也可以从历史分析记录中读取。
Django 模板里嵌入 ECharts 很简单,引入 CDN,然后在 JavaScript 里填数据:
<script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script> <div id="pieChart" style="width: 100%; height: 400px;"></div> <script> const chart = echarts.init(document.getElementById('pieChart')); chart.setOption({ series: [{ type: 'pie', data: [ { name: '正面', value: {{ positive_count }} }, { name: '负面', value: {{ negative_count }} } ] }] }); </script>关于静态资源,我建议把 ECharts 文件下载到本地放在static目录下。为什么?因为答辩现场经常没网,CDN 加载不出来当场尴尬,本地文件最保险。所有外部依赖都尽量本地化,这是演示稳定性的第一原则。
5.4 项目文件结构与路由设计
一个标准的 Django 项目结构大概长这样:
sentiment_project/ ├── manage.py ├── sentiment_app/ # 核心应用 │ ├── views.py # 视图函数 │ ├── urls.py # 路由 │ ├── sentiment_service.py # 模型加载与推理 │ ├── models.py # 可能用的数据模型(可选) │ ├── templates/ │ │ └── sentiment_app/ │ │ ├── index.html │ │ └── batch.html │ └── static/ │ ├── css/ │ ├── js/ │ └── echarts/ ├── models/ # 训练好的模型文件 │ ├── tfidf_vectorizer.pkl │ ├── sentiment_model.pkl │ └── textcnn_model.h5 ├── scripts/ # 数据预处理与模型训练脚本 │ ├── preprocess.py │ ├── train_traditional.py │ └── train_deep.py └── data/ # 数据集 ├── raw/ └── processed/这个结构清晰、职责分明,写进论文架构图里也好看。路由就两个核心页面加两个接口,不需要搞复杂。
6. 毕设实战踩坑记录:这些问题我基本都遇到过
6.1 中文编码到处报错
做中文 NLP 项目,编码问题是第一个拦路虎。Windows 下默认编码经常是 GBK,而 Django 和大多数数据处理库默认 UTF-8。常见的报错就是UnicodeDecodeError: 'gbk' codec can't decode byte。
解决方案是:全项目统一 UTF-8。所有代码文件头部声明编码,所有文件读取显式指定encoding='utf-8',CSV 文件读取时加encoding='utf-8-sig'(带 BOM 时用这个)。另外在settings.py里设置LANGUAGE_CODE = 'zh-hans'和TIME_ZONE = 'Asia/Shanghai',否则 Django 后台会报一些本地化的小问题。
6.2 pickle 版本与跨环境加载问题
模型文件从你训练电脑搬到另一台电脑或者服务器,最容易翻车的是版本不一致。sklearn 的模型文件在版本跳跃大的时候(比如 0.24 到 1.2)可能加载失败,报ModuleNotFoundError: No module named 'sklearn...'或者ValueError: pickle protocol。
如果对方环境没法强制匹配版本,有两条路:一是用 joblib 加compress=3保存,并在文档里写清楚依赖版本;二是提供一份requirements.txt锁定所有关键包版本。我见过太多人远程调试时因为环境不一致,把两三个小时耗在装包上。交付的时候一定要把环境依赖清单列全,最好精确到版本号。
6.3 样本不均衡导致的"假高分"
前面说过好评天然比差评多。如果直接用原始分布训练,模型会倾向把所有样本预测为多数类。除了看混淆矩阵之外,处理手段有几种:欠采样(随机删掉部分好评)、过采样(差评做 SMOTE 或简单复制)、或者给少数类加大惩罚权重(sklearn 的class_weight='balanced')。
从论文角度,我建议把"数据不均衡问题及处理方案"写成独立小节。老师看到你主动发现并处理了数据分布问题,比看到 0.99 的准确率更靠谱。
6.4 DataFrame 在 Django 里的不可序列化问题
批量分析时,很多人习惯用 pandas 处理结果,最后return JsonResponse(result_df)直接报错,因为 DataFrame 不能被 JSON 序列化。正确做法是先转成records格式或者列表:
records = result_df.to_dict(orient="records") return JsonResponse({"data": records, "total": len(records)})还有个类似问题:numpy 的np.int64类型 JSON 也序列化不了。预测结果的标签如果是 numpy 类型,记得先int()或者float()强制转换。这些小坑单独看都不大,但串联起来会消耗大量调试时间。
6.5 模型推理速度过慢
如果深度模型没有 GPU,一个长评论预测可能要 100 毫秒以上,前端如果同步等待会导致页面卡顿几十秒。解决方案一是限制输入长度(截断到 128 或 256 词),二是用异步请求(AJAX + loading 动画),先让用户感知在"处理中",而不是页面没反应。
答辩演示最怕冷场。我建议把模型预热做一遍:服务启动时先拿几条测试数据跑一次,把模型加载和编译的耗时消化在后台,再用浏览器访问就流畅多了。
7. 文档、演示与答辩准备:让工作量看得见
7.1 毕业论文结构怎么搭
这个题目写论文,结构基本可以按下面这个骨架走,既符合软件工程流程又贴合 AI 类课题:
- 绪论:背景、国内外研究现状、主要工作与论文结构;
- 相关技术介绍:Django 框架、机器学习基础、中文文本处理技术;
- 系统需求分析:功能性需求(单条分析、批量分析、可视化)与非功能需求(响应时间、准确率);
- 系统设计:总体架构、模块划分、数据集构建与标注策略、模型选型方案;
- 系统实现:数据预处理的代码逻辑、模型训练过程与参数设置、Django 页面与接口实现;
- 实验与结果分析:实验环境、评价指标、模型对比、错误案例分析与改进方向;
- 总结与展望。
其中第 6 章是精华,老师说"工作量都体现在实验章节"不是开玩笑的。多放图表:数据分布图、词云图、混淆矩阵热力图、模型对比柱状图。
7.2 演示 Demo 的固定流程
演示不能临场发挥,建议固定为一条路径:打开系统主页说明技术栈和页面功能,输入一条明显的正面评论(比如"物流很快,包装严实,客服态度也很好")看结果,输入一条中性带隐含情感的评论(比如"价格便宜但质量一般般")看模型怎么判断;然后进入批量分析,上传测试 CSV,展示统计图和下载结果;最后切到后台管理页面展示评论样本管理功能。
整个过程控制在 5 分钟以内,重点突出数据和模型的可视化部分。提前在本地起好服务,关闭无关弹窗,断开外部依赖(本地 echarts 就是为此准备的)。
7.3 答辩时容易被追问的点
老师对这个题目的提问基本集中在几个地方,提前准备好答案就不慌:
- "为什么选这个模型,你和别的模型比较过吗?"——准备一张对比表,说清楚每个模型的准确率、F1 和优缺点。
- "你的结果准确率 90%,误差主要来自哪里?"——准备三五个预测错误的例子,分析反讽、缺主语、领域新词等原因。
- "这个系统如果上线,有什么不足?"——答:数据覆盖面不够、实时性一般、对反讽和方言识别弱,未来可以引入预训练模型、扩大数据规模。
- "你的特征是怎么提取的?"——把 TF-IDF 原理和 Word2Vec 原理用简单的话讲清楚,别背公式,用例子说明。
8. 结语与最后几点建议
文章写到这里,技术链路基本走完了。最后分享几点我做这类项目最深的感受:第一,这个题目最大的价值不是算法本身,而是让你完整走一遍"数据 → 模型 → 系统 → 文档"的工程流程,这种全链路的经验在面试时会成为非常扎实的项目故事。第二,不要迷信"全包定制",哪怕是买来的源码,你也要把每一行代码的原理搞懂,不然答辩老师几个追问就能看出破绽,到时候比没做还被动。第三,真实的数据比花哨的模型更能打动老师,把数据清洗、分布分析、错误案例做扎实,比堆一堆大词要强得多。
如果你正在做这个题目,建议从数据预处理脚本开始写起,先跑通一条最简单的朴素贝叶斯全流程,再逐步替换为深度模型和完善 Django 页面。路是一步一步走出来的,等你在浏览器里看到自己训练的模型实时给出一条评论的"正面/负面"判断时,那种成就感是代做和抄袭永远给不了的。