答案分为两部分:如何获取单词标签,以及如何在散点图上绘制标签。
gensim 的 word2vec 中的单词标签
model.wv.vocab
是 {word: 数值向量的对象} 的字典。将数据加载到X
对于 t-SNE,我做了一处更改。
vocab = list(model.wv.key_to_index)
X = model.wv[vocab]
这完成了两件事:(1)它为您提供了一个独立的vocab
要绘制的最终数据帧的列表,以及 (2) 当您建立索引时model
,您可以确定您知道单词的顺序。
像以前一样继续
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
现在让我们把X_tsne
与vocab
列表。这对于 pandas 来说很容易,所以import pandas as pd
如果你还没有的话。
df = pd.DataFrame(X_tsne, index=vocab, columns=['x', 'y'])
词汇是indices现在的数据框。
我没有你的数据集,但在other SO https://stackoverflow.com/questions/40581010/how-to-run-tsne-on-word2vec-created-from-gensim你提到的一个例子df
使用 sklearn 的新闻组看起来像
x y
politics -1.524653e+20 -1.113538e+20
worry 2.065890e+19 1.403432e+20
mu -1.333273e+21 -5.648459e+20
format -4.780181e+19 2.397271e+19
recommended 8.694375e+20 1.358602e+21
arguing -4.903531e+19 4.734511e+20
or -3.658189e+19 -1.088200e+20
above 1.126082e+19 -4.933230e+19
散点图
我喜欢 matplotlib 的面向对象方法,所以这开始有点不同。
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df['x'], df['y'])
最后,annotate
方法将标记坐标。前两个参数是文本标签和二元组。使用iterrows()
,这可以非常简洁:
for word, pos in df.iterrows():
ax.annotate(word, pos)
[感谢里卡多在评论中提出的建议。]
Then do plt.show()
or fig.savefig()
。根据您的数据,您可能不得不搞乱ax.set_xlim
and ax.set_ylim
看到浓密的云层。这是没有任何调整的新闻组示例:
您也可以修改点的大小、颜色等。祝微调愉快!