PythonでWord2Vecをやりたい

単語や類するデータで、順番性を考慮して扱いたいことがあります。そんなときにWord2Vecを使うと非常に便利です。

データの読み込みとモデル化

1文を単語のリストとし、さらにその分を格納したリストをcorpusとして渡すだけです。

from gensim.models import word2vec

w2v = word2vec.Word2Vec(
  corpus,
  size=200,
  min_count=3, 
  window=10,
  iter=100
)

一緒に渡すパラメータはこれらです。単語数と、一文の長さで調整する感じになります。

  • size:次元数
  • min_count:扱う単語の頻度閾値
  • window:いくつ前後をみるか

あとは後述のベクトルの値を見て、iterを増やすかなどを考えます。

扱い方(単語間)

類似度がさくっと出せるのが便利です。

#negative=[]で単語間の引き算ができる
w2v.wv.most_similar(
  positive=["word"],
   topn=5
)

w2v.wv.similarity(w1="一つ目の単語", w2="二つ目の単語")
#w2v.wv.index2wordで単語のリストをとるなど

ベクトル

W2Vの最大の特徴は、ベクトル表現できることだと思っており、それらも簡単に取得できます。

#全単語のベクトル
w2v.wv.syn0

#一単語のベクトル
#w2v.wv.["キーワード"]

この辺のものをPCAやt-sneなどで次元圧縮して可視化します。

esu-ko.hatenablog.com

結果の保存

save,loadは独自のメソッドを持っているので注意が必要です。

w2v.save("w2v.mdl")

#専用のロード
model = word2vec.Word2Vec.load("w2v.mdl")