基于NLTK的K-means聚类结果可视化方法求助
嘿,我懂你现在的困扰——Word2Vec生成的词向量都是高维的(一般是100、200维甚至更高),直接用plt.scatter()肯定搞不定,毕竟散点图只能处理2D或者3D的数据嘛。我给你一套适配你现有代码的可视化方案,一步步来解决:
Word2Vec K-means聚类结果可视化方案
咱先明确核心问题:高维向量必须先做降维处理,才能用散点图展示。常用的降维工具是PCA(速度快,适合大语料)或者t-SNE(对词向量这类非线性结构的可视化效果更好,适合小语料)。下面结合你现有的代码来实现:
1. 补全需要的依赖库
import matplotlib.pyplot as plt from sklearn.decomposition import PCA # 如果想用效果更优的t-SNE,导入这个:from sklearn.manifold import TSNE import numpy as np
2. 整理聚类数据(修正代码小细节)
看你代码里的model[abc.vocab]应该是笔误,换成model.wv.vocab对应的向量就好,同时把词列表和聚类标签对应上:
# 你的原有代码(修正小错误) X = model[model.wv.vocab] Cluster = 2 Kcluster = KMeansClusterer(Cluster, distance=nltk.cluster.util.cosine_distance, repeats=25) ApplyCluster = Kcluster.cluster(X, assign_clusters=True) # 直接用X即可,X就是所有词的向量 # 保存所有词的列表,后续给散点加标签用 words = list(model.wv.vocab.keys())
3. 对高维词向量降维
选项A:用PCA快速降维(适合词量很大的场景)
PCA速度快,能快速把高维数据压缩到2维:
pca = PCA(n_components=2) # 降到2维适配散点图 reduced_vecs = pca.fit_transform(X)
选项B:用t-SNE降维(可视化效果更清晰,适合词量不多的场景)
t-SNE能更好保留词之间的语义关联,但速度会慢一些:
tsne = TSNE(n_components=2, random_state=42) # 固定random_state保证结果可复现 reduced_vecs = tsne.fit_transform(X)
如果词量过大导致t-SNE速度太慢,可以先通过PCA降到50维,再用t-SNE压缩到2维:
pca = PCA(n_components=50) mid_vecs = pca.fit_transform(X) tsne = TSNE(n_components=2, random_state=42) reduced_vecs = tsne.fit_transform(mid_vecs)
4. 绘制带聚类标识的散点图
plt.figure(figsize=(12, 8)) # 设置合适的画布大小 # 按聚类分组绘制散点 for cluster_id in range(Cluster): # 筛选当前聚类的所有点索引 cluster_indices = np.where(np.array(ApplyCluster) == cluster_id) cluster_points = reduced_vecs[cluster_indices] # 绘制散点 plt.scatter(cluster_points[:, 0], cluster_points[:, 1], label=f"Cluster {cluster_id+1}", alpha=0.7) # 可选:给每个点添加对应词标签(词量少的时候建议加,更直观) for i, word in enumerate(np.array(words)[cluster_indices]): plt.annotate(word, (cluster_points[i, 0], cluster_points[i, 1]), fontsize=9) plt.title("Word2Vec K-means Clustering Visualization") plt.legend() plt.show()
小技巧:解决标签重叠问题
如果词量较多导致标签重叠,可以用adjustText库自动调整标签位置:
from adjustText import adjust_text # 先收集所有标签 texts = [] for i, word in enumerate(words): texts.append(plt.text(reduced_vecs[i,0], reduced_vecs[i,1], word, fontsize=9)) # 自动调整标签位置,避免重叠 adjust_text(texts)
这样你就能清晰看到不同聚类的词在二维空间中的分布啦~
内容的提问来源于stack exchange,提问作者Tuấn Mạnh Nguyễn
相关产品推荐
相关产品推荐

