Help us understand the problem. What is going on with this article?

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

More than 3 years have 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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした