LLM与词袋TF-IDF新闻数据集分类聚类多维对比附代码
设想一下,手头积压了数千篇新闻稿件,需要快速归类至体育、财经、科技等栏目,或从中挖掘潜在的主题模式。过去,只能依赖人工逐篇阅读、手动标注,耗时且低效。如今借助机器学习,将文本转化为计算机可处理的数值,模型即可自主完成。但核心难点在于:如何将文字转化为高质量的数值特征?这其中蕴含着丰富的技术细节。
近二十年来,文本表示方法经历了从统计模型到深度语义理解的演进。早期的词袋模型(BoW)通过统计单词出现频次实现,简单直接;后续的TF-IDF引入逆文档频率,有效压制常见词的干扰,一度成为工业界标准;如今,大语言模型(LLM)生成的嵌入(如Sentence-BERT)能捕捉上下文语义,成为前沿研究的热门。但在实际业务中,哪种方法更高效?何时采用轻量方案,何时必须引入复杂模型?
本文以一个真实的新闻分类与聚类项目为案例,给出明确答案。我们将使用同一套新闻数据集,分别基于BoW、TF-IDF和LLM嵌入构建特征,并在Scikit-learn中训练多种分类器(逻辑回归、随机森林、SVM),对比性能;同时,评估它们在无监督聚类场景下的表现。你会发现,最先进的技术并非总是最优——对于某些任务,传统方法反而更快更准。
本文内容源自过往咨询项目的技术沉淀,并经过实际业务验证。项目完整代码与数据已分享至交流社群。
1. 文本表示:从词袋到语义嵌入
在机器学习中,文本必须转换为数值向量才能被算法处理,这一过程称为“文本表示”或“特征提取”。以下通过通俗类比理解三种主流方法:
- 词袋模型(BoW):相当于为每篇文章建立一个“词汇表”,统计每个词的出现次数。它忽略词序和语法,仅关注“是否存在”及“频次”。优势在于简单快速,劣势是丢失语义信息(例如“苹果好吃”与“好吃苹果”的向量完全相同)。
- TF-IDF:在BoW基础上为每个词赋予权重——若某个词出现在大量文档中(如“的”“是”),其重要性降低;若仅出现在少数文档中,则重要性提高。这样能突出具有区分度的关键词。
- LLM嵌入:利用预训练的大语言模型(如BERT),将整个句子或段落映射为稠密向量(例如384维)。此向量不仅包含词汇信息,还融入了上下文语义,因此能区分“苹果”指代水果还是公司。
2. 数据准备与特征生成
首先导入所需库,加载BBC新闻数据集(共2225篇新闻,涵盖5个类别),然后划分为训练集和测试集。
print(f"类别: {df['category'].unique()}")
# 分离文本和标签
documents = df['text'].tolist()
raw_labels = df['category'].tolist()
# 标签编码
label_encoder = LabelEncoder()
encoded_labels = label_encoder.fit_transform(raw_labels)
# 划分训练集和测试集(保证各类别比例一致)
docs_train, docs_test, y_train, y_test = train_test_split(
documents, encoded_labels, test_size=0.2, random_state=42, stratify=encoded_labels
)
print(f"训练集: {len(docs_train)} 篇, 测试集: {len(docs_test)} 篇")
2.1 词袋模型特征
使用 CountVectorizer 构建词袋,设置最大特征数为5000,过滤出现次数过少(<2)的词以及英文停用词。
2.2 TF-IDF特征
使用 TfidfVectorizer,参数与词袋保持一致,便于对比。
print("n[2] 生成TF-IDF特征...")
start_time = time()
tfidf_vec = TfidfVectorizer(
max_features=5000,
min_df=2,
stop_words='english'
)
X_tfidf_train = tfidf_vec.fit_transform(docs_train)
X_tfidf_test = tfidf_vec.transform(docs_test)
tfidf_elapsed = time() - start_time
print(f"完成,耗时 {tfidf_elapsed:.2f} 秒")
print(f"训练集形状: {X_tfidf_train.shape}")
print(f"稀疏度: {(1 - X_tfidf_train.nnz / (X_tfidf_train.shape[0] * X_tfidf_train.shape[1])) * 100:.1f}%")
2.3 LLM嵌入特征
加载预训练模型 all-MiniLM-L6-v2,该模型将句子映射为384维的稠密向量。
至此,我们获得三组特征:X_bow_train、X_tfidf_train、X_emb_train及其对应的测试集。接下来将用于监督分类与无监督聚类。
3. 比较一:文本分类性能
选择三种经典分类器:逻辑回归(LR)、随机森林(RF)和线性支持向量机(SVM)。在三组特征上分别训练并评估,记录准确率、F1分数和训练时间。
输出结果如下:
为直观对比,绘制准确率与训练时间的柱状图:
# 省略绘图代码(完整代码见社群)
分类结果解读
结果显示,TF-IDF + SVM 组合以0.987的准确率夺冠,而LLM嵌入 + 逻辑回归 训练最快(0.27秒)。令人意外的是,最先进的LLM嵌入并未在所有指标上领先。原因在于BBC新闻数据集本身类别区分度极高(例如体育类文章频繁出现“足球”“比赛”等词),传统词频特征已能充分捕捉规律;嵌入模型带来的语义抽象反而可能引入噪声,且训练时间更长。
这表明:实际项目中应优先从简单方法入手,待简单方法难以胜任时再考虑复杂模型。针对该数据集,TF-IDF + 逻辑回归在精度与速度之间取得了最佳平衡(准确率0.984,训练0.52秒),是理想的基线方案。
4. 比较二:文档聚类
无监督聚类不依赖标签,我们采用K-Means(k=5,与真实类别数一致),分别对三种特征进行聚类,并评估聚类质量。
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, adjusted_rand_score
# 使用全量数据生成特征
X_bow_full = bow_vec.fit_transform(documents)
X_tfidf_full = tfidf_vec.fit_transform(documents)
X_emb_full = embedder.encode(documents, show_progress_bar=True, batch_size=32)
n_clusters = len(label_encoder.classes_)
cluster_results = []
full_reps = {
'BoW': X_bow_full,
'TF-IDF': X_tfidf_full,
'LLM Embeddings': X_emb_full
}
for rep_name, X_full in full_reps.items():
print(f"n使用 {rep_name} 聚类...")
t0 = time()
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
pred_clusters = kmeans.fit_predict(X_full)
cluster_time = time() - t0
# 轮廓系数(内部指标)
sil = silhouette_score(X_full, pred_clusters)
# 调整兰德指数(外部指标,需要真实标签)
ari = adjusted_rand_score(encoded_labels, pred_clusters)
print(f"轮廓系数: {sil:.3f}, 调整兰德指数: {ari:.3f}, 耗时: {cluster_time:.2f}秒")
cluster_results.append({
'Representation': rep_name,
'Silhouette': sil,
'ARI': ari,
'Time': cluster_time
})
cluster_df = pd.DataFrame(cluster_results)
输出:
聚类质量可视化:
聚类结果解读
在聚类任务中,LLM嵌入以0.899的调整兰德指数(ARI)大幅领先,表示其生成的簇与真实类别高度吻合。这是因为聚类完全依赖特征的内在结构,而嵌入蕴含的语义相似性有助于将同主题文档聚集。尽管TF-IDF在分类中表现优异,但在无监督场景下,其基于词频的向量难以形成语义紧凑的簇(轮廓系数仅0.016)。因此,若任务目标是探索性分析或主题发现,LLM嵌入是更优选择。
5. 总结与业务建议
通过对新闻数据集的对比分析,我们得出以下实用指南:
| 任务类型 | 推荐方法 | 理由 |
|---|---|---|
| 快速构建分类基线 | TF-IDF + 逻辑回归 | 精度接近最优,训练快,可解释性强。 |
| 追求最高分类精度 | TF-IDF + SVM(线性) | 数据线性可分时,SVM能最大化间隔,效果最佳。 |
| 大规模分类需实时预测 | LLM嵌入 + 逻辑回归/SVM | 嵌入维度低(384维),模型轻量,预测速度快(但生成嵌入需计算资源)。 |
| 无监督主题聚类 | LLM嵌入 + K-Means | 语义信息有效聚合相似文档,明显优于词频方法。 |
| 极度简单且需解释 | 词袋 + 随机森林 | 可查看特征重要性,但精度略低。 |
关键洞察:没有一种方法能统治所有场景。先进技术(如LLM)在需要语义理解的任务中优势显著,但在信号充足的传统分类任务中,传统方法(如TF-IDF)凭借高效与稳健,依然不可替代。实际项目应遵循“由简入繁”的原则,以最小成本先验证可行性,再逐步升级。