2017-05-04 232 views
10

我使用gensim在自己的语料库上训练了doc2vec和相应的word2vec。我想用t-sne和word来形象化word2vec。如图所示,图中的每个点都带有“单词”。可视化gensim生成的word2vec

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

跟随它,我有这样的代码:

进口gensim 进口gensim.models为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() 

这给出了一个数字点,但没有文字。那是我不知道哪个点代表哪个词。我怎样才能用圆点显示单词?

回答

20

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

在gensim的word2vec

model.wv.vocab字标签是{字:数值向量的对象的}一个字典。要将数据加载到t-SNE的X中,我做了一个更改。

vocab = list(model.wv.vocab) 
X = model[vocab] 

这完成两件事情:(1)它可以让你的独立vocab列表的最后数据帧绘制;(2)当您指数model,你可以肯定,你知道的单词的顺序。

继续与

tsne = TSNE(n_components=2) 
X_tsne = tsne.fit_transform(X) 

现在之前,让我们把X_tsnevocab名单在一起。这对大熊猫来说很简单,所以import pandas as pd如果你还没有。

df = pd.DataFrame(X_tsne, index=vocab, columns=['x', 'y']) 

的翻译的话是指数数据帧的现在。

我没有你的数据集,但在other SO你所提到的,使用sklearn的新闻组为例df看起来像

     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方法将标记坐标。前两个参数是文本标签和2元组。使用iterrows(),这可能是非常简洁:

for word, pos in df.iterrows(): 
    ax.annotate(word, pos) 

[多亏了这一建议的意见里卡多]

然后做plt.show()fig.savefig()。根据您的数据,您可能需要混淆ax.set_xlimax.set_ylim才能看到密集的云。这是一个没有任何调整的新闻组例如:

scatterplot

可以修改点的大小,颜色等,太。快乐微调!

+1

太棒了!我建议这个代码简化:'df = pd.DataFrame(X2,vocab,['x','y'])'然后'在df.iterrows()中为词,pos:plt.annotate(word,pos) '。即用这些词作为索引。你可以去掉'concat'和其他行。 –

+2

进行了两项更改:'vocab'作为df索引和'iterrows'简化。谢谢,@RicardoCruz! –

相关问题