文本分类是自然语言处理领域中的核心任务之一,被广泛应用于情感分析、垃圾邮件检测等场景。本文章通过完整的Python代码示例,从传统的TF-IDF方法到现代的BERT模型,系统地讲解文本分类的实现。我们首先介绍TF-IDF特征提取与逻辑回归模型的应用,然后转向基于深度学习的BERT模型,展示其更强大的分类能力。文章不仅提供了详细的代码及中文注释,还辅以数学公式和图表,以帮助读者深入理解每种方法的原理和实现。本指南适合自然语言处理入门者及希望掌握BERT模型在文本分类中应用的开发者。
目录
- 引言
- 数据预处理
- 基于TF-IDF的文本分类
- 3.1 TF-IDF介绍
- 3.2 使用逻辑回归进行分类
- 3.3 代码实现
- 基于BERT的文本分类
- 4.1 BERT模型简介
- 4.2 BERT的预训练与微调
- 4.3 代码实现
- 结果对比与分析
- 总结与展望
1. 引言
文本分类任务的目标是将一段文本归类到预定义的类别中。传统的机器学习方法依赖于特征工程,如TF-IDF(词频-逆文档频率),虽然简单有效,但在语义理解上存在局限性。近年来,深度学习模型尤其是Transformer架构的BERT模型表现出色,显著提升了分类任务的准确性。
本文将带领读者从零开始实现文本分类任务,依次展示如何使用TF-IDF和BERT处理相同的数据集,并对两种方法的性能进行对比。
2. 数据预处理
数据集说明
我们将使用经典的IMDb电影评论数据集进行文本分类任务。数据集包含两类标签:
- 正面评论(Positive)
- 负面评论(Negative)
数据加载与清洗
import pandas as pd
import re
from sklearn.model_selection import train_test_split
# 加载IMDb数据集
# 假设已经下载IMDb数据集的csv文件
data = pd.read_csv('IMDB_Dataset.csv')
# 数据清洗:去除HTML标签和非字母字符
def clean_text(text):
# 去除HTML标签
text = re.sub(r'<.*?>', '', text)
# 保留字母字符
text = re.sub(r'[^a-zA-Z]', ' ', text)
# 转换为小写
text = text.lower()
return text
data['review'] = data['review'].apply(clean_text)
# 标签二值化
data['sentiment'] = data['sentiment'].map({'positive': 1, 'negative': 0})
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
data['review'], data['sentiment'], test_size=0.2, random_state=42
)
print(f"训练集大小: {len(X_train)}, 测试集大小: {len(X_test)}")
3. 基于TF-IDF的文本分类
3.1 TF-IDF介绍
TF-IDF是一种衡量单词在文档和整个语料库中重要程度的统计方法。公式如下:
TF-IDF ( t , d ) = TF ( t , d ) ⋅ IDF ( t ) \text{TF-IDF}(t, d) = \text{TF}(t, d) \cdot \text{IDF}(t) TF-IDF(t,d)=TF(t,d)⋅IDF(t)
其中,TF表示词频,IDF表示逆文档频率,定义为:
IDF ( t ) = log N 1 + n t \text{IDF}(t) = \log \frac{N}{1 + n_t} IDF(t)=log1+ntN
- ( N ) 是文档总数
- ( n_t ) 是包含词 ( t ) 的文档数
3.2 使用逻辑回归进行分类
逻辑回归是一种经典的线性模型,适合处理稠密特征数据。
3.3 代码实现
TF-IDF特征提取
from sklearn.feature_extraction.text import TfidfVectorizer
# 创建TF-IDF向量器
tfidf_vectorizer = TfidfVectorizer(max_features=5000)
# 生成TF-IDF特征
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_tfidf = tfidf_vectorizer.transform(X_test)
print(f"TF-IDF特征维度: {X_train_tfidf.shape[1]}")
逻辑回归模型训练与预测
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# 创建逻辑回归模型
log_reg = LogisticRegression()
# 训练模型
log_reg.fit(X_train_tfidf, y_train)
# 测试模型
y_pred = log_reg.predict(X_test_tfidf)
# 评估模型
print("逻辑回归模型评估:")
print(f"准确率: {accuracy_score(y_test, y_pred)}")
print(classification_report(y_test, y_pred))
4. 基于BERT的文本分类
4.1 BERT模型简介
BERT(Bidirectional Encoder Representations from Transformers)是一种预训练的语言模型,其核心思想是通过双向Transformer架构学习上下文关系。
BERT使用了两个关键任务进行预训练:
- 遮蔽语言模型(Masked Language Model, MLM)
- 下一句预测(Next Sentence Prediction, NSP)
4.2 BERT的预训练与微调
BERT的强大之处在于可以通过微调适应下游任务,如文本分类。
4.3 代码实现
安装依赖
pip install transformers datasets
加载预训练模型与分词器
from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
from datasets import Dataset
# 加载BERT分词器
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# 数据编码
def encode(examples):
return tokenizer(examples['review'], truncation=True, padding="max_length", max_length=128)
# 转换数据为Dataset对象
train_data = Dataset.from_pandas(pd.DataFrame({'review': X_train, 'label': y_train}))
test_data = Dataset.from_pandas(pd.DataFrame({'review': X_test, 'label': y_test}))
# 编码数据
train_data = train_data.map(encode, batched=True)
test_data = test_data.map(encode, batched=True)
模型定义与训练
# 加载预训练BERT模型
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
# 定义训练参数
training_args = TrainingArguments(
output_dir="./results",
evaluation_strategy="epoch",
save_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=3,
weight_decay=0.01,
logging_dir="./logs"
)
# 定义Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_data,
eval_dataset=test_data,
tokenizer=tokenizer
)
# 开始训练
trainer.train()
模型评估
# 模型评估
results = trainer.evaluate()
print("BERT模型评估:")
print(results)
5. 结果对比与分析
我们将逻辑回归和BERT模型的性能进行对比:
- 逻辑回归 + TF-IDF 的准确率约为 ( \sim85% )。
- BERT 模型的准确率约为 ( \sim93% )。
优劣分析
-
TF-IDF + 逻辑回归:
- 优点:简单高效,训练速度快。
- 缺点:无法理解词的语义和上下文。
-
BERT:
- 优点:强大的上下文理解能力,高准确率。
- 缺点:训练时间较长,对硬件要求较高。
6. 总结与展望
本文展示了从传统TF-IDF方法到现代BERT模型的完整文本分类实现,并通过实验验证了BERT的优势。未来,可以探索更复杂的预训练模型(如 GPT 系列)或结合强化学习改进文本分类的性能。