人工知能してみる

人工知能の中の人が機械学習とか統計とかAI的なことを書き連ねます

word2vecしてみる

2014年くらいに流行ったツールであるword2vecを使ってみます。
word2vecの詳細は省きますが、簡単に言うと、単語を任意のベクトルに変換するものです。
skip-gramかCountinuous Bag of Wordsモデルに基づいてベクトル化されます。
簡単に言うと、ある単語のまわりの単語をもとにベクトル化されるわけですね。

というわけで、さっそく使ってみます。
今回も先人の知恵を拝借しております。感謝!
Python で「老人と海」を word2vec する · m0t0k1ch1st0ry

流れとしては
gensimをpip
>訓練用文書を読み込む
>モデルを生成
>類似単語を見てみる
>楽しい! ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

さてさて、普通にpipでgensimをインストールします。

pip install gensim

念のため、importして確認しておきます。

import gensim

エラーが出なければOKです。
さっそく訓練用文章を使いましょう。
今回は公式のテスト用コーパスであるtext8を使いました。

こんな感じ。

from gensim.models import word2vec
sentences = word2vec.Text8Corpus(r"text8")
model = word2vec.Word2Vec(sentences, size=200, min_count=20, window=15)
model.save("sample.model")

これで訓練が始まります。
PCのスペックに依りますが、1時間はかからないと思います。
MBPだと10分もかかりませんでしたね。

終わるとカレントディレクトリにsample.modelというファイルができます。
これが学習させた分類機になるわけですね。

さっそく類義語検索をしてみましょう。

model = word2vec.Word2Vec.load("sample.model")
def s(posi, nega=[], n=10):
    cnt = 1 # 表示した単語の個数カウント用
    result = model.most_similar(positive = posi, negative = nega, topn = n)
    for r in result:
        print (cnt,' ', r[0],' ', r[1])
        cnt += 1

if __name__ == '__main__':
    word = 'word'
    s([word])

これだけで類義語が検索されます。
類似度はcos類似度みたいですね。

非常に簡便かつ高速に類義語検索ができるので実用性が高そうです。
ただ、日本語だと英語よりうまくいかない場合がある感じがします。
入力させる文書について量を増やしたり、ジャンルごとにわけるなどの工夫が必要そうです。

どちらにせよ、学習が高速なのでいろいろ遊べるオモチャって感じです。