murawaki の雑記

はてなグループから移転してきました

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

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

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

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

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

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

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

S → NP
  → 姫

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

以下は少し複雑な例。

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

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

S → NP
  → かぐや姫

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

NP → かぐや姫

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

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

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