遅ればせながら、Word2Vecで遊んで見る

こんにちは。
いつものtaanatsuです。

今回は今更感が強いですが、なぜかちゃんと使ったことがなかったWord2Vecを使ってみます。
それでは、やっていきましょうか。

Word2Vec

word2vecとは、文章中の単語同士の類似度を測り、似た単語を算出できます。
後は単語の引き算とか足し算もできるようですね。

今回は簡単に単語間の類似度を算出してみましょう。

前準備

venv

恒例のやつです。

$ python3 -m venv venv
$ source venv/bin/activate

必要ライブラリ

mecabを事前にお使いのPCにインストールを済ませておいてください。

$ pip install gensim
$ pip install BeautifulSoup4
$ pip install mecab-python3 

前処理

日本語は形態素解析(文章を「名詞」「動詞」「形容詞」のように形態素に分解すること)を行い、
単語の意味のある最小の単位に分解します。

後、HTMLなども消し去ります。

「raw_data.csv」に文章を1行で入れておいてください。

文章1
文章2
文章3
...
文章N

これを整形し、「wakachi.txt」というファイルに書き出します。

import csv
from bs4 import BeautifulSoup
import MeCab

wakachiTagger = MeCab.Tagger('-Owakati')

with open('wakachi.txt', 'w') as wCsvFile:
    with open('raw_data.csv', newline='') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            text = BeautifulSoup(row[0]).text.replace('\n', '')
            wakachi = wakachiTagger.parse(text).replace('\n', '')

            writer = csv.writer(wCsvFile)
            writer.writerow([wakachi])

学習

「前処理」で出力した「wakachi.txt」から、Word2Vec用の「wakachi.model」を作成します。

from gensim.models import word2vec

sentences = word2vec.Text8Corpus('./wakachi.txt')

model = word2vec.Word2Vec(sentences, min_count=20, window=15)
model.save("./wakachi.model")

予測

学習で作成した「wakachi.model」を利用し、データを予測します。

from gensim.models import word2vec

model = word2vec.Word2Vec.load("./wakachi.model")
results = model.wv.most_similar(positive=['人間'], topn=10)
for result in results:
    print(result)

参考にさせていただいたサイト様

終わりに

コード量を見るに、そこまでハードルは高くなさそうですね。
(参考にさせていただいたサイト様、ありがとうございます)

次はDoc2Vecを使って文章同士の類似度を測ってみたいと思います。 それではまた次回