構文解析
構文解析(こうぶんかいせき、Syntactic Analysis)とは、ある文章の文法的な関係を説明すること(parse)。計算機科学の世界では、構文解析は字句解析(Lexical Analysis)とともに、おもにプログラミング言語などの形式言語の解析に使用される。また、自然言語処理に応用されることもある。
形式言語の構文解析
たとえば、インターネット上の Webページやメールアドレスをあらわす URL は、次のような構文をもっている: http://サーバ名/パス名 (webページをあらわす場合, http://ja.wikipedia.org/ など) mailto:ユーザ名@ドメイン名 (電子メールアドレスをあらわす場合, mailto:god@heaven.mil など) ブラウザに "http://ja.wikipedia.org/index.html" などの文字列を入力した場合、ブラウザはそこからサーバ名 "ja.wikipedia.org" とパス名 "index.html" を読みとらなければならない。これは構文解析の非常に簡単な例である。より複雑な構文解析は、C や JAVA などのプログラミング言語において次のような数式を計算する場合に必要となる。
- 2 + ( a + b × c ) ÷ ( d - e )
- 数値:2 + 式:( 式:( 変数:a + 式:( 変数:b × 変数:c ) ) ÷ 式:( 変数:d - 変数:e ) )
一般に、形式言語の構文解析は曖昧でない言語を対象としている。ある言語が曖昧であるとは、ひとつの文にたいして2通り以上の構文解析が可能であることをいう。初期のプログラミング言語にはよく知られた「elseぶら下がり問題(dangling-else problem)」が存在した。たとえば以下のような文脈自由文法 であらわされる言語を考える:
- 文 ::= if 文 then 文
- 文 ::= if 文 then 文 else 文
- if A then if B then C else D
ふつうコンピュータの動作には厳密さが要求され、このように複数の解釈があることは許されないため、このような曖昧な文法をもつプログラミング言語は現在では存在していない。
自然言語の構文解析
構文解析の観点からみた形式言語と自然言語のちがいは、それが曖昧であるかないかということである。
プログラミング言語とは違って、自然言語は通常何十通りもの解釈が存在する。たとえば形態素解析の項で挙げた「うらにわにはにわとりがいる」のような例の他にも、次のような文:
- 美しい 水車小屋の 乙女
- ここでいう「曖昧」とは、文の意味を知るために、その文が置かれた状況、言い換えるとコンテキスト、フレーム情報などを考慮しなければ、同定できないということを指す。決して自然言語では曖昧な表現しかできないという意味ではないことに注意せよ。
いっぽう、もし文が以下のような係り受け構造をもっていたとすれば、この場合「美しい」のは水車小屋のほうである。