INF2820 Datalingvistikk V2014 8. gang, 6.3.2014 Jan Tore Lønning
I dag Chart parsing Implementasjon CKY og Chart: Parsing vs anerkjenning 2
Chart alternativ datastruktur (S, [0, 1]) (VP, [0,1]) (Det, [1,2]) (Nom, [2,3]) (N, [2,3]) (NP, [1, 3]) (S, [0,5]) S, VP, X2 NP S, VP, X2 Nom NP PP S, VP, V, Nom, N Det Nom, N P NP, PN 0 book 1 the 2 flight 3 through 4 Houston 5 4. mars 2014 3
Begrensninger i CKY 1. Grammatikken må være på CNF 2. Det foreslås strukturer som holder lokalt, men ikke globalt: Løsninger baserer seg på å kombinere TD og BU Hjelp for begge problemene å innføre dotted items 4. mars 2014 4
States The table-entries are called states and are represented with dotted-rules. S VP NP Det Nominal VP V NP - A VP is predicted - An NP is in progress - A VP has been found 3/4/2014 Speech and Language Processing - Jurafsky and Martin 5
States/Locations S VP [0,0] A VP is predicted at the start of the sentence NP Det Nominal [1,2] VP V NP [0,3]. An NP is in progress; the Det goes from 1 to 2 A VP has been found starting at 0 and ending at 3 3/4/2014 Speech and Language Processing - Jurafsky and Martin 6
Active Chart datastruktur NP Det Nom Nom Nom PP NP PP P NP Det Nom, N P NP, PN 0 book 1 the 2 flight 3 through 4 Houston 5 NP Det Nom Nom Nom PP PP P NP NP Det Nom Nom Nom PP PP P NP Partielt snapshot 4. mars 2014 7
Fundamentalregelen NP Det Nom Nom Nom PP 0 book 1 the 2 flight 3 through 4 Houston 5 NP Det Nom Fra (A α B β, [i,k] ) + (B γ, [k, j] ) Lag (A α B β, [i,j] ) 4. mars 2014 8
Chart-parsing Agenda Chart Hovedide: Fjern en kant k fra Agenda Hvis k ikke er i chart: Legg k til Chart For alle kanter m i chartet: Prøv å match k og m med fundamentalregelen Hvis match, legg ny kant til Agenda Gjenta til Agenda er tom March 4, 2014 9
I tillegg Initialisering For det n-te ordet w i setningen For alle leksikalske regler på formen B w, for en eller annen B: Legg (B w, [n-1,n] ) til agendaen på et eller annet tidspunkt Introduser aktive kanter: Legg de aktive kantene (B γ, [k,k]) som er nødvendige, til agendaen Hold regnskap med hva som blir gjort, slik at alt blir gjort Ulike strategier for Rekkefølgen oppgavene utføres Og dermed: Hvilke aktive kanter som er nødvendige Om de leksikalske reglene må innom agenda eller kan gå rett til chartet. March 4, 2014 10
Bottom-up Legg de aktive kantene (B γ, [k,k]) som er nødvendige, til agendaen Når en inaktiv/fullstendig kant (B γ, [m, n] ) blir lagt til chartet Finn alle A, β s.a. A B β er en regel og (to alternative understrategier:) (Straegi BU0:) Legg kanten (A B β, [m, m]) til agendaen. (Strategi BU1:) Legg kanten (A B β, [m, n]) til agendaen. March 4, 2014 11
Make-predictions, fig. 13.17 BU1 4. mars 2014 12
Top-Down Legg de aktive kantene (B γ, [k,k]) som er nødvendige, til agendaen Initialiser: Legg ( S, [0, 0]) til agenda Når en aktiv/ufullstendig kant (A α B β, [m, n] ) legges inn I chartet: Finn alle regler som har formen (B γ) for en eller annen γ, og legg kanten (B γ, [n, n]) til agendaen. March 4, 2014 13
Make-predictions, fig. 13.17 4. mars 2014 14
Eksempel Parse: gi jenta fisk med BU og TD-strategi S VP VP IV VP TV NP VP DTV NP NP NP N IV fisk sov TV fisk kjøp DTV gi N jenta fisk 4. mars 2014 15
4. mars 2014 16 Chart-algoritme, fig. 13.16
I dag Chart parsing Implementasjon CKY og Chart: Parsing vs anerkjenning 17
Struktur En kant representeres som: <edge> = (<dotted item>,<span>) <dotted item> = (<lhs>,<rhs found>,<rhs to find>) <span> = (<begin>,<end>) Eksempler: (S ->. NP VP, [0,0]) as ((S,[],[NP, VP]),(0,0)) (S -> NP. VP, [0,3]) as ((S,[NP],[VP]),(0,3)) (S -> NP VP., [0,5]) as ((S,[NP, VP],[]),(0,5)) 18
BU: Initialiser def make_chart(words, grammar, strategy='td'): agenda = [] chart = [] for i in range(len(words)): for p in grammar.productions(): if len(p.rhs()) == 1 and p.rhs()[0] == words[i]: agenda.append(((p.lhs(),list(p.rhs()),[]), (i, i+1))) 19
Add to chart while agenda: edge = agenda.pop() if edge not in chart: chart.append(edge) ((mother, found, to_find),(start, end)) = edge if to_find: # active edge 20
Fundamental rule if to_find: # active edge pivot = to_find[0] for edge2 in chart: ((mother2, found2, to_find2),(start2, end2)) = edge2 if mother2 == pivot and to_find2==[] and end==start2: newfound = found[:]+[pivot] agenda.append(((mother, newfound, to_find[1:]), (start, end2))) else: # inactive edge for edge2 in chart: ((mother2, found2, to_find2),(start2, end2)) = edge2 if to_find2 and to_find2[0]==mother and end2==start: newfound = found2[:]+[mother] agenda.append(((mother2, newfound, to_find2[1:]), (start2, end))) 21
BU: Make predictions if not to_find: for p in grammar.productions(): if p.rhs()[0] == mother: agenda.append(((p.lhs(), [mother], list(p.rhs())[1:]), (start, end))) return chart 22
TD: Initialize def make_chart(words, grammar, strategy='td'): agenda = [] chart = [] if strategy == 'td': top = grammar.start() for p in grammar.productions(): if p.lhs() == top: agenda.append(((p.lhs(), [], list(p.rhs())), (0, 0))) for i in range(len(words)): for p in grammar.productions(): if len(p.rhs()) == 1 and p.rhs()[0] == words[i]: agenda.append(((p.lhs(),list(p.rhs()),[]), (i, i+1))) 23
TD Add to chart Fundamental rule Same as BU 24
Make predictions: TD vs BU if strategy == 'td' and to_find: for p in grammar.productions(): if p.lhs() == to_find[0] and p.is_nonlexical(): agenda.append(((p.lhs(), [], list(p.rhs())), (end, end))) elif strategy == 'bu0' and not to_find: for p in grammar.productions(): if p.rhs()[0] == mother: agenda.append(((p.lhs(), [], list(p.rhs())), (start, start))) elif strategy == 'bu1' and not to_find: for p in grammar.productions(): if p.rhs()[0] == mother: agenda.append(((p.lhs(), [mother], list(p.rhs())[1:]), (start, end))) return chart 25
Egenskaper Merk Unære regler Mer enn to symb. på høyreside Dette går fint Venstrerekursjon ikke noe problem Tomme prod. OK ved TD-strategi, Problem ved BU 4. mars 2014 26
Earleys algoritme Som presentert av J&M Tilsvarer en chart-parser med: TD innføring av aktive/inkomplette kanter Streng venstre mot høyre Litt egen rutine for leksikalske oppslag (=Scanner) Dermed behøver en bare bruke fundamentalregelen når en legger til inaktive/komplette kanter (og ser mot venstre) (=Completer) (De aktive ser mot høyre og vil ikke se noen inaktive kanter) Når en legger til aktive kanter, må en lage nye aktive kanter (=Predictor) 4. mars 2014 27
Earleys algoritme Som presentert av J&M Fig. 13.13 har en løkke som begynner for each state in chart[i] do og som modifiserer chart[i] Dette kan kreve litt omskrivning ved programmering 4. mars 2014 28
I dag Chart parsing Implementasjon CKY og Chart: Parsing vs anerkjenning 29
CKY Parsing og Chart parsing Er dette egentlig en parser? Strengt tatt: Nei! Det er en anerkjenner Hvordan kan vi lage en parser som følger denne algoritmen? 3/4/2014 Speech and Language Processing - Jurafsky and Martin 30
Alternativ Alt 1: Bygg trær underveis og legg dem i chartet S S S S a Med en flertydig grammatikk kan chartet/tabellen vokse eksponensielt 31
Example (0) a (1) a (2) a (3) a (4) --------------------------------------------------------------------------- 0) (Sa) (S(Sa)(Sa)) (S(S(Sa)(Sa))(Sa)) (S(S(S(Sa)(Sa))(Sa))(Sa)) (S(Sa)(S(Sa)(Sa))) (S(S(Sa)(S(Sa)(Sa)))(Sa)) (S(S(Sa)(Sa))(S(Sa)(Sa))) (S(Sa)(S(S(Sa)(Sa))(Sa))) (S(Sa)(S(Sa)(S(Sa)(Sa)))) --------------------------------------------------------------------------- 1) (Sa) (S(Sa)(Sa)) (S(S(Sa)(Sa))(Sa)) (S(Sa)(S(Sa)(Sa))) --------------------------------------------------------------------------- 2) (Sa) (S(Sa)(Sa)) --------------------------------------------------------------------------- 3) (Sa) --------------------------------------------------------------------------- March 4, 2014 32
Et bedre alternativ Ikke bygg hele trær Men inkluder i strukture informasjon som gjør det mulig å konstruere alle trær. (Merk: Hvis vi vil skrive ut alle trær får vi uansett en eksponensiell algoritme fordi antallet trær til en streng kan være eksponensielt i lengden av inputt.) 33
Example (0) a (1) a (2) a (3) a (4) ------------------------------------------------------------------------------------ 0) (1,S,'a') (3,S,[(1,2)]) (6,S,[(1,5),(3,4)]) (10,S,[(1,9),(3,8),(6,7)]) ------------------------------------------------------------------------------------ 1) (2,S,'a') (5,S,[(2,4)]) (9,S,[(2,8),(5,7)]) ------------------------------------------------------------------------------------ 2) (4,S,'a') (8,S,[(4,7)]) ------------------------------------------------------------------------------------ 3) (7,S,'a') ------------------------------------------------------------------------------------ 34