CaboCha(バッド)ノウハウ

前回の 日本語係り受け解析器 CaboCha Ruby 拡張の基本的な使い方とちょっとした応用 - デーで書くのを忘れてて気になるので書いておきます。

CaboCha::Parserをたくさん作らない

CaboCha::Parserはメモリの使用量がすごいので、ひとつだけ作るようにします。
ari3_botを作った当初、CaboCha::Parser.newしまくっていて、さくらインターネットの共有サーバーはメモリ使用量が多いとkillされるので、killされまくっていて、botの状態をデシリアライズする前にkillされてデータが破滅するなどしていました。
Singletonにするなどグローバルにひとつ置いたほうがいいです。

助詞が省略された文を無理やり解析するために「、」を挿入する

Twitterでは、

  • 学校行く (学校へ行く)
  • なに食べる? (なにを食べる?)

のように助詞が省略された文が多くて、こういう文をCaboChaで解析すると「学校行く」「なに食べる?」でひとつのチャンクになってしまいます。(ならないこともある。学習データによるのだと思う。)

学校行く
学校行く
EOS
* 0 -1D 1/1 0.000000
学校    名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー,,      O
行く    動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク,いく/行く, O
EOS
なに食べる?
なに食べる?
EOS
* 0 -1D 1/1 0.000000
なに    名詞,代名詞,一般,*,*,*,なに,ナニ,ナニ,, O
食べる  動詞,自立,*,*,一段,基本形,食べる,タベル,タベル,たべる/食べる/食る,      O
?      記号,一般,*,*,*,*,?,?,?,,    O
EOS

係り受け解析の前処理で省略された助詞をうまく補完できればいいですが、結構難しい問題なので、ari3_botでは

  • 名詞と動詞が並んでいた場合に間に「、」を挿入する

という超テキトウな前処理を入れています。逆におかしくなることもありますが、大体はよくなります。

学校、行く
学校、-D
    行く
EOS
* 0 1D 0/0 0.000000
学校    名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー,,      O
、      記号,読点,*,*,*,*,、,、,、,,    O
* 1 -1D 0/0 0.000000
行く    動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク,いく/行く, O
EOS
なに、食べる?
  なに、-D
  食べる?
EOS
* 0 1D 0/0 0.000000
なに    名詞,代名詞,一般,*,*,*,なに,ナニ,ナニ,, O
、      記号,読点,*,*,*,*,、,、,、,,    O
* 1 -1D 0/0 0.000000
食べる  動詞,自立,*,*,一段,基本形,食べる,タベル,タベル,たべる/食べる/食る,      O
?      記号,一般,*,*,*,*,?,?,?,,    O
EOS

助詞が省略されない場合と大体は同じ結果になるので、プログラムとしては扱いやすくなります。