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/