📢 转载信息
原文作者:Jason Brownlee
当使用 Scikit-learn 来解决文本分类问题时,您需要选择一种文本特征提取方法。最流行的方法是 词袋(Bag-of-Words, BoW)、TF-IDF 和 基于大型语言模型(LLM)的嵌入(Embeddings)。
在本文中,我们将探讨这三种方法并比较它们在 Scikit-learn 中的性能,以确定哪种方法最适合您的文本分类任务。
文本特征提取方法概述
文本特征提取是将非结构化的文本数据转换为模型可以理解的数值表示的过程。Scikit-learn 提供了实现这些经典方法的工具。
词袋(Bag-of-Words, BoW)
BoW 模型基于文档中词语的出现频率来表示文本。它不考虑词语的顺序或上下文。Scikit-learn 中的 CountVectorizer 可用于创建 BoW 特征。
TF-IDF
词频-逆文档频率(Term Frequency-Inverse Document Frequency, TF-IDF) 是一种统计方法,它不仅考虑词语在单个文档中的频率,还考虑其在整个文档集合中的稀有程度。高 TF-IDF 分数的词语对文档分类的贡献更大。Scikit-learn 的 TfidfVectorizer 可实现此功能。
LLM 嵌入(Embeddings)
LLM 嵌入(例如来自 BERT 或 GPT 模型)是现代的、基于深度学习的表示方法。它们捕获了词语和文档的语义信息,这意味着它们能够理解词语的上下文和含义,而不仅仅是出现次数。
Scikit-learn 中的实现
Scikit-learn 提供了用于 BoW 和 TF-IDF 的内置工具。然而,对于 LLM 嵌入,您通常需要结合使用外部库,例如 Hugging Face Transformers,然后将生成的嵌入向量作为特征输入到 Scikit-learn 模型中。
Scikit-learn 代码示例
以下是如何在 Scikit-learn 中使用 CountVectorizer(用于 BoW)和 TfidfVectorizer 的示例。
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 示例数据 (假设 'texts' 是您的文本列表, 'labels' 是对应的标签)
data = [
("This is a positive review about the movie.", 1),
("The film was terrible and boring.", 0),
# ... 更多数据
]
texts = [d[0] for d in data]
labels = [d[1] for d in data]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.3, random_state=42)
# 1. BoW 特征提取
vectorizer_bow = CountVectorizer()
X_train_bow = vectorizer_bow.fit_transform(X_train)
X_test_bow = vectorizer_bow.transform(X_test)
# 2. TF-IDF 特征提取
vectorizer_tfidf = TfidfVectorizer()
X_train_tfidf = vectorizer_tfidf.fit_transform(X_train)
X_test_tfidf = vectorizer_tfidf.transform(X_test)
# 训练和评估逻辑回归模型 (BoW)
model_bow = LogisticRegression()
model_bow.fit(X_train_bow, y_train)
preds_bow = model_bow.predict(X_test_bow)
print(f"BoW Accuracy: {accuracy_score(y_test, preds_bow):.4f}")
# 训练和评估逻辑回归模型 (TF-IDF)
model_tfidf = LogisticRegression()
model_tfidf.fit(X_train_tfidf, y_train)
preds_tfidf = model_tfidf.predict(X_test_tfidf)
print(f"TF-IDF Accuracy: {accuracy_score(y_test, preds_tfidf):.4f}")
对于 LLM 嵌入,您需要一个预训练的模型来生成向量,然后将这些向量用作模型的输入特征。这通常涉及使用 sentence-transformers 库或 Hugging Face 库。
性能比较:哪种方法最好?
评估哪种方法“更好”取决于您的具体任务需求,包括性能要求、计算资源和数据集的复杂性。
1. 语义理解能力:
- LLM 嵌入: 远超 BoW 和 TF-IDF。它们捕获了词语的深层语义关系。例如,它们能理解“好”和“出色”在情感分析中的相似性,而 BoW/TF-IDF 只能将它们视为不同的、不相关的词汇。
- TF-IDF: 优于 BoW,因为它能降低常见词(如“的”、“是”)的影响,突出文档的区分性词语。
- BoW: 最差,因为它只统计词频,无法处理同义词或上下文。
2. 计算效率:
- BoW / TF-IDF: 非常快,尤其是对于大型稀疏矩阵。它们是计算成本最低的方法。
- LLM 嵌入: 计算成本最高。生成高质量的嵌入(如 BERT)需要大量的计算资源(通常是 GPU),并且向量维度远高于稀疏矩阵。
3. 维度:
- BoW / TF-IDF: 维度等于词汇表大小,可能非常大(数十万甚至数百万),导致数据稀疏。
- LLM 嵌入: 维度固定且较小(通常在 128 到 1024 之间),生成的是稠密向量。
实验结果概览
在大多数现代文本分类基准测试中,如果计算资源允许,LLM 嵌入往往能提供最高的准确率,因为它拥有更丰富的语义信息。
当数据集较小或任务相对简单时,TF-IDF 仍然是一个非常强大的基线模型,它在速度和性能之间取得了很好的平衡。
如果您的目标是获得最高的准确性,并且可以承受较高的计算成本,那么使用 LLM 嵌入是首选。
如果您的目标是快速迭代或资源受限,并且任务可以被词频信息充分表征,那么 TF-IDF 是一个可靠且高效的选择。
结论
在 Scikit-learn 环境下,选择文本特征提取方法是一个权衡过程:
1. LLM 嵌入:代表了当前最先进的性能,因为它理解语义。
2. TF-IDF:提供了一个强大的、计算高效的基线,它通过权重调整了词语的重要性。
3. BoW:最简单但性能最弱,通常仅用于入门演示。
要充分利用 LLM 嵌入的潜力,您需要将其输出的稠密向量作为特征输入到 Scikit-learn 的分类器中,如逻辑回归或支持向量机。
我们建议从 TF-IDF 开始作为基线,然后如果需要提高性能,再迁移到 LLM 嵌入。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区