コードネームは初話ユウ

自然言語処理でいろいろやってみる

オブジェクト指向的な文章理解

前記事で書いた「係り受け・WSD・照応・述語項を同時に処理するシステム」において、評価関数はどのように作るべきか、の話。当然、日本語として「もっともらしい文」が高い点数になるようにしたい。では、文のもっともらしさとは具体的にどう(プログラムにわかる形で)表せばよいのだろうか。

 

はじめに、cabochaを思い出しておこう。cabochaでは、ある文節が別のある文節に「係っていそう」と思われるときにSVMがtrue/falseを返す。ここで素性として使われていたのは、(かなり乱暴に)ざっくり言うと、主に単語・品詞間の統計情報だった。コーパスによく現れた単語/品詞の組合せが、そのまま文のもっともらしさを表す、ということである。これはたしかに、「日本語のもっともらしさ」のかなりの部分を占める重要な要素ではあるだろう。しかし、さすがにそれ*だけ*ということはないだろう。評価関数では他に何と何を考慮すべきか?を検討する必要がある。

 

ちなみにkakarotはもっと単純で、単語は助詞・助動詞しか認識してなく、あとはほとんど品詞(細分類)間の結びつきやすさだけである。kakarotとcabochaの最大の違いは、単語間の選好性を使うか否かだと言ってよいだろう。以前書いたように、対KNBCの係り受け正解率はkakarot 83%, cabocha (v0.65, 京大コーパスで学習) 89%だった。つまり、

 単語間の選好性を使わずに、エラー率は17%まで下がる。

 単語間の選好性を使うと、その17%のうち6%は解決できたが、残り11%には依然対処できない

ということだ。単語間の選好性は重要ではあるが、明らかにそれだけでは足りない。では何が欠けているのだろうか?

 

前回書いたように、WSD/照応/述語項の情報を同時に扱うのは一つの有望な方向だと思っている。しかし考えているうちに、これでもまだ不十分ではないかと思えてきた。それは次のようなケースである:

 

  犯人は太朗で、次郎は無実と判明した。彼を逮捕するため…

 

「彼」の照応候補として「太朗」と「次郎」が挙がったとする。しかし、単語の選好性を見てもこの場合何もわからない。「太朗を逮捕する」と「次朗を逮捕する」で、表現上何も差がないからである。

 

では何をすべきだろうか?このケースで考えるかぎり、オブジェクト指向的な考え方を取り入れるのが最も自然な解決法に思える。単語を見るのではなく、オブジェクトを見るべき、ということである。

 

システムは、「太朗」という単語が出現した時点で、「人間」クラスのインスタンスを生成する。文を処理していく過程で、必要に応じてそのインスタンスのオブジェクト属性を追加していく。たとえば「犯人は太朗で…」を読んだところで、太朗オブジェクトの属性に「犯人」を追加する。「彼」の照応を考える時、照応候補をひとつずつ評価していく。先行詞「太朗」の評価では、「彼」の指すオブジェクトが太朗であると仮定して、「[太朗オブジェクト]を逮捕する」は自然か?と考える。すると、犯人属性を持つオブジェクトを逮捕するのは自然であるとわかるので、評価値が上がる。…といった具合である。

 

そういうわけで、評価関数の基本方針としては

 

 ・名詞はオブジェクトに対応させる

 ・文の処理結果をオブジェクトの属性に反映させる

 ・単語でなく、オブジェクト属性と述語の選好性に評価点を与える

 

ということになる。まあ評価関数は考えるべきことが多く、細かい話もいろいろあってこれだけというわけではないのだが、細部はまた暇があったらおいおい書いていくことにする。

 

さて、これ、アイデアとして正しそうだろうか?実際にシステムを作って評価してみないとわからない、というのが正直なところではあるが、自分の頭の中の処理を内省してみるに、おそらく正しそうな気がする。つまり、頭の中でオブジェクトを管理して、属性によっていろいろ判断しているような気がする。もう一つ、このアイデアがよさそうに思える理由は、述語項の先の、より深い意味理解(RTE等)にも役立ちそうな点。なので、この方向で突き進んでみる価値はありそう、というのが現時点での個人的感触。

 

今まで論文等見たかぎり、こんなふうにオブジェクト指向的な考えを取り入れた処理系はなかった気がする。(まあそんなきっちりサーベイしたわけではないので見落としあるかもしれないが。もしあったら指摘歓迎。)意味の表現形式としては、述語論理的なものが多かっただろう。しかし、述語的表現とオブジェクト的表現で、どちらが人間にとって自然かと言ったら、文句なくオブジェクトの方だろう、と思っている。述語論理型言語であるPrologと、オブジェクト指向言語であるC++Javaとでどちらが普及しているか?と考えてもその点は明らかだろう。

 

このようなシステムを作るのは、相応の複雑さはあるので工数はかかるだろうが、原理的に難しい点はなさそうな気がする。ぱっと見「やればできるだろう」という印象。オブジェクトを正しく指せるためには照応解析がきちんとできることが必須ではあるが、まあそこはできるものと仮定する。というか、照応解析もできないようではその先の意味理解などどうせおぼつかないので、ここは腹をくくって進む、と決める。逆に、オブジェクトとその属性トラッキングさえできればその先は、人間のように喋る「初話ユウ」の実現は案外それほど遠くないのではないか、という気すらする。いや錯覚かもしれないけど。

 

作成上のいちばんの問題はおそらく、辞書作成の工数。辞書は一から作らねばならない。既存の、mecab辞書のようなものは使えない。FrameNetや動詞項構造シソーラスなども、多少似ている点・参考になる面はあるが、やはり「流用して工数を減らせる」とはならない。実はここ数か月少し試していたのだが、2か月くらいかけて数百語という感じで、しかもちょくちょく「この単語どうすればいいんだろう?」みたいにつっかえることも多々あり、一人でやるとかなりかかりそうである。当初はN4の1800語くらいのパイロットシステムを作ろうとしているのだが、辞書も入れて1年でできるかなぁ?というところ。まあ気長にやっていくつもりだが。

 

そんなわけで、次回のブログ更新はいつになるかちょっと見えないが、なにか目に見える進展等あったらまた報告しますんで。