Word2Vecを使ってみる
はじめに
Pythonの自然言語処理系のライブラリであるgensimでWord2Vecを使ってみます。
データ準備
Word2Vecにかけるデータを準備します。分かち書きされている文章をリストにまとめたものならOKです。
前回の記事で紹介したMeCabを使っています。
import MeCab mecab = MeCab.Tagger("-Ochasen") s1 = 'おいしいパスタつくったお前' s2 = 'あなたを詐欺罪と器物損壊罪で訴えます' s3 = 'その点トッポってすげぇよな' data =[s1,s2,s3] def wakachigaki_bow(s): wakachi = mecab.parse(s).split('\n') wakachi = [w.split('\t') for w in wakachi if len(w.split('\t')) > 1] wakachi = list(filter(lambda x: x[3][:2] == '名詞' or x[3][:2] == '動詞' or x[3][:3] == '形容詞', wakachi)) wakachi_base = [w[2] for w in wakachi] return wakachi_base sentences = [wakachigaki_bow(s) for s in data] print(sentences) # [['おいしい', 'パスタ', 'つくる', 'お前'], ['あなた', '詐欺', '罪', '器物', '損壊', '罪', '訴える'], ['点', 'トッポ', 'すげる', 'ぇよな']]
早速まわしてみる
準備したデータをモデルにつっこみます。
from gensim.models import Word2Vec model = Word2Vec(sentences, min_count=1) print(model.wv['パスタ']) print(model.wv.most_similar('パスタ', topn = 3)) # [ 9.7702928e-03 8.1651136e-03 1.2809705e-03 5.0975773e-03 # 1.4081288e-03 -6.4551616e-03 -1.4280510e-03 6.4491653e-03 # -4.6173073e-03 -3.9930656e-03 4.9244044e-03 ...] # [('ぇよな', 0.17272794246673584), ('点', 0.16694681346416473), ('器物', 0.11117953807115555)]
学習済みのモデルから試しに2つ出力してみました。
・単語の分散表現
.wv['key']で単語の分散表現を出力できます(デフォルトだと100次元)。
・類語
.wv.most_similar('key', topn = n)でkeyとなった単語の類語(上位n個)を出力できます。
コサイン類似度の高いものから順に単語を出力しているようです。
参考