INF2820 Datalingvistikk V2012 Jan Tore Lønning
CHART-PARSING FORMELL SPRÅKTEORI 5. mars 2012 2
Chart alternativ 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 5. mars 2012 3
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] ) Kan vi lage (A α B β, [i,j] ) 5. mars 2012 4
Chart-parsing To datastrukturer: Chart Agenda Hovedstruktur: Fjern en kant k fra agenda Hvis k ikke alt finnes i chartet: Legg k til chartet For alle aktuelle kanter m i chartet: Prøv å matche k mot m m/fundamentalregelen: Hvis de matcher, legg resultatet i agenda Gjenta til agenda er tom I tillegg må vi tenke på: Initialisering: for w ordet på plass n og alle leksikalske regler B w, for en B, skal (B w, [n-1,n] ) legges til agenda (/chart) på et tidspkt. Innfør aktive kanter: Legg de nødvendige aktive kanter på formen (B γ, [k,k]) til agenda. Hold styring på rekkefølge Ulike strategier for Rekkefølge Og dermed hvilke aktive kanter som er nødvendige for å få et fullstendig parse. 5. mars 2012 5
Bottom-up Legg de nødvendige aktive kanter på formen (B γ, [k,k]) til agenda : Når inaktiv/komplett kant (B γ, [m, n] ) flyttes til chartet: Finn alle A, β s.a. A B β er en regel, og Legg kanten (A B β, [m, n]) til agenda. (kunne alternativt lagt (A B β, [m, m]) til agenda: Kan være hensiktsmessig Gjør sammenlikning med TD-strategi lettere) 5. mars 2012 6
Make-predictions, fig. 13.17 5. mars 2012 7
Top-down Legg de nødvendige aktive kanter på formen (B γ, [k,k]) til agenda (/chart) : Initialiser: Legg ( S, [0, 0]) i agenda Når aktiv/inkomplett kant (A α B β, [m, n] ) flyttes til chartet: Finn alle regler på formen (B γ) for en eller annen γ, og legg kanten (B γ, [n, n]) til agenda. 5. mars 2012 8
Make-predictions, fig. 13.17 5. mars 2012 9
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 5. mars 2012 10
5. mars 2012 11 Chart-algoritme, fig. 13.16
Struktur An edge is represented like: <edge> = (<dotted item>,<span>) <dotted item> = (<lhs>,<rhs found>,<rhs to find>) <span> = (<begin>,<end>) Examples: (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)) 12
Innpakning def ChartRecognize(words, grammar, strategy='td'): top = grammar.start() n = len(words) for edge in Chart(words, grammar, strategy): ((mother, found, to_find),(start, end)) = edge if mother == top and not to_find and start == 0 and end == n: return True return False def ChartParse(words, grammar, strategy='td'): top = grammar.start() chart = Chart(words, grammar, strategy) display(chart, words) 13
Initialize def 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))) 14
Add to chart while True: if not agenda: return chart else: edge = agenda.pop() if edge not in chart: chart.append(edge) ((mother, found, to_find),(start, end)) = edge if to_find: # active edge 15
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))) 16
Make predictions 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))) 17
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 5. mars 2012 18
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 Dermed behøver en bare bruke fundamentalregelen når en legger til inaktive/komplette kanter (og ser mot venstre) De aktive som ser mot høyre vil ikke se noen inaktive kanter Når en legger til aktive, må en lage nye aktive 5. mars 2012 19
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 5. mars 2012 20
CHART-PARSING FORMELL SPRÅKTEORI 5. mars 2012 21
Figure 16.2
Figure 16.1
Er naturlige språk regulære? Jfr. forelesning 3 Pumpelemma for regulære språk Eks.: a n b n ikke regulært Matche ( og ) ikke regulært: ((( ) ( ))( )((( ) ( ))( ))( )) Regulært Ikke regulært 5. mars 2012 24
Kontekstfrie språk Ikke kontekstfrie: a n b n c n a m b n c m d n ww Noen fakta: Hvis L1 og L2 er kontekstfrie, behøver ikke L1 L2 være kontekstfritt. Hvis L1 er kontekstfritt og L2 er regulært, så må L1 L2 være kontekstfritt. Hvis L1 er kontekstfritt, så er f[l1] kontekstfritt. (Fins et liknende pumpelemma for CF-språk, men ikke ta detaljene her.) 5. mars 2012 25
Er naturlige språk kontekstfrie? 5. mars 2012 26
Figure 16.5 En slik struktur kan avbildes på ww og kan derfor ikke være kontekstfri. Finnes slike strukturer i naturlig språk?
Sveitsertysk Viktig: Ordstilling Kasus Høytysk: wir dem Hans das Haus anstreichen halfen. 5. mars 2012 28
Argumentet Rekursivt: L2 (regulært) ST L2 F[ST L2] = a m b n c m d n er ikke kontekstfritt. Da kan ikke ST L2 være kontekstfritt. Siden L2 er regulært og ST L2 ikke er CF, kan ikke ST være CF 5. mars 2012 29
Er dette viktig? Viktig fordi Chomsky innførte CFG men argumenterte mot dem for naturlige språk (NL) og lagde andre typer grammatikker Men det har vist seg vanskelig å vise at NL ikke er kontekstfrie. Vi har gode parsingalgoritmer for CFG-er Mindre viktig fordi Kraftigere grammatikkformalismer, som LFG og HPSG: Hensiktsmessige for å beskrive NL Langt oppe i Chomskyhierarkiet, men effektive algoritmer for å prosessere dem 5. mars 2012 30