2017-05-04 38 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! –

相關問題