Parsing: Top-down en bottom-up
description
Transcript of Parsing: Top-down en bottom-up
Parsing:Top-down en bottom-up
Natuurlijke taalverwerkingweek 6
Natuurlijke Taalverwerking 2
Bomen
m
d1 dn
d11 d12slaapt
• een lokale boom bestaat uit een moeder en een willekeurig aantal dochters
•Dochters kunnen zelf weer bomen zijn of een woord.
……...
Natuurlijke Taalverwerking 3
Bomen
m
d1 dn
d11 d12slaapt
•boom(m,[D1,…,Dn])
• woord(dn,slaapt)
……...
b(m,[b(d1,[b(d11,_),b(d12,_)]),…,w(dn,slaapt)])
Natuurlijke Taalverwerking 4
DCG met bomen
• s(b(s,[NP,VP])) --> np(NP), vp(VP).• vp(b(vp,[V])) --> v(V).• np(w(np,jan)) --> [jan].
• ?- s(Boom,[jan,slaapt],[]).• Boom = b(s,[w(np,jan),b(vp,[w(v,slaapt)])])
Natuurlijke Taalverwerking 5
DCG’s en links-recursie
• Prolog gebruikt een top-down zoek-strategie.
• Deze is niet geschikt voor links-recursie.• an eet en jan slaapt• s --> s, [en], s.• kaartje met korting• n --> n, pp.
Natuurlijke Taalverwerking 6
Links-recursie: meer voorbeelden
• Peter’s (broer’s) huis.• np --> det, n.• det --> np, [s].
• een (erg) aardig kind• n -> a, n.• a -> int, a.• int --> [erg] ; [heel] ; [].
Natuurlijke Taalverwerking 7
Oplossing 1: aanpassen grammatica
• n --> n, pp• is equivalent aan
• n --> n_wrd, pp_ster. • n_wrd --> [kaartje].• pp_ster --> pp, pp_ster.• pp_ster --> [].• pp --> p, np.
Natuurlijke Taalverwerking 8
Nadelen Oplossing 1
• wel dezelfde strings, niet dezelfde bomen
n
n
n
n
n
pp
n ppn pp
pp
pp*
pp*
Natuurlijke Taalverwerking 9
Parsing
• scheid regels (data) en parser (algoritme)
• Grammatica-regels:
regel(s,[np,vp]).regel(np,[det,n]).woord(det,de).
•Dit zijn eenvoudige Prolog-feiten.
Natuurlijke Taalverwerking 10
Top-down parser in Prolog
top_down(Cat,P0,P1) :- regel(Cat,Dochters), vind_ds(Dochters,P0,P1).top_down(Cat,[Woord|Wn],Wn) :- woord(Cat,Woord).
vind_ds([D1|Ds],P0,P2) :- top_down(D1,P0,P1), vind_ds(Ds,P1,P2).vind_ds([],P0,P0).
Natuurlijke Taalverwerking 11
Shift-reduce parsing
• Bottom-up parsing!• Begin bij de woorden in de input, en
probeer deze samen te voegen tot zinsdelen.
• Probeer zinsdelen samen te voegen tot een zin.
• Bottom-up parsers hebben geen last van links-recursie!
Natuurlijke Taalverwerking 12
bottom-up parsing
• de hond snurkt• DET hond snurkt• DET N snurkt• NP snurkt• NP V• NP VP• S
Natuurlijke Taalverwerking 13
shift-reduce algoritme
• Stapel/Stack: hierop staan tussenresultaten.
• Shift-actie : Verwijder het meest linkse woord uit de invoer, en plaats de categorie van het woord op de stapel
• Reduce-actie: Vervang C1…Cn op de stapel door C0 als er een regel C0 --> C1…Cn bestaat.
Natuurlijke Taalverwerking 14
Shift-reduce algoritme
String Stapel actie regel
1 de hond snurkt [] sh w(det,de)
2 hond snurkt [det] sh w(n,hond)
3 snurkt [det,n] red r(np,[det,n])
4 snurkt [np] sh w(v,snurkt)
5 [np,v] red r(vp,[v])
6 [np,vp] red r(s,[np,vp])
7 [s]
Natuurlijke Taalverwerking 15
Shift-reduce in Prolog
sr(Invoer,Stapel) :- reduce(Stapel,NwStapel), sr(Invoer,NwStapel).sr(Invoer,Stapel) :- shift(Invoer,RestInvoer), sr(RestInvoer,[Cat|Stapel]).sr([],[s]).
Natuurlijke Taalverwerking 16
Shift in Prolog
shift([Woord|Invoer],Invoer,Cat) :- woord(Woord,Cat).
Natuurlijke Taalverwerking 17
Reduce in Prolog I
reduce(Stapel,[M|NwStapel]) :- reduce_regel(M,Dochters), append(Dochters,NwStapel,Stapel).
reduce_regel(s,[vp,np]).
N.B. volgorde van de dochters is omgekeerd!
Natuurlijke Taalverwerking 18
Reduce in Prolog II
reduce([vp,np|Stapel],[s|Stapel]).reduce([n,det|Stapel],[np||Stapel).
voordeel: geen append.nodig: automatisch omzetten van regelsin reduce-predicaten.
Natuurlijke Taalverwerking 19
Bottom-up
• voordeel: links-recursie is geen probleem, omdat je vanuit de woorden begint. Het aantal woorden is altijd eindig…
• nadeel: epsilon-regels (det --> e)• shift(Invoer,Invoer,det).• Je kunt eindeloos categorieën aan de
stapel toevoegen, zonder dat de invoer korter wordt…...