工藤さんがぐぐたすで紹介してた 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月 28word2vec は単語をベクトル表現にするだけだけど、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 が来ました。惜しい。