用层次聚类给文本自动分个类:从词向量到TF-IDF的完整实战(含Scipy linkage详解)

张开发
2026/4/19 23:29:12 15 分钟阅读

分享文章

用层次聚类给文本自动分个类:从词向量到TF-IDF的完整实战(含Scipy linkage详解)
用层次聚类给文本自动分个类从词向量到TF-IDF的完整实战当面对海量文本数据时如何快速发现隐藏的语义结构层次聚类提供了一种直观的解决方案。不同于K-means需要预设类别数量层次聚类通过构建树状图Dendrogram揭示数据多层次的聚合关系特别适合探索性数据分析。下面我们将从特征工程到结果解读完整走通文本聚类的全流程。1. 文本特征工程从词袋到语义文本聚类的第一步是将非结构化的文字转化为计算机可处理的数值向量。目前主流方法可分为基于统计和基于语义两大类1.1 TF-IDF经典的词频统计方法TF-IDF通过衡量词语在文档中的相对重要性构建特征向量。其核心思想是词频TF词语在当前文档出现的频率逆文档频率IDF降低常见词语权重的惩罚因子from sklearn.feature_extraction.text import TfidfVectorizer corpus [苹果发布新款手机, 新能源汽车销量暴涨, 苹果股价创新高] vectorizer TfidfVectorizer(token_patternr(?u)\b\w\b) X vectorizer.fit_transform(corpus) print(X.toarray())注意中文文本需先分词可通过token_pattern参数调整token匹配规则1.2 词向量捕捉语义关系Word2Vec、FastText等模型生成的词向量能捕捉词语的语义关系。对于文档表示常用方法有简单平均对文档中所有词的向量取均值加权平均结合TF-IDF权重对词向量加权import numpy as np from gensim.models import Word2Vec # 假设已有训练好的词向量模型 model Word2Vec.load(word2vec.model) def doc2vec(doc): vectors [model.wv[word] for word in doc if word in model.wv] return np.mean(vectors, axis0) if vectors else np.zeros(model.vector_size)两种方法的对比特征类型优势局限性TF-IDF计算简单解释性强忽略词序无法捕捉语义词向量保留语义关系需要预训练模型长文档效果不稳定2. 距离度量文本相似性计算选择合适的距离度量对聚类效果至关重要。常见文本距离包括2.1 余弦相似度最适合衡量文本相似度关注向量方向而非长度from scipy.spatial.distance import pdist # 对TF-IDF矩阵计算 tfidf_dist pdist(X.toarray(), metriccosine) # 对词向量矩阵计算 w2v_dist pdist(np.array([doc2vec(doc) for doc in docs]), metriccosine)2.2 其他距离度量对比度量方式公式特点适用场景欧式距离直线距离低维数值数据杰卡德距离集合相似度短文本、关键词集合编辑距离字符操作次数拼写检查、DNA序列提示文本数据通常稀疏且高维余弦距离比欧式距离更合理3. 层次聚类实战Scipy全流程3.1 linkage函数详解scipy.cluster.hierarchy.linkage是层次聚类的核心函数其method参数决定簇间距离的计算方式from scipy.cluster.hierarchy import linkage # 使用Ward方法最小化方差 Z linkage(tfidf_dist, methodward)主要method参数对比single最小距离易形成链条状聚类complete最大距离倾向生成紧凑簇average平衡折中计算复杂度适中ward最小化簇内方差适合均匀大小的簇3.2 树状图可视化树状图直观展示聚类过程帮助确定最佳切割点import matplotlib.pyplot as plt from scipy.cluster.hierarchy import dendrogram plt.figure(figsize(10, 5)) dendrogram(Z, labelslabels, orientationtop) plt.axhline(y0.8, ck, ls--) # 假设0.8为切割阈值 plt.show()树状图解读要点纵轴高度表示合并时的距离横轴标签顺序反映聚类相似性切割线位置决定最终簇数量4. 结果提取与应用4.1 簇标签生成使用fcluster根据阈值获取最终分类from scipy.cluster.hierarchy import fcluster # 按距离阈值切割 clusters fcluster(Z, t0.8, criteriondistance) # 按预设簇数量切割 k 3 clusters fcluster(Z, tk, criterionmaxclust)4.2 结果分析与优化典型的结果分析流程统计簇大小分布检查是否出现极端大簇或大量单点簇关键词提取用TF-IDF或词向量中心点解释簇主题参数调优尝试不同距离度量和linkage方法组合# 分析各簇关键词 from collections import Counter for i in range(max(clusters)): cluster_docs [docs[j] for j in range(len(docs)) if clusters[j]i1] words [word for doc in cluster_docs for word in doc] print(fCluster {i1} top words:, Counter(words).most_common(5))实际项目中建议先用小样本测试不同参数组合再扩展到全量数据。对于新闻标题聚类ward方法余弦距离的组合通常表现稳定而短文本评论可能更适合complete linkage。

更多文章