word2vec:Pythonで単語ベクトルを作成する_実装編

前回の記事,「word2vec:Pythonで単語ベクトルを作成する」で単語ベクトル作成の理論を解説しました.ということで今回は,python,特に gensim と呼ばれるライブラリを用いて単語ベクトル作成の実装を行います.そして図に示したような単語ベクトル作成の足し算・引き算を行います.
import gensim
import os

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname

    def __iter__(self):
        for fname in os.listdir(self.dirname):
            for line in open(os.path.join(self.dirname, fname)):
                yield line.split()

path = os.getcwd()
sentences= MySentences(path + "\\test")  # カレントディレクトリに testフォルダ を作成し,その中に,学習用のテキストファイルを入れて下さい.
model = gensim.models.Word2Vec(sentences, min_count=10, size=200)  # 単語ベクトル作成
vec_calc = model.most_similar(positive=["Japan", "Paris"], negative=["Tokyo"], topn=1)  # [Japanベクトル]-[Tokyoベクトル]+[Parisベクトル] を表しています.
print(vec_calc)

# [('French', 0.9493083953857422)] が出力されます.
word2vec.py
[Japanベクトル] ー [Tokyoベクトル] を計算することで,[country nameベクトル] を取得し,[country nameベクトル] + [Parisベクトル] を計算することで,[Frenchベクトル] が得られる.という内容を上記の実装で行っています.

今回は学習用テキストファイルの内容が,首都と国名がペアになって記述されているものなので,[country nameベクトル] や [capital nameベクトル] が取得できます.学習データを変えてみるともっと面白いことが出来そうです.

因みに,https://github.com/RaRe-Technologies/gensim-data に行くと,色々な種類のデータが手に入ります.また,gensim の Doc2vec を用いれば,文書をベクトル化することも可能らしいです (word2vec は単語をベクトル化する).今後,Doc2vec にも挑戦してみようと思います.