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
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]. np(P0,P1) :- ‘C’(P0,jan,P1). (‘C’ is Sicstus’ voor woord.) Natuurlijke Taalverwerking
Voorbeeld ? s([het,kind,koopt,een,ijsje,in,het,park],[]). 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]. 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 Het onderwerp van de zin moet overeenstemmen in persoon en getal met de persoonsvorm: ik denk aan Henk * zij denkt aan Henk wij denken aan Henk *hij denken aan Henk Natuurlijke Taalverwerking
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
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 Werkwoorden leggen restricties op aan de argumenten waarmee ze combineren: Wim slaapt / *Wim slaapt Ben Wim kent Ben / *Wim kent Wim denkt aan Ben *Wim denkt van Ben 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
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
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