Google 日本語入力のヒューリスティック

Google 日本語入力のソースコードが公開されたらしい。Mozc (もずく)という名前だそうで。オフィシャルブログだけではなく、Twitter でもものすごい勢いで伝播していたようだが、すごい食いつきである。そして、公開されるやいなや読んだ人もたくさんいるようで、そちらもすごいなと思う。日本語入力エンジンのソース読む人なんて、ほとんどいないと思っていたのだが、逆にこんなに日本語入力って注目されるんだ、と嬉しい気持ちである(でも日本語入力エンジン作る人が増えたりはしないのかもしれない)。

そんな感じでいち早くソースコード読まれた @tkngさんがMozc(Google日本語入力)のコードを読んだメモを公開してくださった。ありがたい。変換アルゴリズムは、挙動から考えてそうだろうな、と思っていたのと同じだった。変換履歴を用いたリランキングをするところがなかなか難しいのだが、@tkng さんも手こずっているようで、実際どうするのが正解なんだろうか。

SVMソースコードが中に入っているがなんの目的か分からない、予測候補で出てくる出したくない候補を削るファイルに「ただしイケメンに限る」だけ入っているが、本来は(オープンソースではないバージョンは)もっとたくさん入ってるのだろう、という話もあり、なるほどな、と思っていたら、@nokunoさんも読んだらしく、SVMによる予測変換という記事を書いてくださったので、参考になる。タイトルにもあるように、@tkng さんが「SVM は何に使っているんだろう」という問いの答えは、「予測入力に使っている」ということである。

詳しくは @nokuno さんの解説に譲るが、予測入力に使うパラメータを23個選択し、その重みを SVM を用いてデータから学習する、という感じ。iPhone の変換で「おはよう」と入れようとすると「おはヨーグルト」が予測されてしまうというのは有名な問題なのだが、Google 日本語入力ではこういうのはひたすら人手で「NG ワードリスト」として登録しているのであろう。機械学習にすればモデルはすっきりし、辞書構築もほぼ自動でできるようにはなるのだが、逆に自動化した結果混ざってしまうゴミも取り除かないといけないので、こういうところはどうしても人手でやる必要がある。

要は、全部人手でヒューリスティックからなにからボトムアップに作っていく方法(従来はこちらばかりだった)と、逆に統計モデルや機械学習のような数理的な手法でトップダウンに作っていく方法の2つがあるのだが、後者でも人手でなんとかしなければならない部分はどうしても残るわけで、先日のさきがけのパネルセッションでもどなたかが「ヒューリスティックは入れたくないと言う若い人も増えてきたが、ヒューリスティックこそが人工知能であって、ヒューリスティックのほうがむしろ大事」とおっしゃっていたのを思い出した。かな漢字変換で言うと、「この品詞はこの品詞と接続しない」とか、「この品詞とこの品詞は接続するが、この単語のときだけ例外」みたいなルールを信じがたいくらい知っている人たちがいるのだが、統計ベースに一気に移行することで、このような知識が全部消えてしまうのは損失だと自分は考えていて、なんとかしてこのようなヒューリスティックと統計的な推論をうまく接合できないか、と思うのである。知識を積み重ねるのも大変だし時間もかかるのだが、一番時間がかかるのはそういう知識をもった人材を育成することであり、辞書は作った人がいなくなってもまだ使えるが、人材は一度離れてしまうとそうそう戻ってくるものではない。

@nokuno さんの記事に戻ると、予測入力とかな漢字変換で辞書を共通にしているのでこのような仕組みになっているのだろう、という推測が書いてあるが、ここで強調しておきたいのは、基本となる辞書とロジックを両方同じにしておいて(予測入力の素性の一つに「コスト」が入っていることに注意)、予測入力は出す前にもう一手間かける、という仕組みになっているので、かな漢字変換部分のアルゴリズムや辞書を更新した恩恵を予測入力も受けることができる、という点である(よくできている、というのは同感)。かな漢字変換と予測入力はこのように統合するべきだと常々思っているのだが、かな漢字変換側から統合すればこのようなアーキテクチャにするのが自然であろう。予測入力側から統合することも可能性としてはあると思うのだが、携帯各社が持っている予測入力に関する「ヒューリスティック」がなんなのか、もしかすると携帯というデバイスに特化したようなアルゴリズムなのかなぁ、とも思ったりするのである。

辞書についてもう一言言っておくと、辞書部分は Mozc 自体には含まれていないそうで、これは予想していた通り。Google の持っているウェブデータ(+検索クエリログくらい?)を用い、単語と読みのペアをいかに大規模に獲得しているか(単語の表記だけなら簡単に獲得できるのだが)、というところが今回の「ヒューリスティック」に当たるわけで、その部分に自分はとても興味があるのだが、恐らく自然言語処理の研究者でなければ興味がないだろう(笑)

@yatsuさんのブログにIME開発者会議@Google食堂の記事があるが、自分も行きたかったな〜。ちょっとタイミングが合わなかった(4月は死にそうだった)ので、次回の開催に期待 :-) Baidu Type も今後強化していく予定だそうで、盛り上がってきているところなのかな?