文本分类
文本分类简介
文本分类是自然语言处理(NLP)中的核心任务,旨在将文本分配到预定义的类别中。它广泛应用于情感分析(如正面/负面评论)、垃圾邮件检测、主题分类等。本教程基于 2025 年 10 月的最新技术和 Python 生态(Python 3.10+),介绍文本分类的原理、方法、工具和代码示例,涵盖传统机器学习和深度学习方法,适合初学者和中级开发者。
1. 文本分类的核心概念
- 定义:给定文本(如句子、段落)和一组类别(如正面/负面),模型预测文本所属类别。
- 类型:
- 二分类:如情感分析(正面/负面)。
- 多分类:如新闻主题分类(体育/政治/科技)。
- 多标签分类:文本可属于多个类别(如电影评论的多种情感)。
- 流程:
- 数据准备:收集带标签的文本数据。
- 预处理:清洗、分词、去除停用词等。
- 特征提取:将文本转为数值表示(如 TF-IDF、BERT 嵌入)。
- 模型训练:使用机器学习或深度学习模型。
- 评估:使用准确率、F1 分数等指标。
2. 常用工具
以下是 2025 年主流的 Python 库,适合文本分类:
- scikit-learn:传统机器学习算法(如 SVM、朴素贝叶斯)。
- NLTK/spaCy:文本预处理(分词、词形还原)。
- Transformers (Hugging Face):深度学习模型(如 BERT、RoBERTa)。
- PyTorch/TensorFlow:自定义深度学习模型。
- Sentence Transformers:生成句子嵌入,适合分类。
安装命令:
pip install scikit-learn nltk spacy transformers torch sentence-transformers
python -m spacy download en_core_web_sm # 英语模型
3. 传统机器学习方法
传统方法使用特征提取(如 TF-IDF)结合分类器(如 SVM、逻辑回归)。
3.1 示例代码:TF-IDF + SVM 情感分析
使用 NLTK 的电影评论数据集进行二分类(正面/负面)。
import nltk
from nltk.corpus import movie_reviews
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
下载数据集
nltk.download(‘movie_reviews’)
准备数据
texts = [movie_reviews.raw(fileid) for fileid in movie_reviews.fileids()]
labels = [1 if fileid.startswith(‘pos’) else 0 for fileid in movie_reviews.fileids()]
划分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.2, random_state=42)
TF-IDF 特征提取
vectorizer = TfidfVectorizer(max_features=5000, stop_words=’english’)
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
训练 SVM
clf = LinearSVC()
clf.fit(X_train_tfidf, y_train)
预测
y_pred = clf.predict(X_test_tfidf)
评估
print(“准确率:”, accuracy_score(y_test, y_pred))
print(“F1 分数:”, f1_score(y_test, y_pred))
测试新文本
test_text = “This movie is fantastic and highly recommended!”
test_tfidf = vectorizer.transform([test_text])
prediction = clf.predict(test_tfidf)[0]
print(“预测情感:”, “正面” if prediction == 1 else “负面”)
输出示例:
准确率: 0.875
F1 分数: 0.872
预测情感: 正面
说明:
- 数据集:NLTK 的
movie_reviews包含 2000 条正/负评论。 - TF-IDF:将文本转为稀疏特征向量,
max_features=5000限制词汇表大小。 - SVM:高效的二分类器,适合小型数据集。
- 评估:准确率和 F1 分数衡量模型性能。
4. 深度学习方法(基于 Transformers)
深度学习方法(如 BERT)通过上下文嵌入捕捉语义,性能优于传统方法。
4.1 示例代码:BERT 情感分析
使用 Hugging Face 的 Transformers 库进行情感分析。
from transformers import pipeline
加载预训练 BERT 情感分析模型
classifier = pipeline(“sentiment-analysis”, model=”distilbert-base-uncased-finetuned-sst-2-english”)
测试文本
texts = [
“This movie is fantastic and highly recommended!”,
“The film was a complete disappointment.”
]
results = classifier(texts)
for text, result in zip(texts, results):
print(f”文本: {text}”)
print(f”情感: {result[‘label’]}, 置信度: {result[‘score’]:.4f}”)
输出示例:
文本: This movie is fantastic and highly recommended!
情感: POSITIVE, 置信度: 0.9998
文本: The film was a complete disappointment.
情感: NEGATIVE, 置信度: 0.9991
说明:
- pipeline:Hugging Face 提供的简易接口,自动加载分词器和模型。
- 模型:
distilbert-base-uncased是轻量 BERT,适合快速推理。 - 优势:捕捉上下文,处理复杂语义。
4.2 微调 BERT 模型
对于自定义数据集,需微调 BERT 以提高准确性。
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
import torch
from torch.utils.data import Dataset
import nltk
from nltk.corpus import movie_reviews
from sklearn.model_selection import train_test_split
nltk.download(‘movie_reviews’)
自定义数据集
class MovieReviewDataset(Dataset):
def init(self, texts, labels, tokenizer, max_len=128):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = self.texts[idx]
label = self.labels[idx]
encoding = self.tokenizer(text, truncation=True, padding='max_length', max_length=self.max_len, return_tensors='pt')
return {
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'labels': torch.tensor(label, dtype=torch.long)
}
准备数据
texts = [movie_reviews.raw(fileid) for fileid in movie_reviews.fileids()]
labels = [1 if fileid.startswith(‘pos’) else 0 for fileid in movie_reviews.fileids()]
train_texts, test_texts, train_labels, test_labels = train_test_split(texts, labels, test_size=0.2, random_state=42)
加载分词器和模型
tokenizer = BertTokenizer.from_pretrained(“distilbert-base-uncased”)
model = BertForSequenceClassification.from_pretrained(“distilbert-base-uncased”, num_labels=2)
创建数据集
train_dataset = MovieReviewDataset(train_texts, train_labels, tokenizer)
test_dataset = MovieReviewDataset(test_texts, test_labels, tokenizer)
训练参数
training_args = TrainingArguments(
output_dir=”./results”,
num_train_epochs=3,
per_device_train_batch_size=8,
evaluation_strategy=”steps”,
logging_steps=100,
save_steps=500,
)
训练
trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset, eval_dataset=test_dataset)
trainer.train()
测试新文本
test_text = “This movie is fantastic!”
inputs = tokenizer(test_text, return_tensors=”pt”, truncation=True, padding=True)
outputs = model(**inputs)
prediction = torch.argmax(outputs.logits, dim=1).item()
print(“预测情感:”, “正面” if prediction == 1 else “负面”)
说明:
- 数据集:使用
movie_reviews数据集,微调 DistilBERT。 - 训练:需要 GPU 加速(约 10-20 分钟,视硬件)。
- 评估:
evaluation_strategy="steps"监控训练过程中的性能。
5. 性能优化技巧
- 传统机器学习:
- 特征选择:限制 TF-IDF 词汇表(如
max_features=5000)。 - 预处理:移除停用词、词干提取减少维度。
- 模型选择:LinearSVC 或 LogisticRegression 比随机森林更快。
- 深度学习:
- 轻量模型:使用 DistilBERT 或 MobileBERT 替代 BERT。
- 批量推理:设置
per_device_train_batch_size=16。 - GPU 加速:确保 PyTorch 支持 CUDA(
pip install torch --index-url https://download.pytorch.org/whl/cu118)。 - 量化:使用
torch.quantization或 ONNX 优化推理。 - 数据优化:
- 缓存预处理结果(如 pickle 保存 TF-IDF 矩阵)。
- 使用
nlp.pipe()(spaCy)批量预处理文本。
6. 注意事项
- 数据质量:
- 确保数据集平衡(正/负样本比例接近)。
- 清洗文本(移除 URL、标点),参考文本预处理教程。
- 模型选择:
- 小数据集(<1000):TF-IDF + SVM。
- 大数据集(>1000):BERT 或 Sentence Transformers。
- 语言支持:
- 英文:丰富预训练模型(如
bert-base-uncased)。 - 中文:使用
bert-base-chinese或hfl/chinese-roberta-wwm-ext。 - 评估指标:
- 二分类:准确率、F1 分数。
- 多分类:宏平均 F1、混淆矩阵。
7. 进阶学习建议
- 多标签分类:使用
MultiLabelBinarizer(scikit-learn)或BertForSequenceClassification(多标签模式)。 - 多语言分类:微调
xlm-roberta-base支持多语言。 - 实时分类:优化推理速度,使用 Sentence Transformers 或 ONNX。
- 资源:
- Hugging Face 文档:BERT 分类指南。
- scikit-learn 文档:文本分类教程。
- CSDN 文本分类:中文案例。
如果你需要针对特定任务(如中文情感分析、多标签分类)或更复杂的实现(如实时分类系统),请告诉我,我可以提供详细代码和指导!