You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:22:43