「毎日Unity」の技術ブログ

開発で役立つ情報を発信する

【Python】Word2Vecの導入方法と使い方

PythonのWord2Vecを使ってみたので記事にして残すことにしました。

[ Word2Vecとは ]

Word2Vecとは一言で言うならば単語をベクトルとして考える手法です。意味が似ている単語ベクトルほどコサイン類似度が高くなります。例えば「教師」という単語ベクトルと「先生」という単語ベクトルがあったとします。この場合これら2つのベクトルのコサイン類似度は高くなります。まぁ詳しく知りたい人はwikiでも見てちょ。
ja.wikipedia.org

[ Word2Vecでできること ]

類義語の検出や文章の類似度を計算したりできます。文章の感情分析や文章要約、チャットボット作成等に活用されてるそうです。

[ Word2Vec導入方法 ]

pythonのインストール

もう既にインストール完了されてると思いますが念のため
edunity.hatenablog.com

gensimのインストール

Word2Vecを扱うにはpythonにgensimをインストールする必要があります。コマンドプロンプトを起動して「py -m pip install gensim==3.8.3」と入力してエンターを押すとgensinがインストールされ始めます。最新バージョンではなくバージョン3.8.3をインストールする理由は、この後使用する学習モデルが最新バージョンに対応してないからです。

Microsoft Windows [Version 10.0.19044.2130]
(c) Microsoft Corporation. All rights reserved.

C:\Users\EDunity>py -m pip install gensim==3.8.3

学習モデルのダウンロード

自分で学習モデルも作っても良いのですが、めんどくさいので今回は既存の学習モデルをダウンロードして使うことにしました。下記のサイトにアクセスして「ja.zip」をダウンロードしてください。
drive.google.com

[ Word2Vecの使い方 ]

※先ほどダウンロードした学習モデル「ja.zip」の中身全てと実行するpythonファイルが同じディレクトリに存在しないとエラーが出るので注意してください。

単語の出力

単語「王」を出力してみます。単語ベクトル「王」を出力するってことね。

#gensimのインポート
import gensim

#学習モデル「ja.bin」の取得
Model = gensim.models.Word2Vec.load("ja.bin")

#単語ベクトル「王」を出力
print(Model.wv["王"])

どうやら単語ベクトル「王」は数百次元あるベクトルみたいです。

[-0.42127547 -2.951647   -0.14948063  1.7097437   0.24034126 -0.350413
 -0.7719671   2.0114477   0.8007742  -1.5163119   1.5637687  -3.4346766
 -0.2361121   0.5002758   0.01766868 -0.976453    1.9118286  -2.2891405
 …]

類義語の検出

単語「王」の類義語を検出してみます。単語ベクトル「王」とのコサイン類似度が高い単語ベクトルを出力するってことね。

#gensimのインポート
import gensim

#学習モデル「ja.bin」の取得
Model = gensim.models.Word2Vec.load("ja.bin")

#単語ベクトル「王」とのコサイン類似度が高い単語ベクトルをコサイン類似度が高い順に取得
Synonyms = Model.wv.most_similar(positive=["王"])

#取得した単語ベクトルを出力
for Synonym in Synonyms:
    print(Synonym)

意味が最も近い単語は「新帝」みたいです。

('新帝', 0.5614747405052185)
('藩王', 0.5557352304458618)
('帝', 0.5405844449996948)
('カザンハン', 0.5308389663696289)
('女王', 0.5307759046554565)
('王位', 0.5246132016181946)
('クリミアハン', 0.5156239867210388)
('王子', 0.5127780437469482)
('キプチャクハン', 0.5119784474372864)
('大王', 0.5092768669128418)

単語の足し算と引き算

単語ベクトルの足し算と引き算をするってことね。

#gensimのインポート
import gensim

#学習モデル「ja.bin」の取得
Model = gensim.models.Word2Vec.load("ja.bin")

#単語ベクトル「王」 に単語ベクトル「女」を足し、単語ベクトル「男」を引いたベクトルとのコサイン類似度が高い単語ベクトルをコサイン類似度が高い順に取得
Synonyms = Model.wv.most_similar(positive=["王", "女"], negative=["男"])

#取得した単語ベクトルを出力
for Synonym in Synonyms:
    print(Synonym)

意味が最も近い単語は「王女」みたいです。

('王女', 0.4609297811985016)
('王位', 0.4463587999343872)
('女王', 0.440536767244339)
('王家', 0.4360467791557312)
('父王', 0.4177766740322113)
('王妃', 0.4131211042404175)
('マガダ', 0.410072922706604)
('ファラオ', 0.4071836471557617)
('ベーラ', 0.404167115688324)
('カッパドキア', 0.40059027075767517)

モデルの学習と保存

#gensimのインポート
import gensim

#学習させる文の用意
Sentences = [["私", "は", "犬", "が", "好き", "だ", "."], ["私", "は", "猫", "が", "好き", "だ", "."]]

#学習させる
Model = gensim.models.Word2Vec(sentences=Sentences, size=100, window=5, min_count=1)

#単語「犬」と単語「猫」の類似度を出力
print(Model.similarity("犬", "猫"))

#モデルの保存
Model.save("Model")

単語「犬」と単語「猫」の類似度は0.05426265みたいです。

0.05426265