1 / 31

dcg-notation

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

laban
Download Presentation

dcg-notation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. dcg-notation 21.2 G 2.3 M 8.1.2 (BBS 8)

  2. dagens föreläsning • extra argument i dcg-notation • prolog-anrop i dcg-notation • avslutande kommentarer om dcg

  3. 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

  4. repetition • implementera cfg: • append • differenslistor • dcg-notation • parsning av meningen [en,hund,jagar,en,bil] • append: • differenslistor/dcg: 56 instruktioner 30 instruktioner

  5. 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].

  6. 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”)

  7. en cfg för siffror siffra --> ”ett”. siffra --> ”två”. … siffra --> ”nio”. • ”ett” = [e,t,t] != [ett]

  8. 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.

  9. 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,å] ? …

  10. körning… ?- under100("trettiotre",[]). yes

  11. 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

  12. 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).

  13. 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].

  14. % 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

  15. 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] ? ; […]

  16. 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].

  17. körning… ?- s(sing,Det,X,[]). X = [en,hund,jagar,en,hund], Det = obest ? ; … X = [den,hunden,jagar,en,bil] ? Det = best ?; …

  18. körning… ?- s(Num,Det,[den,hunden,jagar,en,bil],[]). Num = sing, Det = best

  19. 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].

  20. 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))))

  21. 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)

  22. 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] .

  23. 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)))))

  24. 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]

  25. 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

  26. separera lexikon från grammatik • grammatik består av regler • inga konkreta ord • lexikon består av ord • inga abstrakta regler

  27. %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

  28. 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)

  29. översättning till ”ren” prolog n(n(Ord)) --> [Ord], { subst(Ord) } . n(n(Ord),[Ord|Rest],Rest) :- subst(Ord).

  30. 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 • …

  31. 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

More Related