gensimのword2vecの結果を手軽に可視化する方法

gensimで学習させたword2vecの分散表現ベクトルを、scikit-learnのt-SNEで次元圧縮してプロットする。

#word2vecを学習させる
import gensim
model = gensim.models.Word2Vec(sentences, min_count=5)#sentencesの中身は[["こういう", "文章","の","配列"],["単語","単語",...],...]
word2vec_model=model

#必要なライブラリをインポート
import matplotlib.pyplot as plt 
from sklearn.manifold import TSNE
import numpy as np


#取り出す単語の範囲を指定
skip=0
limit=241#よく出る241単語のみをプロットする

#word2vecの結果をt-SNEで次元圧縮
vocab = word2vec_model.__dict__['index2word']
emb_tuple = tuple([word2vec_model[v] for v in vocab])
X = np.vstack(emb_tuple)

model = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
model.fit_transform(X) 

#matplotlibでt-SNEの図を描く
plt.figure(figsize=(40,40))#図のサイズ
plt.scatter(model.embedding_[skip:limit, 0], model.embedding_[skip:limit, 1])

count = 0
for label, x, y in zip(vocab, model.embedding_[:, 0], model.embedding_[:, 1]):

    count +=1
    if(count<skip):continue
    plt.annotate(label, xy=(x, y), xytext=(0, 0), textcoords='offset points')
    if(count==limit):break
plt.show()


参考

stack overflow 「How to run tsne on word2vec created from gensim?」 http://stackoverflow.com/questions/40581010/how-to-run-tsne-on-word2vec-created-from-gensim

Quora 「How do I visualise word2vec word vectors?」 https://www.quora.com/How-do-I-visualise-word2vec-word-vectors