MENU

単語の類似度の出力と単語の計算 (Word2Vec)

wikipediaから取得したデータで学習させたモデルを使って、単語の類似語を出力するプログラム。

f:id:hanamichi_sukusuku:20210119185627p:plain

実行結果

f:id:hanamichi_sukusuku:20210119185656p:plain

モジュールインポート

word2vecは単語をベクトル化させるライブラリ。

 

モデルの読み込み

word2vec.Word2Vec.load()でwikipediaから取得したデータから学習させたモデルを用意しておき読み込む。

 

単語から類似度が高いものを取り出す

 

model.wv.most_similar()では学習したモデルに任意の単語を渡し類似するものを取得できる。

model.wv['業務’]では単語から訓練されたベクトルが取得できる。

こんな感じで

f:id:hanamichi_sukusuku:20210119193505p:plain

今回のmodel.wv.most_similar(positive=['業務'])では単語と類似度の高いものを取得する。逆に(negative=['業務'])を指定すると類似度の低いものを取得する。

 

 

出力

類似度の高いもののリストデータをfor文で出力。

 

 

次に単語の計算を行っていく

f:id:hanamichi_sukusuku:20210119193950p:plain

実行結果

f:id:hanamichi_sukusuku:20210119201212p:plain



モジュールのインポートとモデル読み込みは類似度出力と同じでmost_similar()のオプションだけ変わっている。

 

計算にはpositiveに足すもの、negativeに引くものを指定する。

おそらくpositiveに指定したものと類似度が高いもの、negativeで指定したものと類似度が低いものを出力しており、つまり王、女のベクトルから男のベクトルを引いた単語を取得している。

式で表すと

王 ー 男 + 女 =女王

になる

 

一連の流れについては理解できたが予想もつかなかった結果が多く出てきているのでこれはコーパスを改善するなどの余地がある。

 

 

 

余談

生成したオブジェクトにデータを渡す前にオブジェクト.parse("")を記述することがあるがそれはUnicodeDecodeErrorを避けることが出来るからである。おそらくプログラム内で標準で使用されている文字エンコードで初期化しているんだと思う。

こんな時

tagger = MeCab.Tagger("-d /var/lib/mecab/dic/mecab-ipadic-neologd")
tagger.parse("")