Ruby
mecab
Wikipedia
word2vec

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

More than 1 year has passed since last update.


環境

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/