INF2820 Datalingvistikk V2016 8. Gang 9.3 Jan Tore Lønning
CHART-PARSING 2
I dag Bakgrunn Svakheter med andre parsere CKY og Chart Chart-parsing: hovedideer BU chart-parsingalgoritmen Algoritmen uttrykt i Python TD chart-parsing CKY og Chart: Parsing vs anerkjenning 3
Problemer for tidligere parsere RD: venstrerekursjon SR: regler med tomme høyresider Både RD og SR: Ineffektivitet CKY: bare grammatikker på CNF 15. mars 2016 4
Example 3/15/2016 Speech and Language Processing - Jurafsky and Martin 5
Chart alternativ datastruktur for CKY (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 15. mars 2016 6
CKY med chart (skisse) Gitt en sekvens av ord w 1 w 2 w n 1. For hver w i og regel på formen A w i for en eller annen A: Innfør kanten (i-1, i, A) 2. Hver gang vi innfører en kant (k, j, A) se på alle kanter i chartet på formen (i, k, B) for en eller annen i og en eller annen B: For hver regel på formen C B A for en eller annen C: Legg til kanten (i, j, C) (Hvis det finnes kanter i chartet på formen (j, m, B) for en B og en m, må vi også prøve å kombinere (k, j, A) med dem. Skjer ikke ved streng venstre mot høyre.) 8
CKY-algoritme med chart CKY-algoritmen med datastrukturen chart vil gi samme resultat som med bruk av tabell hvis vi er nøye med bokføringen og legger til alle kanter vi skal. (Ikke gjort detaljene her) Vanligvis gjøres CKY med tabell. Vi innfører chart her for å se likhetene til aktiv chart-parsing. 9
I dag Bakgrunn Chart-parsing: hovedideer Dotted items, aktive kanter Active chart - datastruktur Fundamentalregelen Bruk av en agenda BU chart-parsingalgoritmen Algoritmen uttrykt i Python TD chart-parsing CKY og Chart: Parsing vs anerkjenning 10
Dotted items Representerer deler av fraser VP V NP PP En del av VP Inneholder V NP Mangler PP VP V NP PP En hel VP-frase med antydet struktur VP V NP PP Predikerer starten på en VP 13
Kanter Representerer deler av fraser VP V NP PP [2, 5] En del av VP. Fra posisjon 2 til 5 VP V NP PP [2, 9] En hel VP frase med antydet struktur VP V NP PP [2, 2] Predikerer starten på en VP i posisjon 2 14
Active Chart datastruktur NP Det Nom Nom Nom PP NP Det Nom 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 15. mars 2016 15
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] ) 15. mars 2016 16
Active chart-parsing Kombinere 3 typer operasjoner: 1. Lese ordene i setningen inn i chartet 2. Bruke fundamentalregelen når nye kanter legges til chartet 3. Innføre aktive kanter i chartet Ulike strategier for Hvordan aktive kanter innføres Rekkefølgen oppgavene utføres Og dermed: Hvilke aktive kanter som er nødvendige March 15, 2016 17
Aktiv chart-parsing Agenda Chart Når vi legger en kan til chartet kan det skape flere nye kanter som skal legges til chartet: Hver av de kan skape flere nye kanter: Osv. For å holde orden på dette bruker vi en ekstra datastruktur: Agenda Alle nye kanter legges i Agenda Vi flytter en og en kant fra Agenda til Chart Dette gir nye kanter. De legges i Agenda March 15, 2016 18
I dag Bakgrunn Chart-parsing: hovedideer BU chart-parsingalgoritmen Algoritmen uttrykt i Python TD chart-parsing CKY og Chart: Parsing vs anerkjenning 19
Active chart-algoritmen,bottom-up Gitt en sekvens av ord w 1 w 2 w n 1. For hver w i og regel på formen A w i for en eller annen A: Legg kanten (A w i, [i-1, i]) til Agenda 2. Fjern en kant e fra Agenda Hvis e ikke er i Chart: 1. Legg e til Chart, og 2. Lag nye kanter med fundamentalregelen og legg til Agenda 3. Hvis e er inaktiv: Lag nye aktive kanter og legg til agenda Gjenta til Agenda er tom 20
2. Nye kanter med fundamentalregelen Når vi legger kanten e til chartet Hvis e er inaktiv, dvs. på formen (A β, [i, k]) Finn alle kanter i chartet på formen (B α Aγ, [m, i]) for en eller annen m, B, α og γ: Legg (B α A γ, [m, k]) til Agenda Hvis e er aktiv, dvs. på formen (B α Aγ, [m, i]) Finn alle kanter i chartet på formen (A β, [i, k]) for en eller annen k, og β : Legg (B α A γ,[m, k]) til Agenda 21
3. Nye aktive kanter Når vi legger kanten e til chartet Hvis e er inaktiv, dvs. på formen (B γ, [m,n]) Finn alle A, β s.a. A B β er en regel og Legg kanten (A B β, [m, m]) til agendaen. (Strategi BU0) Det var alt 22
Eksempel Parse: gi jenta fisk 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 15. mars 2016 23
Fotnote: Nye aktive kanter Vi la til aktive kanter ved (strategi BU0, NLTK): Hvis e er inaktiv, dvs. på formen (B γ, [m,n]) Finn alle A, β s.a. A B β er en regel og Legg kanten (A B β, [m, m]) til agendaen. Alternativt kan en i stedet ved (strategi BU1, J&M): Hvis e er inaktiv, dvs. på formen (B γ, [m,n]) Finn alle A, β s.a. A B β er en regel og Legg kanten (A B β, [m, n]) til agendaen. Begge deler virker og er fullstendige 24
BU chart-parser: egenskaper Behersker: Unære regler Mer enn to symboler på høyresiden i en regel Takler ikke: Tomme høyresider (det vil kreve endringer i algoritmen) Blandinger av ord (terminaler) og kategorisymboler (ikke-terminaler) på høyresiden i samme regel 15. mars 2016 25
I dag Bakgrunn Chart-parsing: hovedideer BU chart-parsing algoritmen Algoritmen uttrykt i Python TD chart-parsing CKY og Chart: Parsing vs anerkjenning 26
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]) som ((S,[],[NP, VP]),(0,0)) (S NP VP, [0,3]) som ((S,[NP],[VP]),(0,3)) (S -> NP VP, [0,5]) som ((S,[NP, VP],[]),(0,5)) 27
Implementasjon: initialisering def make_chart(words, grammar): 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))) 31
Add to chart while agenda: edge = agenda.pop() 32
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, forward fundamental rule pivot = to_find[0] for edge2 in chart: ((moth2, found2, to_find2),(st2, end2)) = edge2 if moth2 == pivot and to_find2==[] and end==st2: newfound = found[:]+[pivot] agenda.append(((mother, newfound,to_find[1:]), (start, end2))) 36
New active edges ((mother, found, to_find),(start, end)) = edge if to_find: # active edge, forward fundamental rule else: # inactive edge, backward fundamental rule 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))) # new active edges for p in grammar.productions(): if p.rhs()[0] == mother: agenda.append(((p.lhs(), [], list(p.rhs())), (start, start))) 39
I dag Bakgrunn Chart-parsing: hovedideer BU chart-parsing algoritmen Algoritmen uttrykt i Python TD chart-parsing CKY og Chart: Parsing vs anerkjenning 40
Top down active chart-parsing Som ved Bottom-UP kombinere 3 typer operasjoner: 1. Lese ordene i setningen inn i chartet 2. Bruke fundamentalregelen når nye kanter legges til chartet 3. Innføre aktive kanter i chartet Og vi bruker agenda på samme måte Forskjellen ligger i punkt 3: Innføring av aktive kanter Punkt 2: bruk av fundamentalregelen blir helt lik Punkt 1: kan gjøres likt eller forskjellig March 15, 2016 41
Top-down active chart-algoritmen Ved intialisering legger vi kanten ( S, [0, 0]) til Agenda Når en aktiv 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. (Ikke innfør nye aktive kanter fra regler når inaktive kanter legges til agenda) 42
Eksempel Parse: gi jenta fisk 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 15. mars 2016 43
Fordeler med Top-Down? Både BU og TD behersker: Å gi riktig svar på om ordene er en setning Unære regler Mer enn to symboler på høyresiden i en regel Høyrerekursive regler TD: Vil ofte foreslå færre kanter som ikke fører frem enn BU-strategien Har ikke problemer med tomme høyresider 15. mars 2016 44
Fotnote til TD En ren TD-strategi leser ikke inn ordene ved initialisering Den foreslår ord TD Da vil en kunne ha regler som blander terminaler og ikke-terminaler på høyresiden i en regel Fint i teorien ekstremt langsomt i praksis Bedre å anta at grammatikken er på standardform og behandle ordene BU 45
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) 15. mars 2016 46
Fotnote til 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 15. mars 2016 47
I dag Bakgrunn Chart-parsing: hovedideer BU chart-parsing algoritmen Algoritmen uttrykt i Python TD chart-parsing CKY og Chart: Parsing vs anerkjenning 48
CKY og Chart: Parsing vs anerkjenning Neste uke 49