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用の辞書のことです。さらに、定期的に新しい言葉をアップデートするので、最新の言葉を正しく形態素解析をすることができます。

##### 必要なライブラリをインストール
~~~bash: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インストール先の確認法
~~~bash:terminal
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
~~~
自分の環境では

~~~bash:terminal
/usr/local/lib/mecab/dic/mecab-ipadic-neologd
~~~
となりました。

##### 実行方法
~~~bash:terminal
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
　[文章を入力]
~~~


##### MeCab コマンドライン引数 一覧
[http://www.mwsoft.jp/programming/munou/mecab_command.html](http://www.mwsoft.jp/programming/munou/mecab_command.html)

### mecab-ipadic-NEologdを使うとどうなるの？
例として、「なのはちゃんがケチなのは仕方ない」という例文を形態素解析してみます。
##### 普通のMeCab
![](https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsuruchan_0827/20160801/20160801185853.png)
##### mecab-ipadic-NEologdを辞書としたMeCab
![](https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsuruchan_0827/20160801/20160801185847.png)

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

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

## 日本語wikipediaのデータをダウンロード
2.2GBぐらいのサイズがあります。

~~~bash: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のインストール
~~~bash:terminal
brew rbenv ruby-build
~~~

次の２行を、.bash_prifileに記述

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

これらを反映させる。

~~~bash:terminal
source .bash_profile
~~~

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

~~~bash: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のデータをテキストファイルに変換します。

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

1時間弱かかります。

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

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

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

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

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


~~~bash:terminal
git clone https://github.com/svn2github/word2vec.git
cd word2vec
make
./demo-word.sh
~~~
Macにインストールする際には、以下のようなエラーが出ます。

~~~bash: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:c_file
// #include <malloc.h>
#include <stdlib.h>
~~~

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

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

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

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

学習

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

~~~bash: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というファイルが生成されれば成功です。

#### デモコードを実行します

~~~bash:terminal
./distance vectors.bin
~~~


### wikipediaデータの学習

~~~bash: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: ランダムに間違った解答として判断させる
 

### 実行例
![](https://cdn-ak.f.st-hatena.com/images/fotolife/t/tsuruchan_0827/20160801/20160801190222.png)

#### 参考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/