読者です 読者をやめる 読者になる 読者になる

コードネームは初話ユウ

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

係り受けの次のステップ

いろいろ雑用に手を取られたりして間が空いてしまったが、その後も考えつづけている。

 

係り受けは現在(kakarotもcabochaも)正解率8割台。研究としてはそこそこいいものの、実用レベルから言うとまだ不十分だろう。97~98%程度にしたいところだが、それには何らかのブレークスルーが必要と思う。

 

JDC等を使って単語間の選好性を使うことを以前考えていたが、それだと若干改善はするかもしれないが、まだしょせん文の上っ面を見ているだけなので、ブレークスルーにまではならないような気がしてきた。それより、どうせいずれ意味の世界に踏み込まざるを得ないのだから、この際行ってしまおう、ということで、単なる係り受けを越えて意味解析にトライしようとしているところ。

 

さて「係り受けの次の意味解析」って何だろう?係り受けから先は混沌とした世界で、定番というか確立された技術はないような気がしているが、「必要だろうと思われている処理」という観点では次のようなものが挙げられそうだ:

 

  •  語義曖昧性解決(Word Sense Disambiguation: WSD)
  •  照応・共参照解析
  •  述語項解析

 

このほか含意関係認識なども挙げられるだろうが、これは上の3つよりもう少し先にあると思う。なので、当面この3つを中心に考えてみる。

 

いくつかこの辺の論文を見ていて真っ先に気になることのひとつは、いわゆる「パイプライン方式」ではまずいのではないか、ということだ。述語項解析の実験的なシステムがいくつかあるが、それらはいずれも(cabocha等の)係り受けの出力を受け取り、それに対して(係り受けの結果は正しいとして)ガ格やヲ格を決める。しかし、これはやはりおかしいだろう。たとえば

 

  割り箸を食べた弁当の箱にしまう

 

という文に対して、述語項を考えない係り受けだと「割り箸を」が「食べた」に係る、と判断しがちだ。(実際、cabocha(0.64)ではこうなる。)だが、その後述語項に行き、「弁当」は「食べた」のガ格かヲ格かと考えると、単語間の選好性(コーパスでの出現頻度)を考慮すると弁当「を」食べた、としたくなる。しかし係り受けが正しいとする限り、「食べた」のヲ格は「割り箸」しかあり得ないため、正しい解析ができない。

 

本来やりたい処理はこうだろう:

「割り箸を」は、構文的に見ると「食べた」に係りそうに思えるけど、「弁当」は「食べた」のヲ格だよな。とすると「割り箸を」が係るのは「食べた」ではなく「しまう」なのか。

 

こういう判断をできるためには、係り受けと述語項は直列に実行するのではなく、同時に処理するべきではないか、と思える。

 

照応やWSDも同様だ。

「犯人がやって来ました!彼を逮捕して下さい」

という文で、「彼」の先行詞が何か?「犯人」か?と考えるとき、「彼」を「犯人」で置き換えた「犯人を逮捕する」が自然な表現か?を考慮すべきだろう。そのためには照応と述語項も別々でなく同時に処理するべきと思われる。

WSDでも、「太朗が走る」のか「プログラムが走る」のか、「走る」の語義によって述語項の判断が変わる。これも同様に、同時に処理するべきと思われる。

 

以上のようなわけで、係り受け・WSD・照応・述語項は同時に処理する方が精度が上がりそうだし、またそれは可能のように思える。というわけで、「係り受け・WSD・照応・述語項を同時に処理するシステム」をこれから作ってみようと思う。

 

具体的にどうするのか?別にあまり難しいことは考えていない。私が作るので、当然kakarotをベースにする。kakarotが全幅探索であったことを思い出そう。係り受けで、各文節から可能な係り先をすべて挙げ、それらを順に試す。それぞれの係り受け方(各文節からの係り先の組)に評価値を与え、値が最大になる係り受け方を選ぶ。

 

これと同じことをやるだけである。WSDでは、各単語の語義の候補は辞書から直接わかる。述語項では、ゼロ照応を除き、係り受けの関係のあるものが候補になる。連体節(「食べた弁当」)や副助詞の場合はガ格なのかヲ格なのかわからないが、可能性のあるものをすべて候補として挙げておけばよい。候補の中のどれが正解かは、評価値が決めてくれる。照応の候補列挙の方式はやや複雑になりそうで、これについてはまだ深く検討できていないのだが、論文でその問題を論じたものもあるので、まずはそれらを参考にしながら候補を挙げていけるだろう。

 

各選択肢について候補を挙げることができれば、あとは全幅探索で評価最大のものを求めるだけである。計算量が気になるだろうが、kakarotでの経験からして、ここは何とかなるのではないかと思っている。少なくとも係り受けでは、相当原始的な探索アルゴリズムでも、通常の長さの文なら瞬時に終わる。WSD・照応・述語項が加わっても、たぶん致命的に長くはならないだろう。私は以前のPJTでこの手の探索をやっていたが、ちょっとチューンするだけで原始的なアルゴリズムは百倍、千倍高速化できることもざらにある。という経験があるので、あまり心配していない。

 

もうひとつ決めるべきは、評価関数である。これについては、長くなってきたので次の記事に書く。