Hatena::Grouprekken

murawaki の雑記

2009-11-22

解けない曖昧性は候補の列挙にとどめるべき

日本語の形態素解析について、問題設定が微妙ではないかと思う部分の一つとして、過度の曖昧性の解消を挙げてみる。

例から入る。ひらがな表記の動詞「くる」を考える。対応する漢字表記として挙げられるのは「来る」と「繰る」。*1そもそも一般に、和語は広い意味を持ち、複数の漢字が充てられることが多い。例えば、「あける」に対応するのは「明ける」、「空ける」、「開ける」。ひらがな表記に対応する漢字表記を推定することは、粗粒度の語義曖昧性解消と見なせる。

「あける」のように、一つの基本的な語の意味が分化した場合は置いておく。今回問題にするのは、元々別の語が衝突する場合。正確に言うと、品詞が異なる場合。「くる」の場合、「来る」はカ変動詞なのに対し、「繰る」はラ行の動詞。ただし衝突するのは基本形の場合で、否定表現では「こない」、「くらない」と異なる。もう一つ例を挙げると、「あった」はワ行の動詞「会う」または「合う」、またはラ行の動詞「有る」と解釈できる。

さて、形態素解析は、文を形態素 (単語) に分割して、各形態素に品詞を割り当てるタスクである。つまり、「くる」が入力されたら、カ変とラ行のいずれかを決めなければいけない。高精度に同定できるのならいいが、現実はそうではない。試しに「くる」を含む文を手元の MeCab で解析させると、以下のようになった。

  • 「くる」はラ行
  • 「くる。」はカ変
  • 「人がくる」はカ変
  • 「人がくる。」はカ変
  • 「紙をくる」はラ行
  • 「紙をくる。」はカ変
  • 「くる人」はカ変

安定しない。当たるも八卦当たらぬも八卦という感じである。

なぜ安定しないのか。現在使っている手がかりが、曖昧性解消を行うのに十分ではないから。現在使っている手がかりは、形態素の生起コストと、形態素同士の連接コスト。要するに、考慮しているのは隣の形態素との関係までで、それより遠い形態素との整合性を考えていない。

反対に、どんな知識があればこうした曖昧性の解消が行えるか。有効そうな手がかりの一つは、KNP が使っているような述語項構造。例えば、「春がくる」は、述語「くる」が「春」という項を格「が」で支配している。この場合は明らかに「来る」の意味。また、「糸をくる」とあれば「繰る」。この例だと、直前の形態素「が」や「を」との連接を考えれば、現在の形態素解析でも同定できそうだと言われそうだ。しかし、「春がついにくる」のように、別の要素を間に挟むことができる。そうなれば、連接だけでは分からなくなる。もちろん格が同じ例も作れる。「機会があった」と「私があった」なら、前者は「有る」で後者が「会う」。

もちろん述語項構造の語彙知識があればすべて解決できるわけではない。単に「くる」とあって格要素が省略されている場合には、さらに広い文脈を考慮する必要があるだろう。それでも、現在の形態素解析では正しくできない識別が述語項構造を知っていればできる。

では、どうすれば良いか。一般的な解法としての定石は、形態素解析はとりあえず N-best を出力して、上位の解析における敗者復活の可能性を残すこと。つまり、正しい候補が形態素解析時点で誤った候補にスコアで負けていても、上位の解析のスコアを組み合わせると勝つという設定。上位の解析としては、文節チャンキングと構文解析 (係り受け解析)、格解析がある。挽回の可能性があるのは、構文・格解析。しかし、現状でこれを実現するには障害が多い。

  • MeCab の解析結果を受ける構文解析器 CaboCha は、述語項構造の語彙化された知識を持っていない (訓練用の小規模なタグ付きコーパスに偶然出現した場合を除く)。よって、形態素解析の誤りからの回復が期待できない。
  • ある文に対する形態素解析結果 Am と Bm について、対応する構文解析結果 Ad と Bd を考えた時、Ad と Bd を直接比較できるようなスコアをつけなければいけない。しかし、現状では、一つの形態素解析結果に対する複数の構文解析結果 Ad1 と Ad2 の比較に特化している。おそらく、別々の形態素解析結果を比較できるようなスコアを返さない。特に文節区切りが異なる場合、文節数が少ない候補にバイアスがかかりそうだ。

一般的な解法をあきらめて、「くる」や「あった」のように、区切りは同じで品詞のみが異なる場合に特化した解法を考える。とりあえず思いつくのは以下の二つ。

  • 形態素解析の前または後に ad-hoc な処理で曖昧性の候補を列挙しておき、格解析の段階でそれを参照する。
  • 形態素解析のコスト学習時に「来る」の「くる」と「繰る」の「くる」が同じスコアになるように制約をかける。

いずれにしても、曖昧性のある形態素をあらかじめ列挙しておかないといけない。

*1:IME は「刳る」という候補も出すけど、辞書によれば「えぐる」という読みが標準的らしい。

2009-11-18

終端記号が定義されていない

終端記号が過不足なく定義されていないというのは、自分の研究の問題設定の説明として思いついた話。ボツになりそうなのでここに載せる。

文脈自由文法を考える。自然言語だけでなく、プログラミング言語にも用いられるおなじみの文法。

文脈自由文法では導出規則が与えられる。

S → NP
NP → NP NP1
NP1 → や NP 
NP → かぐ
NP → 姫

ここで、NP のように展開できるものが非終端記号、「姫」のように展開できないものが終端記号。

導出規則により文が生成される。反対に、与えられた文に対して導出木が作れたら文法的である。

S → NP
  → 姫

つまり「姫」は正しい文。

以下は少し複雑な例。

S → NP
  → NP NP1
  → かぐ NP1
  → かぐ や NP
  → かぐ や 姫

よって、「かぐ や 姫」も正しい文である。しかし、文を与えた側の意図としては、以下のような導出木を期待している。

S → NP
  → かぐや姫

しかし、これを作ることはできない。以下の導出規則が欠けているからである。

NP → かぐや姫

こうした問題が見つかったとき、扱う言語がプログラミング言語であれば、文法設計が不良だったということになって、(人手で) 文法を手直しするだろう。一方、自然言語ではこうした問題は普通に見られる。終端記号が過不足なく定義されているという前提を捨てるのが現実的である。

入力文は未定義の終端記号を含んでいる可能性がある。なお、自然言語における実際的な設定では、入力文は (実際には誤字などを含んでいる可能性があるけど) 基本的に文法的と考える。もし、入力文に対して導出木が作れなければ、入力文が文法的でないのではなく、文法側に問題があると考える。例えば、入力文「グーグル」に対して導出木が作れない。それは終端記号が足りてないからだということになる。

難しいのは、「かぐ や 姫」のような場合があること。つまり現在の文法で文法的だと解釈できるのに、実は未定義の終端記号を含んでいる。