2009年7月7日火曜日

【LPN】8 More Definete Clause Grammars


* 8 More Definete Clause Grammars
- defineteということはindefineteもあるのかどうか、
というのが気になる。
** 1 Extra Arguments
- Context free grammars with features
- 代名詞の導入。
s --> np_subject,vp.

np_subject --> det,n.
np_object --> det,n.
np_subject --> pro_subject.
np_object --> pro_object.

vp --> v,np_object.
vp --> v.

det --> [the].
det --> [a].

n --> [woman].
n --> [man].

v --> [shoots].

pro_subject --> [he].
pro_subject --> [she].
pro_object --> [him].
pro_object --> [her].

- lexicon : 辞書
- 代名詞をいれただけで、これだけ文法を書きかえな
ければいけないのはうまくない。また、代名詞と名
詞は多くの性質を共有しているのにそれをまったく
別に定義する、というのもうまくない。
- これらをうまくやるのがextra arguments。

s --> np(subject),vp.

np(_) --> det,n.
np(X) --> pro(X).

vp --> v,np(object).
vp --> v.

det --> [the].
det --> [a].

n --> [woman].
n --> [man].

v --> [shoots].

pro(subject) --> [he].
pro(subject) --> [she].
pro(object) --> [him].
pro(object) --> [her].

- npにfeaturesを追加した。
- DCG with argumentsは、言語処理のための最新のツー
ルではない。しかし単なるおもちゃでもない。相当に
洗練された文法を記述できる。

- Building parse tree
- うーん、

s(np(det(a),n(woman)),vp(v(shoots))).

(s (np (det a) (n woman)) (vp (v shoots)))

S式の方が見易いと思うんだけどなぁ。まあそれは
PAIPで。

- extra argumentsを利用してparserにする。

s(s(NP,VP)) --> np(NP),vp(VP).

np(np(DET,N)) --> det(DET),n(N).

vp(vp(V,NP)) --> v(V),np(NP).
vp(vp(V)) --> v(V).

det(det(the)) --> [the].
det(det(a)) --> [a].

n(n(woman)) --> [woman].
n(n(man)) --> [man].

v(v(shoots)) --> [shoots].

- DRYではないが、書けるぞ、という感じ。
- extra argsは、semantic representationsを構築す
るのにも便利につかえる。
- semantic representationsはformal languagesによっ
て記述される。例えば、
- first order logic
- discourse representation structures
: 談話言語表示理論
- a database query language
- これらはcompositonaryに構築される。
- というのは単純にそれぞれの単語の意味を結合する
だけではなくて、parse treeの構造をみつつ、意味
を構築していく。

- Beyond context free language
- DCGはCFG以外の文法も記述できる。
- 例えば、{a^nb^nc^n\{e}}。

s(Count) --> ablock(Count),bblock(Count),cblock(Count).
ablock(0) --> [].
ablock(succ(Count)) --> [a],ablock(Count).
bblock(0) --> [].
bblock(succ(Count)) --> [b],bblock(Count).
cblock(0) --> [].
cblock(succ(Count)) --> [c],cblock(Count).

** 2 Extra Goals
- DCGの右側ではPrologの機能を使える。
- それはextra goalsとして、であり、{}で囲む。

s --> ablock(Count),bblock(Count),cblock(Count).
ablock(0) --> [].
ablock(NewCount) --> [a],ablock(Count),
{NewCount is Count + 1}.
bblock(0) --> [].
bblock(NewCount) --> [b],bblock(Count),
{NewCount is Count + 1}.
cblock(0) --> [].
cblock(NewCount) --> [c],cblock(Count),
{NewCount is Count + 1}.
- なお、これはrecogniserとしてのみ使える。

- Separating rules and lexicon
- Extra Goalsの有用な応用として文法と辞書の分離が
ある。
- 自然言語のlexiconsは巨大になるので実戦においても
メリットがある。
- Prologはfirst argment indexingを実施しているの
で、効率もよくなる。
** 3 Concluding Remarks
- DCGはturing-complete。
- "all top-down parsers loop on left-recursive
grammars." なるほど。
- なお、DCGという記法に何か問題があるわけではない。
それのPrologの解釈(実行する手続き)に注意が必要
だということだ。syntaxとsemanticsの分離というこ
とか。
** 4 Exercise
- Exercise 8.1.

s --> np(X),vp(X).

np(X) --> det(X),n(X).
vp(X) --> v(X),np(_).
vp(X) --> v(X).

det(plur) --> [the].
det(sing) --> [the].
det(sing) --> [a].

n(sing) --> [woman].
n(sing) --> [man].
n(sing) --> [apple].
n(sing) --> [pear].
v(plur) --> [eat].

