共计 2097 个字符,预计需要花费 6 分钟才能阅读完成。
文本分类的应用场景与挑战
文本分类是 NLP 中最基础也最实用的任务之一,比如垃圾邮件过滤、新闻分类、情感分析等场景都会用到。对于初学者来说,最大的挑战往往是面对众多算法时不知道如何选择。今天我们就来对比两种典型的文本分类算法:BERT 和朴素贝叶斯。

技术原理对比
1. 朴素贝叶斯:统计学习的代表
朴素贝叶斯基于贝叶斯定理,假设特征之间相互独立。它的核心思想是通过统计词语在不同类别中出现的概率来进行分类。
- 优点:模型简单、训练速度快、对小数据集友好
- 缺点:无法捕捉词语间的关联性(因为假设特征独立)
2. BERT:深度学习的巅峰之作
BERT 是基于 Transformer 架构的预训练语言模型,通过自注意力机制理解上下文语义。
- 优点:能捕捉深层语义、在大型语料上预训练后效果出众
- 缺点:需要大量计算资源、训练时间长
实战代码对比
朴素贝叶斯实现(scikit-learn)
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
# 1. 数据准备
X = [...] # 文本数据
y = [...] # 标签
# 2. 特征提取
vectorizer = TfidfVectorizer()
X_vec = vectorizer.fit_transform(X)
# 3. 训练测试分割
X_train, X_test, y_train, y_test = train_test_split(X_vec, y, test_size=0.2)
# 4. 模型训练
model = MultinomialNB()
model.fit(X_train, y_train)
# 5. 评估
print("Accuracy:", model.score(X_test, y_test))
BERT 实现(HuggingFace)
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
import torch
# 1. 加载预训练模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=num_classes)
# 2. 数据预处理
def encode_texts(texts, labels):
return tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
dataset = encode_texts(X, y)
# 3. 训练参数设置
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=16,
evaluation_strategy="epoch"
)
# 4. 训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset,
eval_dataset=dataset
)
trainer.train()
实验对比
我们在 IMDB 影评数据集上进行了对比测试:
| 指标 | 朴素贝叶斯 | BERT |
|---|---|---|
| 准确率 | 82.3% | 92.1% |
| 训练时间 | 15 秒 | 2 小时 |
| 推理延迟 | 5ms/ 样本 | 50ms/ 样本 |
| 内存占用 | 200MB | 1.5GB |
避坑指南
1. 小数据量场景
当训练数据少于 1 万条时,朴素贝叶斯通常是更好的选择:
- BERT 需要大量数据才能微调出好效果
- 朴素贝叶斯在小数据上也能有不错表现
2. 类别不平衡问题
对于朴素贝叶斯:
- 可以调整 class_prior 参数
- 或者在训练时对少数类样本进行过采样
对于 BERT:
- 使用 class_weight 参数
- 采用 Focal Loss 等改进的损失函数
3. 部署注意事项
朴素贝叶斯:
- 注意保存特征提取器(如 TF-IDF 向量化器)
- 在线服务时内存占用低
BERT:
- 考虑使用模型蒸馏减小体积
- 可以使用 ONNX 格式加速推理
选型决策树
如果你还是不确定如何选择,可以按照这个流程图来决策:
- 数据量是否小于 1 万条?
- 是 → 选择朴素贝叶斯
- 否 → 进入下一步
- 是否需要实时推理(延迟 <100ms)?
- 是 → 选择朴素贝叶斯
- 否 → 进入下一步
- 是否有 GPU 资源?
- 是 → 选择 BERT
- 否 → 选择朴素贝叶斯
延伸学习
如果想更深入了解:
- 朴素贝叶斯:学习拉普拉斯平滑和特征工程
- BERT:研究不同的预训练模型(如 RoBERTa、ALBERT)
练习题目:
- 尝试在不同规模的数据集上比较两种算法
- 为朴素贝叶斯添加 n -gram 特征,观察效果变化
- 尝试用知识蒸馏压缩 BERT 模型
正文完
