INF2820 Datalingvistikk V2012 Jan Tore Lønning MER OM PARING, ÆRLIG TABELLPARING 20. februar 2012 2 hift-reduce parser (bottom-up) vakheter ved disse 20. februar 2012 3 Parsing Gitt en grammatikk G og streng s pm1: Er s L(G) pørsmål om anerkjennelse ( recognition ) pm2: Vi er interessert i (frase)strukturen til s Hvorfor er s L(G)? Finn alle trær i T(G) som har s som utkomme ( yield ) Ekvivalent: Finn alle høyreavledninger av s. Finn alle venstreavledninger av s. Parsing 20. februar 2012 4 Venstre- og høyreavledning Recursive descent parser Venstreavledning: Det N the N the dog the dog V PP the dog saw PP the dog saw Det N PP the dog saw a N PP the dog saw a man PP the dog saw a man P the dog saw a man in the dog saw a man in Det N the dog saw a man in the N Høyreavledning: V PP V P V P Det N V P Det park V P the park V in the park V Det N in the park V Det man in the park V a man in the park saw a man in the park Det N saw a man in the park Det man saw a man in the park Lager en venstreavledning Bygger et tre: Fra toppen ( top-down ) Fra venstre mot høyre Tilstrekkelig å bare se på venstreavledninger fordi de svarer til trær treber mot tidligst mulig å sjekke mot input-data Et trinn er ikke-deterministisk: Velg en regel! Dette gir et søkerom å holde orden på 20. februar 2012 5 20. februar 2012 6 1
Venstreavledning Det N the N the dog the dog V PP the dog saw PP the dog saw Det N PP the dog saw a N PP the dog saw a man PP the dog saw a man P the dog saw a man in the dog saw a man in Det N the dog saw a man in the N Det N N dog saw a man in the park saw a man in the park V PP saw a man in the park PP a man in the park Det N PP a man in the park N PP man in the park PP in the park P in the park the park Det N the park N park # # Problemer for RD-parsing 1. Venstrerekursjon: Hvordan takler parseren N AP N N N PP? 2. Dobbeltarbeid: om en del av en overordnet gal analyse kan den finne riktige deler, men disse blir glemt 3. Prøving og feiling som er litt blind 20. februar 2012 7 20. februar 2012 8 hift-reduce parser (bottom-up) vakheter ved disse Høyreavledning V PP V P V P Det N V P Det park V P the park V in the park V Det N in the park V Det man in the park V a man in the park saw a man in the park Det N saw a man in the park Det man saw a man in the park # # N V PP # N V P # V P Det N # V P Det park V P the park V in the park V Det N in the park V Det man in the park V a man in the park saw a man in the park Det N saw a man in the park Det dog saw a man in the park # 20. februar 2012 9 20. februar 2012 10 Bottom-up: hift reduce parser Words, Der strenger (Words resten av input, Der det som er funnet så langt) Vanlig notasjon: Der Words tart: Words:= inputstreng Der := Løkke: Hvis Words= og Der= stopp med suksess! Hvis mulig, gjør en av følgende: (hift:) Hvis Words=/=, La Der:=Der first(words) og Words:=rest(Words) (Reduce:) Hvis det fins,, B, en regel B og Der = : la Der= B Bottom-up: hift reduce parser Kim saw the girl with the telescope V Det girl with the telescope VDet girl with the telescope (HIFT) VDet N with the telescope (REDUCE) V with the telescope (REDUCE) 20. februar 2012 11 20. februar 2012 12 2
Algoritme ikke-deterministisk Denne kan lett utvides til parser ved at vi legger inn deltrær i Der i stedet for bare kategorier. R-parsere har problemer med tomme høyresider To plasser for valg/ikke-determinisme: kal vi flytte eller redusere? Hva skal vi velge når vi har flere valg for reduksjon? Den kan gjøres mer effektiv hvis vi vet at høyresidene ikke blander terminaler og ikke-terminaler: Når vi flytter, gjør vi samtidig en unær reduksjon. varer til regel på formen B t (Vi kan også gjøre den mer effektiv hvis grammatikken er på CNF: Bare se på de to siste symbolene i Der når vi reduserer varer til regel på formen A BC) 20. februar 2012 13 def recognize(grammar, stack, rest, trace): if trace > 0: print stack, rest if rest==[] and len(stack)==1 and stack[0]==grammar.start(): return True else: if not p.is_lexical(): rhs = list(p.rhs()) n = len(rhs) if stack[ n:] == rhs: newstack = stack[0: n] newstack.append(p.lhs()) if recognize(grammar, newstack, rest, trace): return True if not len(rest) == 0: word = rest[0] if p.is_lexical() and rest[0]==p.rhs()[0]: newst = stack[:] newst.append(p.lhs()) if recognize(grammar, newst, rest[1:], trace): 20. februar 2012 return True 14 def parse(grammar, stack, rest, trees, trace): if rest == [] and len(stack)==1 and stack[0][0]==grammar.start(): trees.append(stack[0]) else: if not p.is_lexical(): rhs = list(p.rhs()) n = len(rhs) top = [node[0] for node in stack[ n:]] if top == rhs: newstack = stack[0: n] newstack.append((p.lhs(), stack[ n:])) parse(grammar, newstack, rest, trees, trace) if not len(rest) == 0: word = rest[0] if p.is_lexical() and rest[0]==p.rhs()[0]: cat = p.lhs() newstack = stack[:] newstack.append((cat, [word])) newrest = rest[1:] parse(grammar,newstack, newrest, trees, trace) 20. februar return 2012 trees 15 Problemer spesielt for hift-reduce Unære produksjonsregler: hift-reduce kan tillate disse, men en må sjekke at det ikke er cykler av unære regler i grammatikken: A B B A Tomme produksjonsregler: DET N PP PP PP PP PP # Når skulle vi foreslå dem? Hvor mange? Iterasjon? 16 Problem for både RD og R Ineffektivitet å på eksempler sist RD: Eksempel: Noen valg under Noen valg under Vi foretar valgene for på nytt for hvert alternativ under Tilsvarende for R For hvert valg vi foretar må vi se på alle muligheter for resten av strengen på nytt hift-reduce parser (bottom-up) vakheter ved disse 20. februar 2012 17 20. februar 2012 18 3
Chomsky-normalform (CNF) En grammatikk er på Chomsky normalform hvis alle reglene er på en av følgende former: A B C A t (t en terminal) Enhver CFG G hvor L(G), er svakt ekvivalent til en G på CNF. Altså L(G) = L(G ) Chomsky-normalform (CNF) Enhver CFG G hvor L(G) er svakt ekvivalent til en G på CNF Bevisskisse: 1. Erstatt alle regler på formen A 2. Erstatt alle regler på formen A B for B en ikke terminal 3. For hver regel A, der > 1 og inneholder en eller flere terminaler t1,, tn: 1. Innfør nye ikke terminaler T1,, Tn. 2. Erstatt ti med Ti 3. Innfør reglene Ti ti for i = 1,, n 4. For hver regel A B1 B2 Bn, n > 2, : 1. Innfør nye ikke terminaler C1,, Cn 1 og regler 2. A B1 C1 3. Ci Bi+1 Ci+1 for i = 1,, n 1 20. februar 2012 19 20. februar 2012 20 To trinn til: 2. Erstatt alle regler på formen A B for B en ikke terminal: For enhver ikke terminal B og For enhver A s.a. A B eller A + B og For enhver s.a. B : Innfør A, hvis den ikke alt finnes Fjern alle unære regler med ikke terminal h.s. 1. Erstatt alle regler på formen A unntatt evt. : Identifiser alle ikke terminaler A, s.a. A + For hver regel B : Legg til alle regler på formen B der fremkommer ved å stryke en eller flere ikke terminaler som avleder, fra. tryk alle regler på formen A Eksempel PN Det As N As As A As løp smilte PN Kari Ola N gutt jente mor far A snill gammel trøtt 20. februar 2012 21 20. februar 2012 22 hift-reduce parser (bottom-up) vakheter ved disse Dynamic Programming DP search methods fill tables with partial results and thereby Avoid doing avoidable repeated work olve exponential problems in polynomial time (well, no not really) Efficiently store ambiguous structures with shared sub-parts. Vi skal se på: Chartparsing (Earleys algoritme svarer til en variant av chartparsing) 20. februar 2012 23 24 4
Parsing ample L1 Grammar First we ll limit our grammar to CNF Consider the rule A BC If there is an A somewhere in the input then there must be a B followed by a C in the input. If the A spans from ito jin the input then there must be some k st. i<k<j Ie. The B splits from the C someplace. 25 26 CNF Conversion o let s build a table so that an A spanning from i to j in the input is placed in cell [i,j] in the table. o a non-terminal spanning an entire string will sit in cell [0, n] Hopefully an If we build the table bottom-up, we ll know that the parts of the A must go from i to k and from k to j, for some k. 27 28 Meaning that for a rule like A B C we should look for a B in [i,k] and a C in [k,j]. In other words, if we think there might be an A spanning i,j in the input AND A B C is a rule in the grammar THEN There must be a B in [i,k] and a C in [k,j] for some i<k<j o to fill the table loop over the cell[i,j] values in some systematic way What constraint should we put on that systematic search? For each cell, loop over the appropriate k values to search for things to add. 29 30 5
31 32 Filling column 5 33 34 35 36 6
Algorithm 37 38 Display def cky(words, cfg): tabl = [[[] for i in range(len(words)+1) ] for j in range(len(words))] for i in range(len(words)): tabl[i][i+1] = [p.lhs() for p in cfg.productions() if p.is_lexical() and p.rhs()[0] == words[i]] for j in range(i 1, 1, 1): for k in range(j+1, i+1, 1): if (p.rhs()[0] in tabl[j][k] and p.rhs()[1] in tabl[k][i+1]): if not p.lhs() in tabl[j][i+1]: tabl[j][i+1].append(p.lhs()) return tabl 39 def cellstring(cell): return (',').join(nt.symbol() for nt in cell) def display(tabl, words): n = len(words) cellstrings = [cellstring(tabl[i][j]) for i in range(n) for j in range(n+1)] space = max([len(cell) for cell in cellstrings + words])+2 for i in range(n): print words[i].ljust(space), print(' ') for start in range(n): for count in range(start): print " ".ljust(space), for end in range(start+1, n+1): cell = tabl[start][end] print ("["+cellstring(cell)+"]").ljust(space), print(' ') 40 Egenskaper Grammatikk: Det Nsg Npl IV TV Det en en Nsg fisker maler Npl fisker maler snurrer IV fisker maler snurrer TV fisker maler en fisker maler snurrer Det Plass til vilkårlig mange i en celle NLTKs wfst har bare plass til en Nsg Npl IV TV Nsg Npl IV TV Npl IV 41 Parsing Is that really a parser? 42 7