n(plur) --> [women].
n(plur) --> [men].
n(plur) --> [apples].
n(plur) --> [pears].
v(sing) --> [eats].

- Exercise 8.2.

kanga(V,R,Q,A,C) :-
roo(V,R,A,B),
jumps(Q,Q,B,C),
marsupiral(V,R,Q).

** 5 Practical Session

- 1.

lex(woman,n,sing).
lex(man,n,sing).
lex(apple,n,sing).
lex(pear,n,sing).
lex(women,n,plur).
lex(men,n,plur).
lex(apples,n,plur).
lex(pears,n,plur).

lex(a,det,sing).
lex(the,det,sing).
lex(the,det,plur).

lex(eat,v,plur).
lex(eats,v,sing).

lex(he,pro,sing,subj).
lex(she,pro,sing,subj).
lex(him,pro,sing,obj).
lex(her,pro,sing,obj).


s(s(NP,VP)) --> np(NP,X,subj),vp(VP,X).

np(np(DET,N),X,_) --> det(DET,X),n(N,X).
np(np(PRO),X,Y) --> pro(PRO,X,Y).
vp(vp(V,NP),X) --> v(V,X),np(NP,X,obj).
vp(vp(V),X) --> v(V,X).

det(det(Word),X) --> [Word],{lex(Word,det,X)}.
n(n(Word),X) --> [Word],{lex(Word,n,X)}.
v(v(Word),X) --> [Word],{lex(Word,v,X)}.
pro(pro(Word),X,Y) --> [Word],{lex(Word,pro,X,Y)}.

- 2.
/* lexicon */
lex(woman,n,sing,third).
lex(women,n,plur,third).
lex(man,n,sing,third).
lex(men,n,plur,third).
lex(apple,n,sing,third).
lex(apples,n,plur,third).
lex(pear,n,sing,third).
lex(pears,n,plur,third).

lex(a,det,sing).
lex(the,det,sing).
lex(the,det,plur).

lex(eat,v,plur,third).
lex(eats,v,sing,third).
lex(eat,v,plur,first).
lex(eat,v,sing,first).
lex(eat,v,plur,second).
lex(eat,v,sing,second).

lex(i,pro,sing,subj,first).
lex(me,pro,sing,obj,first).
lex(you,pro,sing,subj,second).
lex(you,pro,sing,obj,second).
lex(he,pro,sing,subj,third).
lex(him,pro,sing,obj,third).
lex(she,pro,sing,subj,third).
lex(her,pro,sing,obj,third).

lex(in,prep).
lex(on,prep).
lex(under,prep).
lex(over,prep).

lex(small,adj).
lex(big,adj).
lex(beautiful,adj).
lex(frightened,adj).
lex(fat,adj).
lex(tall,adj).

s(s(GNP,VP)) --> gnp(GNP,SP,subj,Person),vp(VP,SP,Person).

/* general noun phrases */
gnp(gnp(PRO),SP,SO,Person) --> pro(PRO,SP,SO,Person).
gnp(gnp(NP),SP,_,Person) --> np(NP,SP,_,Person).

/* noun phrases */
np(np(DET,NC),SP,_,Person) --> det(DET,SP),nc(NC,SP,Person).
np(np(NP,PP),SP,SO,Person) --> np(NP,SP,SO,Person),pp(PP).

/* noun cores */
nc(nc(N),SP,Person) --> n(N,SP,Person).
nc(nc(ADJ,NC),SP,Person) --> adj(ADJ), nc(NC,SP,Person).

/* preposition phrase */
pp(pp(PREP,GNP)) --> prep(PREP), gnp(GNP,_,obj,_).

/* verb phrases */
vp(vp(V),SP,Person) --> v(V,SP,Person).
vp(vp(V,GNP),SP,Person) --> v(V,SP,Person),gnp(GNP,SP,obj,_).

/* load lexicon */
det(det(Word),SP) --> [Word],{lex(Word,det,SP)}.
n(n(Word),SP,Person) --> [Word],{lex(Word,n,SP,Person)}.
v(v(Word),SP,Person) --> [Word],{lex(Word,v,SP,Person)}.
pro(pro(Word),SP,SO,Person) --> [Word],{lex(Word,pro,SP,SO,Person)}.
prep(prep(Word)) --> [Word],{lex(Word,prep)}.
adj(adj(Word)) --> [Word],{lex(Word,adj)}.


えっと、、、、
形容詞を問題文のように入れると無限ループが発
生するので、いろいろ支障があると思うのだが。形容
詞は2個までとか制限をつけるのかなぁ


最後の課題が結構タフだった。
こつこつ。

0 件のコメント: