190 likes | 341 Views
Definite Clause Grammar. Natuurlijke taalverwerking week 5. Zinsontleden in Prolog: parsing as deduction. Een herschrijfregel vertoont enige overeenkomst met een Prolog-regel: S --> NP VP Je kunt een S afleiden door een NP en een VP af te leiden s :- np, vp. Zinsontleden in Prolog.
E N D
Definite Clause Grammar Natuurlijke taalverwerking week 5
Zinsontleden in Prolog:parsing as deduction • Een herschrijfregel vertoont enige overeenkomst met een Prolog-regel: • S --> NP VP • Je kunt een S afleiden door een NP en een VP af te leiden • s :- np, vp. Natuurlijke Taalverwerking
Zinsontleden in Prolog • Verschil tussen herschrijfregel en Prolog:(woord-)volgorde. • De volgende Prolog-regels zijn equivalent: s :- np, vp. s :- vp, np s :- np, vp, np. • De corresponderende herschrijfregels niet. Natuurlijke Taalverwerking
Woordvolgorde toevoegen • s(P0,P1) : een s van positie P0 tot P1. • s(P0,P2) :- np(P0,P1), vp(P1,P2). • Regels die woorden introduceren: • np(P0,P1) :- woord(P0,jan,P1). • Invoer weergeven (assert) als: • woord(0,de,1). • woord(1,man,2). • woord(2,slaapt,3). Natuurlijke Taalverwerking
Stringposities als lijsten • Invoer: [de,man,slaapt] • Positie 0: [de,man,slaapt] • Positie 1: [man,slaapt] • Positie 2: [slaapt] • Positie 3: [] (tevens: zinseinde) • Invoer hoef je nu niet meer apart toe te voegen: Natuurlijke Taalverwerking
Posities als lijsten: • ? s([de,man,slaapt],[]). ? det([de,man,slaapt],P1) ? woord([de,man,slaapt],de,P1). • algemene regel: woord([Woord|Wn],Woord,Wn). Natuurlijke Taalverwerking
Definite clause grammar • Iedere herschrijfregel bevat twee argumenten die stringposities coderen. Regels die een woord introduceren, verwijderen (‘poppen’) het eerste woord van een lijst. • Deze twee mechanismen zijn ingebouwd in de Prolog DCG-notatie. Natuurlijke Taalverwerking
Definite clause grammar II • s --> np, vp. vertaalt als • s(P0,P2) :- np(P0,P1), vp(P1,P2). • np --> [jan]. vertaalt als • np(P0,P1) :- ‘C’(P0,jan,P1). (‘C’ is Sicstus’ voor woord.) Natuurlijke Taalverwerking
s --> np, vp. np --> det, n. vp --> v, np. vp --> v, np, pp. vp --> v, pp. pp --> p, np. det --> [een]. det --> [het]. n --> [kind]. n --> [ijsje]. n --> [park]. v --> [koopt]. v --> [loopt]. v --> [in]. Voorbeeld ? s([het,kind,koopt,een,ijsje,in,het,park],[]). Natuurlijke Taalverwerking
Strings als difference lists • Dit is een alternatieve manier om CFG-regels als Prolog op te schrijven: s(String) :- append(NP,VP,String), np(NP), vp(VP). np([jan]). vp(String) :- append(V,NP,String), v(V), np(NP). • Nadeel : non-deterministisch gebruik van append! Natuurlijke Taalverwerking
Strings als difference-lists • Je kunt de string-posities van een DCG ook zien als een difference-list, die append overbodig maakt: s(In,Out) :- np(In,Mid), vp(Mid,Out). vp(In,Out) :- v(In,Mid), np(Mid,Out). np([jan|Rest],Rest). Natuurlijke Taalverwerking
Congruentie/Agreement • ik denk aan Henk • * zij denkt aan Henk • wij denken aan Henk • *hij denken aan Henk Het onderwerp van de zin moet overeenstemmen in persoon en getal met de persoonsvorm: Natuurlijke Taalverwerking
DCG is veel meer dan CFG • s --> np(P,G), vp(P,G). • vp(P,G) --> v(P,G), pp. • np(1,enk) --> [ik]. • np(1,mv) --> [wij]. • v(1,enk) --> [denk]. • v(1,mv) --> [denken]. • s(P0,P2) :- np(P,G,P0,P1),vp(P,G,P1,P2). Natuurlijke Taalverwerking
De/Het-onderscheid • np --> det(Det), n(Det). • det(de) --> [de]. • det(het) --> [het]. • det(_) --> [een]. • n(de) --> [hond]. • n(het) --> [hondje]. Natuurlijke Taalverwerking
Selectie van argumenten • Wim slaapt / *Wim slaapt Ben • Wim kent Ben / *Wim kent • Wim denkt aan Ben • *Wim denkt van Ben Werkwoorden leggen restricties op aan de argumenten waarmee ze combineren: Natuurlijke Taalverwerking
Selectie van argumenten vp --> v(intrans). vp --> v(trans), np. vp --> v(Prep), pp(Prep). pp(Prep) --> p(Prep), np. v(intrans) --> [slaapt]. v(trans) --> [kent]. v(aan) --> [denk]. p(aan) --> [aan]. Natuurlijke Taalverwerking
Het Woordenboek • v(1,enk) --> [aai]. • v(2,enk) --> [aait]. • v(_,mv) --> [aaien]. • ….. • v(1,enk) --> [zwijg]. • v(2,enk) --> [zwijgt]. • v(_,mv) --> [zwijgen]. Natuurlijke Taalverwerking
Accolades Soms is het handig `gewone’ Prolog-code en DCG-notatie te combineren. v(1,enk) --> [Woord], {ww(Woord,_,_)}. v(2,enk) --> [Woord], {ww(_,Woord,_)}. v(_,mv) --> [Woord], {ww(_,_,Woord)}. ww(aai,aait,aaien). ww(zwijg,zwijgt,zwijgen). v(1,enk,P0,P1) :- ‘C’(P0,Wd,P1), ww(Wd,_,_). Natuurlijke Taalverwerking
Links-recursie • DCG heeft één groot nadeel: • Links-recursieve regels leiden tot een eindeloze lus. n --> n, pp vp --> vp, pp. n(P0,P2) :- n(P0,P1), pp(P1,P2) Natuurlijke Taalverwerking