« January 2014 | Main | March 2014 »

自然言語処理をなにも知らない私が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にも負けているっぽいのですが、これは学習のパラメータをもう少し勉強した方がいいのかも知れません。

| | Comments (0) | TrackBack (0)

コンピュータが本来持つ限界のなさを阻む者はきっと・・・

もしかしたらビットコインは新しい時代の主要な通貨になるかも。と思っていたが、考えなおした。

ビットコインはベアラー型の通貨であり価値を保証する政府も必要としないと聞いて「これこそ未来の通貨だ」と思った。(あとに説明するように実際はベアラー型ではないみたいだけど。)
例えば現金は(それ以上に株券は)持っている人がそれを行使できる。受け取る方としてはいちいち政府に問い合わせたり、信販会社のサーバに問い合わせたりする必要は無い。これがベアラー(持っている人)型。このようにコントロールする中心のなさという点はコンピュータ利用のこれまでの歴史を正しく発展させる方向だと思った。
またキャッシュカードなどと比べてトランザクションコストが大幅に低いらしい。例の1円とかの支払いはキャッシュカードでは難しいらしいという問題ね。

しかし、ビットコインは総発行量に限界がある。これはコンピュータの限界とは何の関係もない制約だ。 最初は数学の定理とかで絶対的に上限が定まっているのかと思って興奮したがそんな事はなかった。既存ノードたちが発行量についての規約(サトシ論文)に反するような事をする新規ノードを許さないというだけだと思う。これ自体はむしろ必要な事で発行量を制限しなければ制御不能なインフレになって価値が暴落してしまう。しかしだ、そういう本質的でない制約を持ち込むと、他の外に作られたネットワークに取って代わられる危険があるのでは無いかと漠然とした不安を感じていた。

そこへ、中里さんのこの記事を読んで、ビットコインは長期的にはダメだろうと考える事になった。ビットコインは本来的な限度の無さというコンピュータの本性に反しているからだ。

例えばコンピュータのなかではコピーの回数には制限が無い。ハードウェアの仕組みを知っている人からするとむしろコピーこそコンピュータの動作原理であるくらいだ。それを制約する方が無理がある。だからDRMなどを実現する方がずっとめんどくさい。このようにコピーの限度の無さというのがコンピュータの本来の性質だ。
IPv4のアドレスの有限性を所与の物として、それを市場取引で分配しようと提案した経済学者もいたけど、世の中はそんな風になる必要は無かった。IPv4に見るような通信のIDの数の上限もコンピュータの本来の性質ではない。たまたまだ。そんな制約に我々が縛られる必要はないのだ。
中里さんが例示したセカンドライフの中の不動産というのもダメだった。仮想空間のなかでの土地が有限でなければならない理由など確かにない。

DRMなどまだ決着がついてないものもあるにせよ、コンピュータの本来の限界と関係ない限界で我々を縛ろうとする試みは概ね失敗する運命にあるようだ。


さて、ビットコインは何なのか。現金や金のように物としての存在自体(あるいは複製の難しさ)が価値を保証するわけではない。私が理解したところでは、どちらかと言うとビットコインは分散型の帳簿システムだった。例えると単一サーバがファイルを配布するシステムに対してWinnyが分散されたネットワークとして全体として落ちる事の無いパフォーマンスのよいファイルサーバを構成していたような物。同様に、これまでのカードや銀行のシステムは中心があってつじつまのあう帳簿システムを提供していたのに対して、ビットコインは近隣のノードとやり取りするノードによるネットワークが全体としてだます事が難しいコンシステントな帳簿システムを提供しているということ。

ビットコインが(金のようなコピー不可能な実態を作り出すものではなく)分散型の帳簿システムであるならばトランザクションコストの低さなどの利点は他のコンシステントな帳簿システムのすべてにも利用可能である。コンシステンシとは誰かが(お金などを)あげたら相手の増えた分だけきっちり減るという事だ。帳簿システムのコンシステンシを中心に出来上がっているものは、例えばキャッシュカード会社、銀行、証券会社である。また、ネット上の(マイクロ)ペイメントの会社もみなそうだ。

これらの企業の中で、分散型の帳簿システムを採用したところに今後注目するべきだろう。それによりトランザクションコストは大幅に下がり他の企業に対する競争の優位性になる。新しい時代のお金の使い方が生まれるかもしれない。そうすればむしろ「採掘」のコストや採掘されたものを記録しておくコストが無い分だけ、ビットコインよりも低コストなはずである。(ビットコインは本来ない制約を設けるために余計なコストがかかっている。)ビットコインはそれら「他の物」が立ち上がるまでの期間だけ栄えるだろう。

なぜ今まで一貫してコンピュータ利用は制約を逃れて来たかというと、コンピュータの本質と関係ない制約を受けない新規参入者は、制約を受けない事による余剰の資源をほかの利点を伸ばすことに使い利便を増やしたからなのだろう。

コンピュータの本来持っている制約のなさに立ちふさがる物はみな、おそらく引きつぶされて行くのだろう。

| | Comments (0) | TrackBack (0)

« January 2014 | Main | March 2014 »