文本分类

文本分类简介

文本分类是自然语言处理(NLP)中的核心任务,旨在将文本分配到预定义的类别中。它广泛应用于情感分析(如正面/负面评论)、垃圾邮件检测、主题分类等。本教程基于 2025 年 10 月的最新技术和 Python 生态(Python 3.10+),介绍文本分类的原理、方法、工具和代码示例,涵盖传统机器学习和深度学习方法,适合初学者和中级开发者。


1. 文本分类的核心概念

  • 定义:给定文本(如句子、段落)和一组类别(如正面/负面),模型预测文本所属类别。
  • 类型
  • 二分类:如情感分析(正面/负面)。
  • 多分类:如新闻主题分类(体育/政治/科技)。
  • 多标签分类:文本可属于多个类别(如电影评论的多种情感)。
  • 流程
  1. 数据准备:收集带标签的文本数据。
  2. 预处理:清洗、分词、去除停用词等。
  3. 特征提取:将文本转为数值表示(如 TF-IDF、BERT 嵌入)。
  4. 模型训练:使用机器学习或深度学习模型。
  5. 评估:使用准确率、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-chinesehfl/chinese-roberta-wwm-ext
  • 评估指标
  • 二分类:准确率、F1 分数。
  • 多分类:宏平均 F1、混淆矩阵。

7. 进阶学习建议

  • 多标签分类:使用 MultiLabelBinarizer(scikit-learn)或 BertForSequenceClassification(多标签模式)。
  • 多语言分类:微调 xlm-roberta-base 支持多语言。
  • 实时分类:优化推理速度,使用 Sentence Transformers 或 ONNX。
  • 资源
  • Hugging Face 文档:BERT 分类指南。
  • scikit-learn 文档:文本分类教程。
  • CSDN 文本分类:中文案例。

如果你需要针对特定任务(如中文情感分析、多标签分类)或更复杂的实现(如实时分类系统),请告诉我,我可以提供详细代码和指导!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注