310 likes | 499 Views
dcg-notation. 21.2 G 2.3 M 8.1.2 (BBS 8). dagens föreläsning. extra argument i dcg-notation prolog-anrop i dcg-notation avslutande kommentarer om dcg. repetition. ett språk är en ändlig mängd satser en sats är en lista av terminaler
E N D
dcg-notation 21.2 G 2.3 M 8.1.2 (BBS 8)
dagens föreläsning • extra argument i dcg-notation • prolog-anrop i dcg-notation • avslutande kommentarer om dcg
repetition • ett språk är en ändlig mängd satser • en sats är en lista av terminaler • en grammatik är en ändlig samling regler som definierar ett språk • cfg-regler har i prolog formen: x0 --> x1, …, xn . där x0 är icke-terminal och xi kan vara terminal eller icke-terminal
repetition • implementera cfg: • append • differenslistor • dcg-notation • parsning av meningen [en,hund,jagar,en,bil] • append: • differenslistor/dcg: 56 instruktioner 30 instruktioner
icke-terminaler terminaler repetition • vi använde dcg-notation för att skriva cfg-regler: s --> np, vp . np --> det, n. vp --> v, np. det --> [en]. n --> [hund]. n --> [bil]. v --> [jagar].
repetition • inom NLP kan cfg bl a användas för: • parsning • dvs ”känna igen” samt ge struktur åt satser • generering • dvs konstruera satser (parsningens ”motsats”)
en cfg för siffror siffra --> ”ett”. siffra --> ”två”. … siffra --> ”nio”. • ”ett” = [e,t,t] != [ett]
fler siffror ental --> ”ett”. ental --> ”två”. ental --> ”tre” . … tontal --> "tio". tontal --> "elva". tontal --> "tolv". … tiotal --> ”tjugo”. tiotal --> ”trettio”. … under100 --> ental . under100 --> tontal . under100 --> tiotal, ental.
körning… ?- under100(X,[]). X = [e,t,t] ? ; X = [t,v,å] ? ; … X = [t,i,o] ? ; X = [e,l,v,a] ? ; … X = [t,j,u,g,o,e,t,t] ? ; X = [t,j,u,g,o,t,v,å] ? ; … X = [t,r,e,t,t,i,o,e,t,t] ? ; X = [t,r,e,t,t,i,o,t,v,å] ? …
körning… ?- under100("trettiotre",[]). yes
argument • definite clause grammar (dcg) utökar cfg genom att tillåta argument i vänsterledet. % exempel på dcg med argument siffra(0) --> ”noll” . % = [n,o,l,l] siffra(1) --> ”ett” . % = [e,t,t] siffra(2) --> ”två” . % != [två] … ?- siffra(X, ”två”, ””). X = 2
observera ariteten! ”dolda” argument argument (forts.) • dcg: siffra(1) --> ”ett” . • ”vanlig” prolog ger: siffra(1, List1, Rest) :- ’C’(List1,e, List2), % ’C’ kan läsas som ”terminal” ’C’(List2,t, List3), % se SICStus-manualen! ’C’(List3,t, Rest).
numerus i naturligt språk s --> sing_sentence . s --> pl_sentence . sing_sentence --> sing_np, sing_vp . pl_sentence --> pl_np, pl_vp . sing_np --> sing_det, sing_noun . sing_vp --> sing_verb . sing_vp --> sing_verb, np . … sing_noun --> [dog]. pl_noun --> [dogs].
% ett extra argument för numerus s(Num) --> np(Num), vp(Num) . vp(Num) --> v(Num), np(Num2) np(Num) --> det(Num),n(Num) . n(sing) --> [dog]. n(pl) --> [dogs]. n(sing) --> [car]. n(pl) --> [cars]. v(sing) --> [chases]. v(pl) --> [chase]. det(sing) --> [a]. det(pl) --> [the]. ”vanlig prolog”: s(Num, List1, Rest) :- np(Num,List1,List2), vp(Num,List2,Rest). numerus med hjälp av argument
körning… ?- s(pl,X,[]). X = [the,dogs,chase,a,dog] ? ; X = [the,dogs,chase,a,car] ? ; X = [the,dogs,chase,the,dogs] ? ; X = [the,dogs,chase,the,cars] ? ; […] ?- s(sing,X,[]). X = [a,dog,chases,a,dog] ? ; X = [a,dog,chases,a,car] ? ; X = [a,dog,chases,the,dogs] ? ; X = [a,dog,chases,the,cars] ? ; […]
bestämd/obestämd form s(Num,Det) --> np(Num, Det), vp(Num, Det) . vp(Num,Det) --> v, np(Num2,Det2) . np(Num,Det) --> det(Num,Det),n(Num,Det) . np(Num,Det) --> n(Num,Det). n(sing,obest) --> [hund]. n(sing,best) --> [hunden]. n(sing,obest) --> [bil]. n(sing,best) --> [bilen]. n(pl,obest) --> [hundar]. n(pl,best) --> [hundarna]. n(pl,obest) --> [bilar]. n(pl,best) --> [bilarna]. v --> [jagar]. % jfr engelska: v(sing) --> [chases]. v(pl) --> [chase].
körning… ?- s(sing,Det,X,[]). X = [en,hund,jagar,en,hund], Det = obest ? ; … X = [den,hunden,jagar,en,bil] ? Det = best ?; …
körning… ?- s(Num,Det,[den,hunden,jagar,en,bil],[]). Num = sing, Det = best
fler argument % enkel grammatik som genererar ett ”parse-träd” s(Num,Det,s(NP,VP)) --> np(Num, Det, NP), vp(Num, Det, VP) . vp(Num,Det,vp(V,NP)) --> v(V), np(Num2,Det2,NP) . np(Num,Det,np(N)) --> n(Num,Det,N) . n(sing,obest,n(hund)) --> [hund]. n(sing,best,n(hunden)) --> [hunden]. n(sing,obest,n(bil)) --> [bil]. n(sing,best,n(bilen)) --> [bilen]. n(pl,obest,n(hundar)) --> [hundar]. n(pl,best,n(hundarna)) --> [hundarna]. n(pl,obest,n(bilar)) --> [bilar]. n(pl,best,n(bilarna)) --> [bilarna]. v(v(jagar)) --> [jagar].
s np vp n v np n hunden jagar bilarna körning… ?- s(Num,Det,Tree,[hunden, jagar, bilarna],[]). Det = best, Num = sing, Tree = s(np(n(hunden)),vp(v(jagar),np(n(bilarna))))
pp • vi tar oss an prepositionsfraser (pp): • kan följa verbfraser • och även substantivfraser • består av en preposition (prep) följd av en np (i vårt enkla fall bara ett n)
exempel s(s(NP,VP)) --> np(NP), vp(VP) . np(np(X,Y)) --> art(X),n(Y) . np(np(A,N,PP)) --> art(A), n(N), pp(PP) . vp(vp(V,NP,PP)) --> v(V), np(NP), pp(PP) . vp(vp(V,NP)) --> v(V), np(NP). pp(pp(P,N)) --> p(P), n(N) . v(v(jagar)) --> [jagar] . art(art(en)) --> [en]. n(n(hund)) --> [hund] . n(n(bil)) --> [bil] . n(n(gevär)) --> [gevär] . p(p(med)) --> [med] .
körning… ?- s(Tree,[en,hund,jagar,en,bil,med,gevär],[]). Tree = s(np(art(en),n(hund)),vp(v(jagar),np(art(en),n(bil)),pp(p(med),n(gevär)))) Tree = s(np(art(en),n(hund)),vp(v(jagar),np(art(en),n(bil),pp(p(med),n(gevär)))))
prologanrop i dcg-regler • utöka siffer-reglerna med flera siffror: siffra(0) --> ”noll” . … siffra(9) --> ”nio” . siffror([N]) --> siffra(N). siffror([N|Tail]) --> siffra(N), ”,”, siffror(Tail). ?- siffror(X, ”ett,noll,två,två”, ””). X = [1,0,2,2]
prologanrop (forts.) siffersumma(N) --> siffra(N). siffersumma(N) --> siffra(N0), ”,”, siffersumma(N1), { plus(N0,N1,N) } . plus(X,Y,Summa) :- Summa is X+Y . ?- siffersumma(Sum, ”ett,noll,två,två”, ””). Sum = 5
separera lexikon från grammatik • grammatik består av regler • inga konkreta ord • lexikon består av ord • inga abstrakta regler
%lexikon lex(the,det). lex(a,det). lex(dog,n). lex(car,n). lex(chase,v). %grammatik det --> [Det], {lex(Det,det)} . n --> [Noun], {lex(Noun,n)} . v --> [Verb], {lex(Verb,v)} . exempel 1
exempel 2 • ett annat sätt att hantera lexikon: n(n(Ord)) --> [Ord], { subst(Ord) } . subst(Ord) :- member(Ord, [hund,bil,snok,…]). • (vi antar att member/2 är definierat)
översättning till ”ren” prolog n(n(Ord)) --> [Ord], { subst(Ord) } . n(n(Ord),[Ord|Rest],Rest) :- subst(Ord).
utöka lexikonet • hittills har vi rört oss med syntax (n, v, sg, pl, …) • men lexikon kan också innehålla information om t ex: • fonologi • morfologi (”mini-lexicon”) • semantik • …
hur bra är det här då? • dcg är ett ”programmeringsspråk” i sig själv (kan generera kontextuella språk). Alltså kraftfullt! • lingvistiskt sett finns några problem… • …men för snabb implementering/test av domänspecifika applikationer i naturligt språk är det snabbt och enkelt