dcg-notation 21.2 G 2.3 M (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: x 0 --> x 1, …, x n. där x 0 är icke-terminal och x i 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
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]. icke-terminaler terminaler
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
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). observera ariteten! ”dolda” argument
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].
numerus med hjälp av argument % 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).
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].
körning… ?- s(Num,Det,Tree,[hunden, jagar, bilarna],[]). Det = best, Num = sing, Tree = s(np(n(hunden)),vp(v(jagar),np(n(bilarna)))) s npvp nvnp n hundenjagarbilarna
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
exempel 1 %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 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