2017-05-04 22 views
10

gensimを使用して自分のコーパスにdoc2vecと対応するword2vecを訓練しました。私は言葉でt-sneを使ってword2vecを視覚化したい。のように、図の各ドットにも「単語」があります。gensimから生成されたword2vecを可視化します

私はここに同様の質問を見て

:gと

輸入gensim 輸入gensim.models

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() 

これは、との数字を与える:t-sne on word2vec

がそれに続いて、私はこのコードを持っていますドットはあるが言葉はない。それはどのドットがどの単語を代表するのか分かりません。どのようにしてドットでその単語を表示できますか?

答えて

20

答えには2つの部分があります。単語ラベルを取得する方法、および散布図にラベルをプロットする方法。 gensimのword2vec

model.wv.vocab

ワードラベルは{:数値ベクトルの目的語}の辞書です。 t-SNEのためにXにデータをロードするために、私は1つの変更を行いました。

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

これは二つのことを達成:(1)それはあなたのプロットへの最終データフレーム用のスタンドアロンvocabリストを取得し、あなたのインデックスmodel(2)、あなたは言葉の順序を知っていることを確認することができたときに。

は、以前のように今

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

を進めるのは、vocabリストと一緒にX_tsneを入れてみましょう。これはパンダで簡単ですので、まだ持っていない場合は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つの引数は、テキストラベルと2タプルです。 iterrows()を使用して、これは非常に簡潔になります

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

[リカルドのおかげで、この提案のためのコメントで。]

その後plt.show()またはfig.savefig()を行います。あなたのデータによっては、密度の高いクラウドを見るには、おそらくax.set_xlimax.set_ylimを混乱させる必要があります。これは、任意の微調整せずにニュースグループの例です:

scatterplot

あなたも、等のドットサイズ、色を変更することができます。ハッピーファインチューニング!

+1

素晴らしい作品! df.iterrows()のpos:word、pos:plt.annotate(word、pos) 'df = pd.DataFrame(X2、vocab、['x'、 'y']) '。すなわち、単語を索引として使用する。あなたは 'concat'と他の行を取り除くことができます。 –

+2

dfインデックスとしての 'vocab'と' iterrows'単純化の2つの変更を行いました。ありがとう、@ RicardoCruz! –

関連する問題