word2vecとは?
- 言語モデルをもとに、単語をベクトル化して計算できるようにしたもの
- 学習させる言語モデルは自分で指定できる(例:NARUTOの世界観でモデルを作成するなど)
環境
- mac os x
- jupyter notebook
- python 3.8.2
学習済み日本語モデルを使う
-
今回は日本語版wikipediaをもとにした学習済みモデルを使用する
http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/
-
ダウンロードしたファイルを解凍する
-
"entity_vector.model.bin"を実行環境と同じディレクトリに移動させる
モデルをロードする
word2vec.py
import gensim
word2vec_model = gensim.models.KeyedVectors.load_word2vec_format('./entity_vector.model.bin', binary=True)
類似度の高いものを表示
word2vec.py
word2vec_model.most_similar(positive=['リンゴ'])
# 実行結果
# [('バナナ', 0.7925126552581787),
# ('イチゴ', 0.7851971387863159),
# ('パイナップル', 0.7774679660797119),
# ('トマト', 0.7547608017921448),
# ('ナッツ', 0.7491065263748169),
# ('キャンディー', 0.7482196092605591),
# ('[リンゴ]', 0.7430691719055176),
# ('林檎', 0.7421839237213135),
# ('クルミ', 0.7396929264068604),
# ('カボチャ', 0.7337167263031006)]
2つの単語の類似度を求める
word2vec.py
word2vec_model.similarity('魚', 'マグロ')
# 実行結果
# 0.6114297
word2vec_model.similarity('魚', 'ニワトリ')
# 実行結果
# 0.55593973
"魚"と"マグロ"は納得できるが、"魚"と"ニワトリ"は微妙
単語間で計算してみる
word2vec.py
# 女 + 王様 - 男
word2vec_model.most_similar(positive=['女', '王様'], negative=['男'])
# 実行結果
# [('お姫様', 0.7259089946746826),
# ('[シンデレラ]', 0.6741881370544434),
# ('貴婦人', 0.6695671081542969),
# ('[アリス_(不思議の国のアリス)]',0.6475884914398193),
# ('花嫁', 0.6458605527877808),
# ('妖精', 0.6455655097961426),
# ('道化師', 0.6381884813308716),
# ('姫君', 0.6307607889175415),
# ('魔女', 0.6281230449676514),
# ('魔法使い', 0.6276963949203491)]
まとめ
- word2vecを日本語版wikipediaをもとにした学習済みモデルで試してみた
- 日本語的に正しい部分もあるが、間違っている部分もある
参考文献
- 鈴木正敏, 松田耕史, 関根聡, 岡崎直観, 乾健太郎. Wikipedia 記事に対する拡張固有表現ラベルの多重付与. 言語処理学会第22回年次大会(NLP2016), March 2016
- http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/