使用Word2Vec+TSNE绘制相近词时触发ValueError问题求助
问题修复:Word2Vec t-SNE散点图代码的ValueError解决
错误根源分析
- 维度不匹配问题:
arr是初始化的二维数组(形状(0,300)),但test_model.wv[word]返回的是一维词向量(形状(300,)),用np.append指定axis=0时,要求输入数组维度完全一致,因此触发ValueError。 - 逻辑错误:循环里重复添加原词
word的向量,而非相似词的向量,导致所有点都是同一个向量的t-SNE结果,完全失去展示相似词分布的意义。
修复后的完整代码
import numpy as np from sklearn.manifold import TSNE import matplotlib.pyplot as plt def display_closestwords_tsnescatterplot(test_model, word): arr = np.empty((0, 300), dtype='f') word_labels = [word] # 获取目标词的相似词列表 close_words = test_model.wv.similar_by_word(word) # 将原词向量转为二维数组后添加(匹配arr的维度) arr = np.append(arr, np.array([test_model.wv[word]]), axis=0) for wrd_score in close_words: wrd = wrd_score[0] word_labels.append(wrd) # 添加相似词的向量,同样转为二维数组 arr = np.append(arr, np.array([test_model.wv[wrd]]), axis=0) # t-SNE降维处理 tsne = TSNE(n_components=2, random_state=0) np.set_printoptions(suppress=True) Y = tsne.fit_transform(arr) x_coords = Y[:, 0] y_coords = Y[:, 1] # 绘制散点图并标注 plt.scatter(x_coords, y_coords) for label, x, y in zip(word_labels, x_coords, y_coords): plt.annotate(label, xy=(x, y), xytext=(0, 0), textcoords='offset points') # 调整坐标轴范围,避免标签被截断 plt.xlim(x_coords.min() - 0.5, x_coords.max() + 0.5) plt.ylim(y_coords.min() - 0.5, y_coords.max() + 0.5) plt.show() # 调用示例 display_closestwords_tsnescatterplot(test_model, 'river')
关键修改说明
- 所有添加向量的操作都用
np.array([向量])将一维词向量包裹为二维数组(形状从(300,)变为(1,300)),和arr的维度保持一致。 - 修正循环逻辑,改为添加相似词的向量,确保散点图展示原词+相似词的真实分布。
- 微调坐标轴范围的计算,让标签显示更完整(原代码的
+0.00005几乎无实际作用)。
内容的提问来源于stack exchange,提问作者Dez Miller
相关产品推荐
相关产品推荐

