演習3 最終発表 情報科学科4年 山崎孝裕 自然言語の意味処理 LiLFeS上でHPSGを使って簡単な英文を構 文解析し、文の意味関数を構築する。 構築された意味関数をLiLFeSの述語環境 の下で評価し、与えられた文の真偽を判定 する。または、与えられた文が真となるよう 環境を書き換える。 構文要素の意味関数 構文解析によって得られた構文要素は、関 数として扱う。 構文木が構築され新しい構文要素ができる ことにより、下位の関数が組み合わさって新 しい意味関数が組み立てられる。 関数の型(1) 関数の型はeとtの基本型とそれらを組み合 わせたものからなる。 e: エンティティ t: 真偽値・・・ <α,β>: 型αの引数をとって型βの値を返すよう な関数の型 <α,β>は、「β/α」・「α→β」のように書くことも ある。 関数の型(2) 例 ichiro: e (エンティティ) representative: <e, t> (集合を表す1引数述語) talk: <e, t> (主語を取る1引数述語) attack: <e, <e, t>> (目的語と主語を取る1引数 述語) 関数の適用 型<α,β>を持つ関数に、型αをもつ関数が適 用されることで、型βをもつ関数が構成され る。 今回の実装においては、λ計算のように、仮 引数の部分を実引数で置き換えるという方 法で関数を適用している。 関数の意味 関数はλ抽象されている。 例えば前述のtalkやattackの場合、 talk = λx. talk(x) attack = λx.λy.attack(x, y) のように、述語(イタリック体で表記)に仮引 数を渡しλ抽象している。 文の意味組成(1) “Ichiro attacks Junichi.”という文を考えると、 attack: <e, <e, t>>にjunichiが適用され、 attack junichi: <e, t> = attack(junichi) = (λx.λy.attack(x, y))(junichi) = λy.attack(junichi, y) となる。 文の意味組成(2) さらにこれにichiroが適用され、 ichiro attack junichi: t = (λy.attack(junichi, y))(ichiro) = attack(junichi, ichiro) という意味になる。 文の意味組成(3) どの構文要素と構文要素の関数が適用さ れるかは、構文解析の際の下位範疇化で の組み合わせとなる。 どちらがどちらに適用されるか、すなわちど ちらが関数として振る舞い、どちらが引数と して振舞うかは、両関数の型を見て決定す る。 量化子(1) 量化子の入った表現“Every representative talks.” を考えてみる。 得たい論理表現は、 ∀x.(representative(x) → talk(x)) である。 これは、前とおなじように talk(every representative) としたのではうまく表現できない。 量化子(2) 量化子を型<<e, t>,<e, t>, t>を持つ関数と考 える。すなわち、2つの1引数述語を取るよう な述語と考える。すなわち、everyは、 every = λP.λQ.every(P, Q) = λP.λQ.∀x(P(x) → Q(y)) のように表される。 量化子(3) 改めて“Every representative talks.”の意味 を考えてみると、どちらが関数として適用さ れるかが入れ替わり、 every representative talk = (every(representative))(talk) = ∀x.(representative(x) → talk(x)) のように文の意味を考えることができる。 目的語につく量化子 前で扱った量化子は主語について量化をす るものだった。目的語に量化子がついた場 合には、問題が生じる。 型が合わなくなる。 主語と両方に量化子がついた場合、解釈が複 数考えられうる。 型の不整合(1) 目的語に量化子のついた、“Ichiro attacks every representative.”という文を考える。 自然な解釈としては、 ∀x(representative(x) → attack(x, ichiro)) となるはずである。 型の不整合(2) 関数の構成を試みてみる。構文解析によっ て、attackとevery representativeが組み合わ さるはずであるが、両者の型を見ると、 attack: <e, <e, t>> every representative: <<e, t>, t> のようになっており、これらを適用させること はできない。 型の不整合(3) それぞれの関数を見なおしてみると、 attack = λx.λy.attack(x, y) every representative = λP.∀x(representative(x) → P(x)) である。両者を見比べると、それぞれxで書 いた部分が、文の目的語になるべきである。 attackをPに代入するのを妨げているのはλy の存在である。 型の不整合(4) そこで、適用に加えて、もう一つ関数を組み 上げる方法を考える。すなわち、 λx.λy.P(x, y): α→β→ t λR.Q(R): (α→ t) → γ という形の2つの関数があった場合、 λy.Q((λx.P(x, y))): β→ γ にするというものである。 型の不整合(5) これを用いると、 attack = λx.λy.attack(x, y) every representative = λP.∀x(representative(x) → P(x)) を組み合わせることができ、 型の不整合(6) attack every representative = λy.∀x(representative(x)→(λx.attack(x, y))(x)) = λy.∀x(representative(x) → attack(x, y)) ichiro attack every representative = (λy.∀x(representative(x)→attack(x, y)))(ichiro) = ∀x(representative(x) → attack(x, ichiro)) のように意味関数を構成することができる。 二つの量化子(1) 主語と目的語の双方に量化子がつくと、文 の意味が複数にとれることがある。 たとえば、“Every man likes some women.” のような文があった場合、 ∀y(man(y) → ∃x(woman(x) ∧ like(x, y))) ∃x (woman(x) ∧ ∀y(man(y) → like(x, y))) の二つの解釈が考えられる。 二つの量化子(2) 前者の解釈は先に扱った目的語に量化子がつく 場合の解釈そのままである。 後者に関して、この関数を構成してみる。 まず、3つの表現は、 every man = λP.∀y(man(y) → P(y)) like = λx.λy.like(x, y) some women = λQ.∃x(woman(x) ∧ Q(x)) となっている。 二つの量化子(3) every manを適用すれば先の文の意味関数 になるようにsome womenを構成すると、 λR.(∃x (woman(x) ∧ R(λy. like(x, y)))) のようになる。 この二つを見比べると次のような可能性が 見えてくる。 二つの量化子(4) Q(x)を、二つの関数の合成と考え、 Q(x) = R(P(x)) とし、 some women = λQ.∃x(woman(x) ∧ Q(x)) = λP.λR.(∃x(woman(x) ∧ R(P(x)))) とすることで、このPにlikeを代入することで、先の 表現を手に入れることができる。 二つの量化子(5) これを第三の関数組み上げ規則とすること で、目的語に量化子がついたような表現で あっても、扱うことができるようになる。 参考文献 “Semantics in Generative Grammar” (1997) Irene Heim, Angelika Kratzer Blackwell Pub 『意味論 1 -形式意味論-』 (1998) 杉本孝司 くろしお出版
© Copyright 2024 ExpyDoc