LLM与词袋、TF-IDF在新闻数据集上分类与聚类多维对比 | 附代码数据
全文链接:https://tecdat.cn/?p=45139 Dawei Zhou 想象一下,你手头有数千篇新闻稿件,需要快速将它们分类到体育、财经、科技等不同栏目,或者自动发现其中隐藏的主题模式。在没有人工智能的年代,这需要大量人工阅读和标注,费时费力。如今,借助机器学习,我们只需将文本转换为计算机能理解的数字形式,模型便能自动完成这些任务。然而,如何将文字转化为有效的数字特征,却是一门学问。 在过去的二十年里,文本表示方法经历了从简单统计到深度语义理解的演进:早期的词袋模型(Bag-of-Words, BoW) 简单粗暴,通过统计单词出现次数构建向量;随后的TF-IDF 引入词频逆文档频率,降低常见词干扰,一度成为工业界标配;如今,大语言模型(LLM)生成的嵌入(如Sentence-BERT)能捕捉上下文语义,成为前沿研究的宠儿。但哪种方法在实际业务中效果更好?何时该用简单方法,何时必须上复杂模型? 本文将通过一个真实的新闻分类与聚类项目,为你揭晓答案。我们将使用新闻数据集,分别用BoW、TF-IDF和LLM嵌入构建特征,在Scikit-learn中训练多种分类器(逻辑回归、随机森林、SVM)并评估性能;同时对比它们在无监督聚类中的表现。你会发现,最先进的方法并不总是最优——对于某些任务,传统方法反而更快更准。 本文内容改编自过往客户咨询项目的技术沉淀并且已通过实际业务校验,该项目完整代码与数据已分享至交流社群。阅读原文进群获取更多最新AI见解和行业洞察,可与900+行业人士交流成长;还提供人工答疑,拆解核心原理、代码逻辑与业务适配思路,帮大家既懂“怎么做”,也懂“为什么这么做”;遇代码运行问题,更能享24小时调试支持。 在机器学习中,文本必须转化为数值向量才能被算法处理。这一过程称为“文本表示”或“特征提取”。让我们用通俗的比喻来理解三种主流方法: 下面,我们将在Python中为同一批新闻数据生成这三种表示。 首先导入所需库,加载BBC新闻数据集(包含2225篇新闻,分5类),并划分为训练集和测试集。 使用 使用 加载预训练模型 至此,我们得到了三组特征: 阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。 我们选择三种经典分类器:逻辑回归(LR)、随机森林(RF)和线性支持向量机(SVM)。分别在三组特征上训练并评估,记录准确率、F1分数和训练时间。 输出结果如下: 为了直观对比,绘制准确率和训练时间的柱状图: 阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。 相关文章 原文链接:https://tecdat.cn/?p=44060 从结果看,TF-IDF + SVM 组合以0.987的准确率拔得头筹,而LLM嵌入 + 逻辑回归 训练最快(0.27秒) 。令人意外的是,最先进的LLM嵌入并未在所有指标上领先。原因在于BBC新闻数据集本身类别区分度极高(如体育类文章大量出现“足球”“比赛”等词),传统词频特征已足够捕捉规律;而嵌入模型带来的语义抽象反而可能引入噪声,且训练耗时更长。 这表明:在实际项目中,应从简单方法开始,只有当简单方法遇到瓶颈时,再考虑引入复杂模型。对于本数据集,TF-IDF + 逻辑回归 在精度和速度上取得了最佳平衡(准确率0.984,训练0.52秒),是理想的基线方案。 无监督聚类不依赖标签,我们使用K-Means(k=5,与真实类别数一致)对三种特征分别聚类,评估聚类质量。 输出: 聚类质量可视化: 阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。 在聚类任务中,LLM嵌入以0.899的调整兰德指数(ARI)遥遥领先,表明其生成的簇与真实类别高度吻合。这是因为聚类完全依赖特征本身的内在结构,而嵌入包含了语义相似性,能更好地将同一主题的文章聚集在一起。尽管TF-IDF在分类中表现优异,但在无监督场景下,其基于词频的向量难以形成语义紧致的簇(轮廓系数仅0.016)。因此,若任务目标是探索性分析或主题发现,LLM嵌入是更优选择。 通过新闻数据集的对比分析,我们得出以下实用指南: 关键洞察:没有一种方法能统治所有场景。先进技术(如LLM)在需要语义理解的任务中优势明显,但在强信号的传统分类任务中,传统方法(如TF-IDF)凭借高效和鲁棒性依然不可替代。实际项目应遵循“由简入繁”的原则,以最小成本验证可行性,再逐步升级。 阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。 本文所有代码和数据已上传至交流社群,如需完整代码(包括绘图、交叉验证、超参数调优等),请扫描下方二维码或点击“阅读原文”加入社群,与900+同行交流成长,获取24小时技术支持。
原文出处:拓端数据部落公众号关于分析师
麦吉尔大学计算机科学与统计专业。熟练使用Python、R、SQL、C、stata、Wind数据分析软件,专注于金融、数理统计领域。引言
1. 文本表示:从词袋到语义嵌入
2. 数据准备与特征生成
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. 比较一:文本分类性能
# 省略绘图代码(完整代码见社群)DeepSeek、LangGraph和Python融合LSTM、RF、XGBoost、LR多模型预测NFLX股票涨跌|附完整代码数据
分类结果解读
4. 比较二:文档聚类
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)聚类结果解读
5. 总结与业务建议
任务类型 推荐方法 理由 快速构建分类基线 TF-IDF + 逻辑回归 精度接近最优,训练快,可解释性强。 追求最高分类精度 TF-IDF + SVM(线性) 当数据线性可分时,SVM能最大化间隔,效果最佳。 大规模分类需实时预测 LLM嵌入 + 逻辑回归/SVM 嵌入维度低(384维),模型轻量,预测速度快(但生成嵌入需算力)。 无监督主题聚类 LLM嵌入 + K-Means 语义信息能有效聚合相似文档,显著优于词频方法。 极度简单且需解释 词袋 + 随机森林 可查看特征重要性,但精度略低。 附录:代码获取与交流