BERT 中文外卖评价情感分析项目
BERT 中文外卖评价情感分析项目报告
一、项目背景与目标
1.1 背景说明
随着外卖行业的发展,用户在平台上留下的评价数据具有极高的商业价值。
通过对这些文本进行情感分析,可以帮助平台:
-
了解用户对餐饮服务的满意度;
-
辅助商家优化菜品与服务;
-
构建舆情监控与推荐系统。
传统机器学习(如 SVM、朴素贝叶斯)在中文语义理解方面能力有限。
因此,本项目采用了 预训练语言模型 BERT(Bidirectional Encoder Representations from Transformers),利用其强大的上下文建模能力进行 中文情感分类任务。
二、项目总体方案
2.1 任务定义
-
输入:外卖平台用户的中文评论文本;
-
输出:情感标签(
0=负面
,1=正面
); -
目标:训练一个分类模型,准确预测用户评价的情感极性。
2.2 技术路线图
数据加载 → 分词编码 → 构建数据加载器 → 加载BERT → 冻结参数提特征 → 构建分类层 → 模型训练与验证 → 评估结果与可视化
三、技术栈与工具
模块 | 使用技术 | 说明 |
---|---|---|
语言 | Python 3.10+ | 主体开发语言 |
深度学习框架 | PyTorch | 模型构建与训练 |
NLP 模型库 | Hugging Face Transformers | BERT 模型与分词器 |
数据处理 | Pandas, NumPy | 文本数据读取与处理 |
优化器 | AdamW | Transformer 推荐优化器 |
调度器 | StepLR | 控制学习率衰减 |
显卡加速 | CUDA | GPU 训练加速 |
预训练模型 | bert-base-chinese | 中文通用 BERT 模型 |
四、数据集介绍
内容 | 说明 |
---|---|
数据来源 | 外卖平台真实用户评论 |
格式 | CSV 文件(两列:review , label ) |
样本数量 | 正向约 4000 条,负向约 8000 条 |
划分比例 | 训练集 80%,测试集 20% |
标签说明 | 0 = 负面,1 = 正面 |
示例数据:
review | label |
---|---|
“菜送得太慢了,还凉了。” | 0 |
“味道不错,包装干净,会回购。” | 1 |
五、模型设计与实现
5.1 模型结构
本项目采用 BERT 作为文本编码器,将 [CLS]
向量输入到线性层进行分类:
输入文本 → BERT Encoder → [CLS] 表示 → Linear(768 → 2) → Softmax分类
5.2 模型代码结构
class Model(nn.Module): def __init__(self): super().__init__() self.fc = nn.Linear(768, 2) def forward(self, input_ids, attention_mask, token_type_ids): with torch.no_grad(): # 冻结BERT out = model(input_ids, attention_mask, token_type_ids) logits = self.fc(out.last_hidden_state[:, 0]) # 取CLS位置 return logits
5.3 模型冻结策略
为了避免过拟合与训练开销过大,先冻结 BERT 参数,仅训练分类层:
for param in model.parameters(): param.requires_grad = False
可在后期逐层解冻(fine-tune)以提升性能。
六、训练策略与优化
6.1 超参数设置
参数 | 值 |
---|---|
学习率 | 2e-4 |
批次大小 | 16 |
最大序列长度 | 500 |
优化器 | AdamW |
学习率调度 | StepLR(step_size=10, gamma=0.5) |
Epoch 数 | 16 |
Loss 函数 | CrossEntropyLoss |
6.2 训练流程
-
训练阶段
-
前向传播 → 计算交叉熵损失;
-
反向传播 → 参数更新;
-
统计训练集 loss / acc。
-
-
验证阶段
-
模型设为
eval()
; -
禁用梯度计算;
-
计算测试集 loss / acc。
-
七、实验结果与分析
7.1 收敛情况
Epoch | Train Acc | Test Acc | Train Loss | Test Loss |
---|---|---|---|---|
8 | 88.3% | 90.3% | 0.294 | 0.270 |
11 | 88.3% | 91.1% | 0.293 | 0.257 |
13 | 92.7% | 91.6% | 0.195 | 0.244 |
16 | 96.3% | 91.2% | 0.111 | 0.305 |
7.2 结果分析
-
模型在 10 个 epoch 后趋于稳定;
-
测试集准确率在 91% 左右,说明泛化良好;
-
后期
train_loss
继续下降但test_loss
上升,出现轻微过拟合; -
若采用 部分层微调 或 增加 Dropout,可进一步稳定性能。
八、项目优点与改进方向
8.1 优点
使用 BERT 提升中文文本语义建模能力
冻结+微调策略灵活
模型收敛快,准确率高
手写训练循环,有助理解底层机制
可直接迁移到其他情感任务(如微博、点评等)
8.2 可改进方向
改进点 | 方法 | 预期效果 |
---|---|---|
全微调 BERT | 解冻后几层 encoder | 提升准确率 1–2% |
加入 Dropout 层 | 防止过拟合 | 提高泛化能力 |
更先进调度器 | CosineAnnealingLR | 平滑收敛 |
F1/Recall 评估 | 适应数据不平衡 | 更全面的评估 |
可视化分析 | TensorBoard、Loss 曲线 | 更好理解训练过程 |
九、学习收获与心得
作为学习者,通过此项目可以掌握:
-
BERT 模型的底层工作原理
-
输入三张量 → Encoder 输出 → [CLS] 表征
-
-
如何封装 PyTorch 自定义数据集与 DataLoader
-
冻结、微调、线性层分类器的组合方式
-
如何设计训练循环与评估逻辑
-
从零搭建一个可用的中文 NLP 分类系统
十、总结与展望
本项目成功实现了基于 BERT 的中文外卖评价情感分类任务,验证了预训练语言模型在中文理解场景中的高效性与鲁棒性。
未来可进一步:
-
尝试 RoBERTa-wwm-ext 或 MacBERT 提升表现;
-
引入 Prompt Learning / LoRA 微调 降低计算开销;
-
构建 Web API 服务 实现在线情感识别。
这是一个能从底层理解 BERT、又能快速产出实际结果的项目。
它连接了 NLP 理论与工程实现,是学习深度语言模型的理想入门案例。