* 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 件のコメント:
コメントを投稿