word2vecを使って、日本語wikipediaのデータを学習する


環境

OS X El Capitan 10.11.5
MacBook Pro (Retina 13-inch、Early 2015)
[2016/8/1現在]

MeCab, mecab-ipadic-NEologd のインストール

MeCabはオープンソースの日本語形態素解析ソフトです。
mecab-ipadic-neologdは、Web上のリソースから新しい言葉を登録したMecab用の辞書のことです。さらに、定期的に新しい言葉をアップデートするので、最新の言葉を正しく形態素解析をすることができます。

必要なライブラリをインストール
terminal
brew install mecab mecab-ipadic git curl xz

git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

cd mecab-ipadic-neologd

./bin/install-mecab-ipadic-neologd
ipadicインストール先の確認法
terminal
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

自分の環境では

terminal
/usr/local/lib/mecab/dic/mecab-ipadic-neologd

となりました。

実行方法
terminal
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
 [文章を入力]
MeCab コマンドライン引数 一覧

http://www.mwsoft.jp/programming/munou/mecab_command.html

mecab-ipadic-NEologdを使うとどうなるの?

例として、「なのはちゃんがケチなのは仕方ない」という例文を形態素解析してみます。

普通のMeCab

mecab-ipadic-NEologdを辞書としたMeCab

普通のMeCabでは「なのはちゃん」を認識することができず、名詞の"なのは"とそうでない"なのは"が一緒になっています。
一方、mecab-ipadic-NEologdを使用すると、きちんと「なのはちゃん」が認識されています。

これ以外にも、
・なのは ― 「魔法少女リリカルなのは」というアニメの登場人物
・はがない ― 「僕は友達が少ない」の略称
・がをられ ― 「彼女がフラグをおられたら」の略称
・はにはに ― 「月は東に日は西に」の略称
・けよりな ― 「夜明け前より瑠璃色な」の略称
上記の様な、判別が難しい語も正しく形態素解析できる様になります。

日本語wikipediaのデータをダウンロード

2.2GBぐらいのサイズがあります。

terminal
curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

wikipediaのデータをテキストに変換する

wikipediaのデータファイルはXMLで記述されてているので、それを普通のテキストファイルに変換しなければならない。

rubyのインストール

terminal
brew rbenv ruby-build

次の2行を、.bash_prifileに記述

.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

これらを反映させる。

terminal
source .bash_profile

rbenvを使って、ruby等をインストール

terminal
rbenv install --list 
rbenv install 2.3.1
rbenv local 2.3.1
rbenv global 2.3.1
rbenv exec gem install wp2txt bundler
rbenv rehash

rubyがインストールできたら、wikipediaのデータをテキストファイルに変換します。

terminal
rbenv exec wp2txt --input-file jawiki-latest-pages-articles.xml.bz2

1時間弱かかります。

これが終わると、20個ほどのファイルが生成されるので、それらを一つのファイルにまとめます。

terminal
cat jawiki-latest-pages-articles.xml-* > jawiki_wakati.txt

これで、トレーニング用のデータセットの完成です。

word2vecのダウンロード

どうやらsubversionを使ってダウンロードすると、URL not foundになってしまい、リモートレポジトリが死んでいる様子。

同じものがgithubにあるのでそこから拾ってきます。

terminal
git clone https://github.com/svn2github/word2vec.git
cd word2vec
make
./demo-word.sh

Macにインストールする際には、以下のようなエラーが出ます。

terminal
$ cd word2vec
$ make
gcc word2vec.c -o word2vec -lm -pthread -O3 -march=native -Wall -funroll-loops -Wno-unused-result
gcc word2phrase.c -o word2phrase -lm -pthread -O3 -march=native -Wall -funroll-loops -Wno-unused-result
gcc distance.c -o distance -lm -pthread -O3 -march=native -Wall -funroll-loops -Wno-unused-result
distance.c:18:10: fatal error: 'malloc.h' file not found
#include <malloc.h>
         ^
1 error generated.
make: *** [distance] Error 1

malloc.hが無いよーというエラー。

macOSではmalloc.hではなくstdlib.hを使うので、以下のファイルのincludeを変更。

  • compute-accuracy.c
  • distance.c
  • word-analogy.c
c_file
// #include <malloc.h>
#include <stdlib.h>

その後、再度ビルドすればインストールできます。

demo-word.shでデモコード

demo-word.shはLinux用なので、Macでは動きません。
以下に同じ様なことを実行するコードを示します。

text8というコーパス用のファイルを取得します。

terminal
curl http://mattmahoney.net/dc/text8.zip > text8.zip
unzip text8.zip

学習

word2vecがあるディレクトリにtext8をコピーしてから、ターミナルで以下を実行します。

terminal
./word2vec -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15

vectors.binというファイルが生成されれば成功です。

デモコードを実行します

terminal
./distance vectors.bin

wikipediaデータの学習

terminal
 ./word2vec -train jawiki_wakati.txt -output jawiki_wakati.bin -size 200 -window 5 -sample 1e-3 -negative 5 -hs 0 -binary 1
オプション

-window: 指定した数値の分だけ、単語の前後にある単語を文脈として判断させる
-sample: ランダムに頻出単語を消去する。1e-3は「頻出度が高め」 の意味。
-negative: ランダムに間違った解答として判断させる

実行例

参考URL

http://b.amberfrog.net/post/105527194822/os-x%E3%81%A7word2vec%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F
http://blog.umentu.work/ubuntu-word2vec%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88wikipedia%E3%82%92%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/