Deep-learningはラテン語の動詞活用を学習できるか? Can deep-learning learn latin conjugation?
工藤さんがぐぐたすで紹介してた word2vec が面白そうだったので。
https://code.google.com/p/word2vec/
で少し遊んでみた。いわゆる deep learning で 単語のベクトル表現を学習してくれる。
面白いのは、2つのベクトルの差が、2つの単語の関係をよく近似してくれること。
It was recently shown that the word vectors capture many linguistic regularities, for example vector operations vector('Paris') - vector('France') + vector('Italy') results in a vector that is very close to vector('Rome'), and vector('king') - vector('man') + vector('woman') is close to vector('queen')
日本語のコーパスを mecab で解析して、何個か試してみた。うまくいった例を抜き出したとはいえ、それっぽい結果が得られた。いいじゃん。
A B C → X (A → Bの関係に対し、 C → X に当てはまるXを探す)
グーグル ヤフー トヨタ → 日産
工藤さんが「word2vecで少し遊んでみた」Google+のエントリ
渋谷 新宿 札幌 → 旭川
警察 泥棒 正義 → くそ
...
word2vecで遊んでみた。2つの単語のベクトルの差が2つの単語の関係を学習している点が非常に面白い。 何個か試したけらそれっぽい結果が得られた。 https://t.co/WEZjZfg9MN
— Taku Kudo (@taku910) 2013, 8月 28
word2vec は単語をベクトル表現にするだけだけど、deep learningがNLPにどう貢献するかっていう問いに対するベストアンサーだと思う。 実用性や扱いやすさという点で抜群に良いし、機械学習タスクの素性として使うだけでも精度向上が見込めそう。
— Taku Kudo (@taku910) 2013, 8月 29
だって可能性感じたんだ
そうだ…ススメ!
というわけで
準備
word2vecを持ってきてmakeします
https://code.google.com/p/word2vec/
うちでは #include <malloc.h>をコメントアウトしたりとかしました
ラテン語版Wikipediaの記事を持ってきてですね
( lawiki-20130824-pages-articles.xml.bz2, from http://dumps.wikimedia.org/backup-index.html )
wp2txtでテキスト抽出して
https://github.com/yohasebe/wp2txt
改行を除去したり記号類をsed等でちょちょいと削除したりして
# flatten.sed # 改行除去はここではやってないけどね s/^\[\[[^\]*\]\]//g s/^CATEGORIES:.*$//g s/^==*[^=]*==*$//g s/^[\*#:;| ].*$//g s/([^)]*)//g s|\[tpl\].*\[/tpl\]||g y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ s/[^a-z ]/ /g
word2vecでdeep learning訓練
$ ./word2vec -train lawiki.txt -output lawiki.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
word-analogyしてみる
$ ./word-analogy lawiki.bin
3つの単語を入れます。
Enter three words (EXIT to break): est sunt dat Word: est Position in vocabulary: 3 Word: sunt Position in vocabulary: 7 Word: dat Position in vocabulary: 1206 Word Distance ------------------------------------------------------------------------ dant 0.510058 temptant 0.457446 sinunt 0.455193 molles 0.453565 ...
- est: sum (to be) の直説法現在3人称単数
- sunt: 同3人称複数
- dat: dō (to give) の直説法現在3人称単数
- dant: 同3人称複数
おおすごい。
Enter three words (EXIT to break): est fuit dat Word: est Position in vocabulary: 3 Word: fuit Position in vocabulary: 8 Word: dat Position in vocabulary: 1206 Word Distance ------------------------------------------------------------------------ dedit 0.448177 stoicus 0.423206 didicit 0.415862 agardh 0.411153 ...
est: sum (to be) の直説法現在3人称単数
fuit: sum の直説法完了形3人称単数
dat: dō (to give) の直説法現在3人称単数
dedit: dō の直説法完了形3人称単数
いやこれ多分たまたまです
Enter three words (EXIT to break): est erat dat Word: est Position in vocabulary: 3 Word: erat Position in vocabulary: 26 Word: dat Position in vocabulary: 1206 Word Distance ------------------------------------------------------------------------ dedit 0.509265 dare 0.468489 daret 0.450646 navavit 0.415491 ...
erat: sumの直説法未完了形3人称単数
これに対応する形 dabat は現れず、完了形の dedit が来ました。惜しい。
感想
うまく行ったやつだけ見せてるのであれですが、コーパス用意してword2vecするだけでここまで出来るとは。
可能性は感じました。