naoya_t@hatenablog

いわゆるチラシノウラであります

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を持ってきて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するだけでここまで出来るとは。

可能性は感じました。

ススメ→トゥモロウ/START:DASH!!
μ's
ランティス (2013-02-20)
売り上げランキング: 1,985