可视化从gensim生成的word2vec

Dre*_*ams 15 data-visualization gensim scikit-learn word2vec

我使用gensim在我自己的语料库上训练了doc2vec和相应的word2vec.我想用t-sne用文字来形象化word2vec.如图所示,图中的每个点都有"单词".

我在这里看了一个类似的问题:t-sne on word2vec

在它之后,我有这个代码:

import gensim import gensim.models as g

from sklearn.manifold import TSNE
import re
import matplotlib.pyplot as plt

modelPath="/Users/tarun/Desktop/PE/doc2vec/model3_100_newCorpus60_1min_6window_100trainEpoch.bin"
model = g.Doc2Vec.load(modelPath)

X = model[model.wv.vocab]
print len(X)
print X[0]
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X[:1000,:])

plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show()
Run Code Online (Sandbox Code Playgroud)

这给出了一个带点但没有单词的图形.那是我不知道哪个点代表哪个词.如何用点显示单词?

Nie*_*uin 37

答案的两个部分:如何获取单词标签,以及如何在散点图上绘制标签.

在gensim的word2vec中的单词标签

model.wv.vocab是{word:数字向量的对象}的词典.为了将数据加载到Xt-SNE,我做了一个改变.

vocab = list(model.wv.vocab)
X = model[vocab]
Run Code Online (Sandbox Code Playgroud)

这实现了两件事:(1)它为您vocab绘制最终数据框的独立列表,以及(2)当您编制索引时model,您可以确定您知道单词的顺序.

像以前一样继续

tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

现在让我们把它放在X_tsne一起vocab.大熊猫很容易,所以import pandas as pd如果你还没有.

df = pd.DataFrame(X_tsne, index=vocab, columns=['x', 'y'])
Run Code Online (Sandbox Code Playgroud)

词汇单词现在是数据帧的索引.

我没有您的数据集,但在您提到的另一个SO中,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
Run Code Online (Sandbox Code Playgroud)

散点图

我喜欢matplotlib的面向对象方法,所以这开始有点不同.

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

ax.scatter(df['x'], df['y'])
Run Code Online (Sandbox Code Playgroud)

最后,该annotate方法将标记坐标.前两个参数是文本标签和2元组.使用iterrows(),这可以非常简洁:

for word, pos in df.iterrows():
    ax.annotate(word, pos)
Run Code Online (Sandbox Code Playgroud)

[感谢里卡多对此建议的评论.]

然后做plt.show()fig.savefig().根据您的数据,您可能不得不捣乱ax.set_xlimax.set_ylim看到密集的云.这是没有任何调整的新闻组示例:

散点图

您也可以修改点大小,颜色等.快乐微调!

  • @NielsJoaquin,我们应该做些什么以仅可视化特定单词的相似单词? (3认同)
  • 做了两个改变:`vocab`作为df索引和'iterrows`简化.谢谢,@ RicardoCruz! (2认同)