ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

CentOSでpython3からgensimのword2vecを使ってみる

環境

VMware PlayerのCentOS6

手順

学習データにはWikipediaのデータを利用。


ライブラリをpipインストール

pip install numpy
pip install scipy
pip install --upgrade gensim

wp2txtインストール
CentOSにwp2txtインストール - とりあえずシステムエンジニアの備忘録

Wikipediaデータのダウンロード

wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2

wikipediaデータをパース

wp2txt --input-file jawiki-latest-pages-articles.xml.bz2

パース結果を結合

cat jawiki-latest-pages-articles.xml-* > /work/word2vec/corpus.txt

mecab分かち書き

[root@localhost word2vec]# mecab -Owakati corpus.txt -o corpus_wakati.txt

input-buffer overflow. The line is split. use -b #SIZE option.

エラーが多発するので、デフォルトの10倍にバッファサイズを設定
30分位

[root@localhost word2vec]# mecab -b 81920 -Owakati corpus.txt -o corpus_wakati.txt

学習を実行しモデル作成。

[root@localhost word2vec]# python3.5 word2vec_sample.py

ソース

from gensim.models import word2vec
# 学習
sentences = word2vec.Text8Corpus("corpus_wakati.txt")
model = word2vec.Word2Vec(sentences, size=100)
# モデルの保存と読込
model.save("sample.model")

Wikipediaデータは6.2GB
VMWare環境、8GBメモリで7時間近くかかった。
時間かかりすぎ・・

では使ってみる
こんな感じ

def load_model():
  global model
  timeStart = time.clock();
  model = word2vec.Word2Vec.load("sample.model")
  timeTotal = round(time.clock() - timeStart, 3)
  print("load model ... {0}s".format(timeTotal))

def print_result(out):
  print("-----")
  for x in out:
    for y in x:
      try:
        print (y, '\t')
      except KeyError:
        print("not found : " + y)

try:
  load_model()
  #よく一緒に使われる(距離が近い)単語を3つ取得
  out = model.most_similar(positive=[u'ピカチュウ'], topn=3)
  print_result(out)
  #単語を足して、それらとよく使われる単語を取得
  out = model.most_similar(positive=[u'ピカチュウ', u'進化'], topn=5)
  print_result(out)
  #単語から単語を引いた意味を取得
  out = model.most_similar(positive=[u'ピカチュウ', u'モンスター'], negative=[u'ポケモン'], topn=5)
  print_result(out)

読み込み時間10秒近く掛かる、遅すぎ・・・

word2vec使って色々出来そうで面白そう