N-gram かな漢字変換:続き

昨日(記事を)書いた N-gram かな漢字(&漢字かな)変換について。
プログラムを書いたのはこの一週間ぐらい。
先週は仕事が終わってからマクドナルドで書いて、連休中は家でも書いていた。

N-gram の N は、最初は 3 で十分かと思って、それで試した。
"Trigram に勝つのは難しい" (by Manning 先生 - id:nokuno さんのツイートより)という言葉もあるので。

モデルを作って辞書を構築、変換を動かしてみた。

> ほんをかいたい
本を書いたい

なんだか残念な変換結果が。
どうしてこうなった?

原因は、元コーパスの区切りの細かさ。
「書いた」というのは、"書/か い/い た/た" というように分割されている。
このコーパスを元にして作った trigram によって "ほんをかいたい" を変換する時、次のようなことが起こる。
まず、"本/ほん を/を 書/か" の trigram によって、高い点数を持ったノードができる。
その後も、"を/を 書/か い/い"、"書/か い/い た/た" でも高い点数を取り続ける。
ここまではいいのだが、次の "い/い た/た い/い" のところですでに "書/か" が忘れ去られてしまっているため、ここでも高い点を取ってしまい、結果として "本を書いたい" というものになってしまう。

そこで、単純に N を増やして 4-gram にしてみた。

> ほんをかいたい
本を買いたい

今回はいい感じになった。
4-gram では、"書/か い/い た/た い/い" よりも "買/か い/い た/た い/い" のほうがはるかに良いスコアを得るため(前者の -2.580363 に対し、後者は -0.05844066)。

この 4-gram モデルを辞書にした結果は、marisa-trie のファイルが 3つ合わせて 約40MB ほど、cdb のファイルが約450MB ほど。
この cdb は marisa-trie に格納した n-gram とそのスコア・バックオフスコアを結びつけているだけなので、単純なバイナリファイルにしたほうが効率的になりそうだ。

さて、この 4-gram かな漢字変換、けっこう賢く見える変換をしてくれる。

> いぬをかいたい
犬を飼いたい
> ほんをかいたい
本を買いたい
> まぐろをかいたい
マグロを解体

共起の処理を特にしているわけではないけど、4-gram によって自然にできている。
間に副詞が入るなどしたらもちろんうまくいかなくなるのだが、単純に 4-gram によってデコードしただけということを考えるとけっこううまくいっているんじゃないだろうか。