AI 物見遊山 - 自然言語処理編 - 単語のベクトル化 その弐

自然言語処理編 - 単語のベクトル化 その弐

アイキャッチ画像

自然言語処理の単語のベクトル化の続き。 ここでは、Meta(旧 Facebook)社が開発した分散表現を構築する手法である、fastText を試す。 fastText は、gensim から利用できる。

モデルの読み込み

日本語モデルを読み込む。 以下のようなログに大量のエラーが出るが、読み込みはできているようだ。

ERROR : failed to decode invalid unicode bytes

追加学習をする場合は、以下のようにモデルを読み込む必要がある。

import logging

from gensim.models.fasttext import load_facebook_model

# ログ出力設定
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# モデルを読み込む
model = load_facebook_model('/home/ubuntu/models/cc.ja.300.bin')

追加学習が不要な場合は、以下のようにベクトルのみ読み込む。 以後の処理は、ベクトルのみ読み込むこととする。

import logging

from gensim.models.fasttext import load_facebook_vectors

# ログ出力設定
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# ベクトルのみ読み込む
model = load_facebook_vectors('/home/ubuntu/models/cc.ja.300.bin')

モデルの場合と、ベクトルのみの場合では、利用できるメソッドが異なる場合があるので注意。 ベクトルを取得する場合などで異なる。

# ベクトルを取得(モデルの場合)
print(model.wv['コンピュータ'])

# ベクトルを取得(ベクトルのみ読み込みの場合)
print(model['コンピュータ'])

Word Mover Distance による文章間距離

tokens1 = tokenize(nlp('私は、猫である。'))
tokens2 = tokenize(nlp('私は、犬である。'))
print(model.wmdistance(tokens1, tokens1))
print(model.wmdistance(tokens1, tokens2))

以下のような結果となる。 一つ目は、同じ文章なので、距離は 0 となる。

0.0
0.11943071491413972

以前の chiVe モデルでの結果と比較すると、多少異なる事が分かる。

0.0
0.10580116662522744