共计 2330 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
情感分类是自然语言处理(NLP)中的一项基础任务,广泛应用于电商评论分析、社交媒体舆情监控、客服对话情感识别等场景。传统的情感分类方法主要基于词袋模型(Bag of Words)或 TF-IDF 特征结合机器学习算法(如 SVM、朴素贝叶斯)实现。这些方法虽然简单高效,但存在明显的局限性:

- 无法捕捉词语的上下文语义信息(如“not good”被拆分为独立词)
- 对文本中的长距离依赖关系建模能力弱
- 严重依赖人工特征工程
技术选型
在预训练语言模型时代,我们有多种选择。以下是主流模型在情感分类任务上的对比:
- BERT:双向 Transformer 架构,特别适合需要理解上下文的任务,在中等规模数据集上微调效果突出
- RoBERTa:BERT 的改进版,训练时间更长数据量更大,适合资源充足场景
- DistilBERT:轻量版 BERT,推理速度快 40%,精度下降约 2%
- ALBERT:参数共享技术减小模型体积,适合内存受限环境
对于大多数中文情感分类场景,推荐使用 bert-base-chinese 版本,它在中文任务上表现出色且社区支持完善。
核心实现
数据预处理
情感分类数据集通常包含文本和标签(0/ 1 表示负面 / 正面)。关键预处理步骤:
from transformers import BertTokenizer
import pandas as pd
# 加载预训练分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
def preprocess(text, max_len=128):
# 1. 添加特殊标记 [CLS]和[SEP]
# 2. 截断 / 填充到固定长度
# 3. 生成 attention mask
encoded = tokenizer.encode_plus(
text,
max_length=max_len,
padding='max_length',
truncation=True,
return_tensors='pt'
)
return encoded
# 示例:处理 CSV 数据
df = pd.read_csv('comments.csv')
dataset = [preprocess(text) for text in df['text']]
labels = torch.tensor(df['label'].values)
模型微调
使用 HuggingFace 的 Transformers 库可以轻松实现微调:
from transformers import BertForSequenceClassification, Trainer, TrainingArguments
# 加载预训练模型(指定分类标签数)model = BertForSequenceClassification.from_pretrained(
'bert-base-chinese',
num_labels=2
)
# 训练参数配置
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
evaluation_strategy='epoch',
save_strategy='epoch'
)
# 创建 Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=val_dataset
)
# 开始训练
trainer.train()
性能优化
生产环境中需要考虑模型效率和资源消耗:
-
模型量化:使用 8 位整数表示模型参数
from transformers import quantization model = quantization.quantize_model(model) -
层剪枝:移除对性能影响小的注意力头
from transformers import prune_heads prune_heads(model, {'attention_head': [0,2,4]}) -
ONNX 运行时:转换为 ONNX 格式提升推理速度
torch.onnx.export(model, inputs, 'model.onnx')
避坑指南
- 问题 1 :验证集准确率波动大
-
解决方案:减小学习率(推荐 2e- 5 到 5e-5)
-
问题 2 :训练 loss 下降但测试集效果差
-
解决方案:增加 Dropout 比例(0.3-0.5)或添加 L2 正则化
-
问题 3 :显存不足
- 解决方案:启用梯度检查点(gradient_checkpointing=True)
部署实践
使用 FastAPI 创建推理服务:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class RequestData(BaseModel):
text: str
@app.post("/predict")
async def predict(data: RequestData):
inputs = preprocess(data.text)
with torch.no_grad():
outputs = model(**inputs)
probs = torch.softmax(outputs.logits, dim=1)
return {"positive_prob": probs[0][1].item()}
总结建议
现在您已经掌握了 BERT 情感分类的完整流程,建议:
1. 在自己的业务数据集上尝试微调
2. 使用 wandb 等工具监控训练过程
3. 尝试不同的学习率调度策略(如余弦退火)
4. 分享您的调参经验和效果对比
期待看到您在实践中获得的 insights!
正文完
