Word2Vecで単語の足し算を行う方法【Python】

Python

本記事は単語同士の計算を行う方法を解説します
以下の流れで解説します。

  • 単語の計算が行える仕組み
  • 事前準備として、word2vecのインストールを行います。
  • 英単語の計算を行います。
  • 日本語の計算を行います。

OSはWindowsを前提とし、開発環境はJupyterLab Desktopを使用します。

単語の計算が行える仕組み

単語同士の計算は単語をベクトル化することによって可能になっております。

単語同士の計算をイメージ図にすると下の図のようになります。

この青色のベクトルはking – manで算出できます。

ですので、このking – manベクトルにwomanベクトルを足すとqueenになることがわかると思います。

なお、上記の図はあくまでもイメージ図です。実際のベクトルは300次元あるので図にすることは不可能です。しかし、次元が300次元でも2次元でもベクトル同士の足し算、引き算ができることは同じです。

事前準備

まずはword2vecをインストールします。
JupyterLab DesktopのNotebookを起動し、セルに%pip install gensimと入力して実行します。

インストールには少々時間がかかりますので完了するまで待ちましょう

英単語の計算

下記のコードで英単語の計算を行えます。
先程も例に挙げたking-man+womanの計算をおこなっています。

import gensim.downloader

vectors = gensim.downloader.load('word2vec-google-news-300')
vectors.most_similar(vectors['king'] - vectors['man'] + vectors['woman'], topn=5)

コードの解説を順に行ってゆきます。

import gensim.downloader
...

まずはライブラリのインポートです。
こちらのライブラリはword2vecモデルのダウンローダーを使用するためのものです。

...
vectors = gensim.downloader.load('word2vec-google-news-300')
...

gensim.downloader.loadの引数にモデル名を入力して実行するとword2vecモデルをダウンロードできます。

...
vectors.most_similar(vectors['king'] - vectors['man'] + vectors['woman'], topn=5)

キーに英単語を入力すると、その単語を参照することができます。
そして、それらの単語ベクトル同士で足し算、引き算を行うとベクトルを計算できます。
その計算したベクトルに対してmost_similarメソッドを実行することでそのベクトルに最も類似した単語を出力できます。
topnは最も類似した単語の上位何件を出力するかを指定しています。
つまり、最終的にking-man+womanのベクトルに最も類似したベクトル上位5件を出力しているということです。

こちらが出力結果です。右側の数値は類似度です。
kingを除くとqueenが最も類似度が高いのでうまく計算できていることがわかります。

日本語の計算

日本語モデルの準備

まずは日本語のモデルをダウンロードします。

今回はこちらのモデルを使用します。クリックしてダウンロードしましょう。
ダウンロードが完了したら解凍する必要があります。

上の最後に.bz2がついていない方が解凍した後のモデルです。このモデルをJupyterLab Desktopのファイル一覧にアップロードします。

実装

from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format('jawiki.all_vectors.100d.txt', binary=False)
model.most_similar(model['王'] - model['男'] + model['女'], topn=5)

上記で日本語の単語ベクトル計算が可能です。

それではコードの方を見てみましょう。

from gensim.models import KeyedVectors
...

まずはライブラリのインポートです。
このライブラリで単語ベクトルの操作を行うことができます。

...
model = KeyedVectors.load_word2vec_format('jawiki.all_vectors.100d.txt', binary=False)
...

load_word2vec_formatの引数に先ほど解凍したモデルを入力して実行するとモデルをロードできます。
ロードには結構時間がかかりますので完了するまで待ちましょう。

...
model.most_similar(model['王'] - model['男'] + model['女'], topn=5)

そして先程と同様に、参照した単語ベクトル同士で足し算、引き算を行った後、most_similarを実行します。

結果は次の通りです。

妃、女王などそれらしい回答が得られているのでうまく計算できているようです。

他にもトヨタ-日本+アメリカを計算してみましょう。

ゼネラルモーターズ、フォード・モーター、NUMMI、クライスラーというようにアメリカの自動車会社が出力されています。

続いて、アメリカを韓国に変えてみます。

すると現代自動車が上位に出力されます。
非常に納得感のある計算結果ですね。

タイトルとURLをコピーしました