如何将关键词与dendrogram算法生成的聚类ID对应关联?
解决层次聚类中关键词与聚类ID的关联问题
你当前用dendrogram返回的res['leaves']只是树状图最后p个聚类的节点索引,无法直接对应到每个关键词的聚类归属。正确的做法是用scipy.cluster.hierarchy里的fcluster函数,直接生成每个关键词对应的聚类标签,具体修改步骤如下:
1. 导入必要函数
确保导入fcluster:
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
2. 修改聚类代码
替换原代码中dendrogram及后续部分,用fcluster生成每个样本的聚类标签:
def clusterize(self, keywords): preprocessed_keywords = normalize(keywords) # 生成TF-IDF向量 tfidf_matrix = self.vectorizer.fit_transform(preprocessed_keywords) # 计算层次聚类的链接矩阵 linkage_matrix = linkage(tfidf_matrix.todense(), method="ward") # 生成每个关键词的聚类标签,指定最多生成self.n_clusters个聚类 cluster_labels = fcluster(linkage_matrix, t=self.n_clusters, criterion='maxclust') # 将关键词与聚类标签关联,可以返回配对列表或分组字典 # 方式1:返回关键词-聚类标签的配对列表 keyword_cluster_pairs = list(zip(keywords, cluster_labels)) # 方式2:按聚类ID分组,返回字典(key是聚类ID,value是对应关键词列表) # from collections import defaultdict # cluster_groups = defaultdict(list) # for kw, label in zip(keywords, cluster_labels): # cluster_groups[label].append(kw) return keyword_cluster_pairs # 或返回cluster_groups
3. 结果说明
cluster_labels是一个长度和输入keywords一致的数组,每个元素对应位置关键词的聚类ID(比如当self.n_clusters=3时,标签会是1、2、3中的一个)。- 用
zip可以直接把原始关键词和聚类标签一一配对,方便查看每个关键词的归属;用字典分组则能直接得到每个聚类下的所有关键词集合。
为什么原代码的res['leaves']没用?
dendrogram返回的res['leaves']只是树状图绘制时的叶子节点顺序索引,仅代表最后p个聚类的节点标识,并非每个样本的聚类归属,所以无法用来建立关键词和聚类的对应关系。
内容的提问来源于stack exchange,提问作者Dany M
相关产品推荐
相关产品推荐

