【人工智能】从TF-IDF到BERT:Python实现文本分类的全面指南

文本分类是自然语言处理领域中的核心任务之一,被广泛应用于情感分析、垃圾邮件检测等场景。本文章通过完整的Python代码示例,从传统的TF-IDF方法到现代的BERT模型,系统地讲解文本分类的实现。我们首先介绍TF-IDF特征提取与逻辑回归模型的应用,然后转向基于深度学习的BERT模型,展示其更强大的分类能力。文章不仅提供了详细的代码及中文注释,还辅以数学公式和图表,以帮助读者深入理解每种方法的原理和实现。本指南适合自然语言处理入门者及希望掌握BERT模型在文本分类中应用的开发者。


目录

  1. 引言
  2. 数据预处理
  3. 基于TF-IDF的文本分类
    • 3.1 TF-IDF介绍
    • 3.2 使用逻辑回归进行分类
    • 3.3 代码实现
  4. 基于BERT的文本分类
    • 4.1 BERT模型简介
    • 4.2 BERT的预训练与微调
    • 4.3 代码实现
  5. 结果对比与分析
  6. 总结与展望

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使用了两个关键任务进行预训练:

  1. 遮蔽语言模型(Masked Language Model, MLM)
  2. 下一句预测(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 系列)或结合强化学习改进文本分类的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值