« コンピュータが本来持つ限界のなさを阻む者はきっと・・・ | Main | TeXに感じていた不満 »

自然言語処理をなにも知らない私がword2vecを走らせるまで


googleの中の人たちが作ったword2vecというモノがあります。deep learningを自然言語(N-gram?)に適用することにより単語を100次元くらいのベクトル空間にマップする物だと思います。面白さは以下のベージの通りですが、たったこれだけの事で、ほとんど意味理解の一歩手前まで到達していると思います。


Taku Kudo : word2vec  で少し遊んでみた。いわゆる deep…


面白いのは、2つのベクトルの差が、2つの単語の関係をよく近似してくれること。
(中略)
A B C → X (A → Bの関係に対し、 C → X に当てはまるXを探す)

グーグル ヤフー トヨタ → 日産
渋谷 新宿 札幌 → 旭川
警察 泥棒 正義 → くそ
平和 戦争 左 → 右
社員 会社 生徒 → 小学校
空 海 天井 → 床板
生きる 死ぬ 動く → 止まる
・・・


Deep-learningはラテン語の動詞活用を学習できるか?


est: sum (to be) の直説法現在3人称単数
sunt: 同3人称複数
dat: dō (to give) の直説法現在3人称単数
dant: 同3人称複数
おおすごい。


word2vecに英辞郎データを放り込んでみた - naoya_t@hatenablog


("see" と「見る」の関係が、"find" と何の関係に似ているかを調べます)
------------------------------------------------------------------------
見つける 0.450238
見いだす 0.439524
喜ぶ 0.435330

最後のなんか本来の使用法と違うと思うけど、意味がある結果が出て来ちゃう。

上はうまく行った例で、やってみるとずいぶん間違った類推も多いですが、うちにいる4才児もまあ似たようなものです。しかも学習時間は日本語wikipedia全文を突っ込んでもわずか30分程度。人間ってなんなんだろうと思いますよ。機械学習だし人手に比べれば不完全極まりない訳ですが、WordNetのような意味ネットワークを作ろうとする試みの足下くらいには30分で自動で行っちゃえるわけですよ。

で、上記のような自然言語処理(NLP)を知っている人にとってはword2vecの扱いは簡単すぎるくらいだし、形態素解析などの前処理も常識すぎるので、やり方を書いてないのですが、私のようなやった事の無い人はちょっと困った訳です。で、やり方を以下にまとめておきます。(私の環境はOSX 10.9ですが、ほかのversionやほかのUNIXでもほぼ手続きは同じだと思います。)
(ちなみに単に試してみたいだけなら、自分で走らせる必要は無くてDEEP LEARNERというwebサイトがあって類義語や上記の3項アナロジーなどを試す事が出来ます。)

まずはコーパスを持ってこなくてはなりません。まずは無料で簡単に手に入るWikipediaの日本語版にします。
http://ja.wikipedia.org/wiki/Wikipedia:データベースダウンロードからたどれる
http://dumps.wikimedia.org/jawiki/
jawiki-latest-pages-articles.xml.bz2をダウンロードします。bz2圧縮されたファイルの大きさは2GBに届かないくらいです。

次にxmlやらwiki記法などをなどを取り除いてplain.txtにするひつようがあります。それには長谷部氏のwp2txtを使うのが簡単です。
CUI版はhttps://github.com/yohasebe/wp2txt
GUI版はhttp://rubyforge.org/projects/wp2txt/
です。(wp2txtはRubyを必要としますが、OSXでしたらプレインストールされています。)GUI版はもうupdateされていないのでCUI版のほうが良いのですが、堕落したMacユーザである私はGUI版を使いました。wp2txtは直接bz2圧縮ファイルを入力出来ます。wp2txtの出力ファイルは99MBにする事をお勧めします。それでも20個ほどの出力fileができますが。私は出力のコードはUTF8、本文paragraph以外の出力はみな抑制しましたが、これはお好みで。出力は20個ほどのファイルに分割されますが、そのときはターミナルappから
  cat jawiki-latest-pages-articles.xml-* > jawiki.txt
などとして連結すればよいです。このテキストファイルの大きさは今だと2GBちょっとくらいです。

次にword2vecは単語ごとにスペースで分かち書きされている必要があるので、そのために工藤さんのmecabをインストールします。私は「オススメ」のipa辞書を使いました。方法はmecabのページ
  http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html
に分りやすく書いてあります。OSXの時はsuしてmake installが
  % sudo make install
になるのが注意です。macabはデフォルトでは文字コードがEUCなのですが、このページの説明書き通り辞書を
  % tar zxfv mecab-ipadic-2.7.0-xxxx
  % ./configure --with-charset=utf8
  % make
とやってもUTF8に出来ませんでしたが、2番目の方法
  % cd mecab-ipadic-2.7.0-xxxx
  % /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -t utf-8
  # make install
で、うまく行きました。(ただ、はまっている間mecab本体に対しても./configure --with-charset=utf8をやったのも効いている可能性があります。)

mecabのインストールが出来たら先ほどのtext化したファイルに対して
  % mecab -Owakati jawiki.txt > jawikisep.txt
として分かち書きします。

次にword2vecのインストールです。本家
  https://code.google.com/p/word2vec/
からソースコードをダウンロードして一つのフォルダに入れます。で、私の環境ではソースコードから#include を取り除く必要がありました。あとは
  % make
です。

最後に、先ほどの分かち書きしたファイルに対してトレーニングを行います。
  % ./word2vec -train jawikisep.txt -output jawikisep.bin -size 200 -threads 4 -binary 1
どうも-binary optionをつけないと次に使うとき読み込めないようです。驚くべき事に30分程度でトレーニングが終わります。

あとは
  ./distance jawikisep.bin
とか
  ./word-analogy jawikisep.bin
とかして楽しみましょう。

私は最初はwikipediaの最初の10MBでやっていたのですが、これは精度が低かったようです。100MBにするとすこし改善、1GBにすると大きく改善。全部(2.2GB)にするとさらに少しだけ改善しました。上の工藤さんの例ほどうまくは行かないのですが、まあ、wikipediaは文体に偏りがあるからかも知れないとおもっています。たとえば光→闇、善→?とかやるとでない訳ですが、まあ、wikipediaって「闇」とか「善」とか使わなそうですしね。
さらに上のDEEP LEARNERにも負けているっぽいのですが、これは学習のパラメータをもう少し勉強した方がいいのかも知れません。

|

« コンピュータが本来持つ限界のなさを阻む者はきっと・・・ | Main | TeXに感じていた不満 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/31362/59161220

Listed below are links to weblogs that reference 自然言語処理をなにも知らない私がword2vecを走らせるまで:

« コンピュータが本来持つ限界のなさを阻む者はきっと・・・ | Main | TeXに感じていた不満 »