Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avBo Bergman
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: x 0 --> x 1, …, x n. där x 0 är icke-terminal och x i 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
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
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
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
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
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).
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
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
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
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)}.
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
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.