web-dev-qa-db-ja.com

gensimから生成されたWord2vecを視覚化する

Gensimを使用して、doc2vecと対応するWord2vecを自分のコーパスでトレーニングしました。 t-sneを使用してWord2vecを視覚化したいと思います。同様に、図の各ドットには「Word」が付いています。

私はここで同様の質問を見ました: Word2vecのt-sne

それに続いて、私はこのコードを持っています:

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

これにより、点はあるが言葉がない図が得られます。つまり、どのドットがどのWordを表しているのかわかりません。 Wordをドットで表示するにはどうすればよいですか?

15
Dreams

答えの2つの部分:Wordラベルを取得する方法と、散布図でラベルをプロットする方法。

gensimのWord2vecのワードラベル

_model.wv.vocab_は{Word:数値ベクトルのオブジェクト}の辞書です。 t-SNEのデータをXにロードするために、1つの変更を加えました。

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

これにより、2つのことが実現します。(1)プロットする最終データフレームのスタンドアロンvocabリストを取得し、(2)modelにインデックスを付けると、順序が確実にわかるようになります。言葉の。

前と同じように進みます

_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'])
_

語彙は、データフレームのindicesになりました。

データセットはありませんが、 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_xlim_と_ax.set_ylim_をいじって密なクラウドを確認する必要があるでしょう。これは、調整を行わないニュースグループの例です。

scatterplot

ドットサイズ、色なども変更できます。幸せな微調整!

37
Niels Joaquin