け日記

最近はPythonでいろいろやってます

Sudachiベースの学習済みWord2Vecモデルを使う

お仕事でSudachiを使って形態素解析を行っているのですが、それと互換した単語埋め込みモデルが必要になりました。

Sudachiの開発元であるワークスアプリケーションズさんから、Sudachiで分かち書き・学習したWord2Vecモデルが提供されています。

大規模コーパスと複数粒度分割による日本語単語分散表現

モデルのダウンロード

上のURLから学習済みモデルをダウンロードします。

  • 20190314のバージョンで、語数3644628、次元数300となってます
  • 圧縮ファイルで5GB、解凍後で12GBくらいありますので注意してください
$ wget https://object-storage.tyo2.conoha.io/v1/nc_2520839e1f9641b08211a5c85243124a/word_vector/nwjc.sudachi_full_abc_w2v.20190314.tar.gz

$ tar -zxvf ./nwjc.sudachi_full_abc_w2v.20190314.tar.gz

$ ls -l nwjc_sudachi_full_abc_w2v/
total 12229544
-rw-rw-r-- 1 1008 1008       11420 Mar 20 17:28 LICENSE
-rw-rw-r-- 1 1008 1008 12523039651 Mar 20 12:49 nwjc.sudachi_full_abc_w2v.txt

$ head -n2 nwjc_sudachi_full_abc_w2v/nwjc.sudachi_full_abc_w2v.txt
3644628 300-0.08509623 -0.02170456 -0.00595318 ...

gensimで操作しますので、こちらもインストールしておきます。

$ pip install gensim

モデルのロードと確認

sudachi_full_abc_w2v.txt (テキストフォーマット) はKeyedVectorsでロードできます。上のheadコマンドで見たように語数3644628, 次元数300となっていることも確認できます。

# モデルのロード
from gensim.models import KeyedVectors
from gensim.test.utils import datapath

nwjc_model = KeyedVectors.load_word2vec_format(
    datapath('/tf/rest_natural_word_search/nwjc_sudachi_full_abc_w2v/nwjc.sudachi_full_abc_w2v.txt'),
    binary=False
)

# 語数, 次元数
print(len(nwjc_model.vocab), nwjc_model.vector_size)  # 3644628 300

こうなるとgensimの普通のモデルの同じように取り扱えますので、例えばmost_similarメソッドで類似した言葉を取り出すこともできます。

print(nwjc_model.most_similar('平成', topn=5))
# [('年度', 0.8092531561851501),
#  ('平成元年', 0.7409119009971619),
#  ('同年', 0.6042426824569702),
#  ('基本計画', 0.5917632579803467),
#  ('別紙', 0.590812087059021)]

print(nwjc_model.most_similar(positive=['兄弟', '女'], negative=['男'], topn=5))
# [('姉妹', 0.7687463164329529),
#  ('兄妹', 0.7484474182128906),
#  ('姉弟', 0.715774416923523),
#  ('双子', 0.642593264579773),
#  ('妹', 0.6402267217636108)]