INF2820 Datalingvistikk V2015 7. Gang 2.3 Jan Tore Lønning
PARSING DEL 2 2
I dag Recursive-descent parser, kort repetisjon Shift-reduce parser (bottom-up) Algoritme for anerkjenning Eksempelimplementasjon Svakheter ved RD- og SR-parsing CKY Algoritme Implementasjon 25. februar 2015 3
Parsing Gitt en grammatikk G og streng s Spm1: Er s L(G) Spørsmål om anerkjennelse ( recognition ) Spm2: Hvorfor er s L(G)? Hva er frasestrukturen til s i G? Finn alle trær i T(G) som har s som utkomme ( yield ) Parsing 25. februar 2015 4
Recursive descent parser S the dog saw a man in the park NP VP the dog saw a man in the park Det N VP the dog saw a man in the park the N VP the dog saw a man in the park N VP dog saw a man in the park dog VP dog saw a man in the park VP saw a man in the park V NP PP saw a man in the park saw NP PP saw a man in the park NP PP a man in the park Det N PP a man in the park a N PP a man in the park N PP man in the park man PP man in the park PP in the park P NP in the park in NP in the park NP the park Det N the park the N the park N park park park # # 25. februar 2015 5
Recursive descent parser Lager en venstreavledning Det samme som å bygge et tre: Fra toppen ( top-down ) Fra venstre mot høyre I utgangspunktet er dette en ikkedeterminsitisk prosess: Hvilken grammatikkregel skal vi velge? Recursive descent-algoritmen gjør dette deterministisk Prøver alle alternativ ved et dybde-først søk Enkelt å implementere gjenkjenning, f.eks. i Python, ved rekursiv programmering Litt mer fiklete å programmere en parser som lager trær. 25. februar 2015 6
I dag Recursive-descent parser, kort repetisjon Shift-reduce parser (bottom-up) Algoritme for anerkjenning Eksempelimplementasjon Svakheter ved RD- og SR-parsing CKY Algoritme Implementasjon 25. februar 2015 7
Datastruktur Høyreavledning S NP VP NP V NP PP NP V NP P NP NP V NP P Det N NP V NP P Det park NP V NP P the park NP V NP in the park NP V Det N in the park NP V Det man in the park NP V a man in the park NP saw a man in the park Det N saw a man in the park Det man saw a man in the park the dog saw a man in the park Datastruktur reduce shift S # NP VP # N V NP PP # N V NP P NP # NP V NP P Det N # NP V NP P Det park # NP V NP P Det park NP V NP P the park NP V NP P the park NP V NP in the park NP V NP in the park NP V Det N in the park NP V Det man in the park NP V Det man in the park NP V a man in the park NP V a man in the park NP saw a man in the park NP saw a man in the park Det N saw a man in the park Det dog saw a man in the park Det dog saw a man in the park the dog saw a man in the park # the dog saw a man in the park 25. februar 2015 8
Bottom-up: Shift reduce parser Struktur: Words: en liste av ord (terminaler) Stack: en stack av symboler (terminaler og ikketerminaler) Vanlig notasjon: Stack Words (toppen av stacken til høyre i Stack) Start: Words:= ordene i setningen som skal analyseres Stack:= tom Løkke: Hvis Words=[] og Stack=[S]: stopp med suksess! Hvis mulig, gjør en av følgende: (Shift:) Hvis Words=/=[], La Stack:=Stack+ first(words) og Words:=rest(Words) (Reduce:) Hvis det fins α, β, B, en regel B β og Stack= α + β: la Stack= α + B 25. februar 2015 9
Bottom-up: Shift reduce parser ε Kim saw the girl with the telescope NP V Det girl with the telescope NP V Det girl with the telescope (SHIFT) NP V Det N with the telescope (REDUCE) NP V NP with the telescope (REDUCE) Merk: Det er bare toppen av stacken (det lengst til høyre) som kan reduseres i hvert trinn 25. februar 2015 10
def recognize(grammar, stack, rwords, trace): if rwords==[] and len(stack)==1 and stack[0]==grammar.start(): return True else: for p in grammar.productions(): rhs = list(p.rhs()) n = len(rhs) if stack[-n:] == rhs: newstack = stack[0:-n] newstack.append(p.lhs()) if recognize(grammar, newstack, rwords,trace): return True if not len(rwords) == 0: newstack = stack[:] newstack.append(rwords[0]) if recognize(grammar, newstack, rwords[1:], trace): return True return False 25. februar 2015 11
Fra anerkjenner til parser La stacken bestå av deltrær Hodet i deltreet er symbolet for algoritmen Stack: 4 elements Remaining input 12
def parse(grammar, stack, rwords): trees = [] if rwords == [] and len(stack)==1 and stack[0].node ==grammar.start(): return [stack[0]] else: for p in grammar.productions(): rhs = list(p.rhs()) n = len(rhs) top = [top_of[node] for node in stack[-n:]] if top == rhs: newst = stack[0:-n] newst.append(tree(p.lhs(), stack[-n:])) newtrees = parse(grammar,newst,rwords) trees = trees + newtrees if not len(rwords) == 0: newstack = stack[:] newstack.append(rwords[0]) newtrees = parse(grammar,newstack, rwords[1:]) trees = trees + newtrees return trees 25. februar 2015 13
def top_of(element): if type(element) is str: t = element else: t = element.node return t 25. februar 2015 14
SR-algoritme ikke-deterministisk To plasser for valg/ikke-determinisme: Skal vi flytte eller redusere? Hva skal vi velge når vi har flere valg for reduksjon? Eks: NP DET N NP N En implementasjon vil følge en fast strategi her. Hvis hver regel i grammatikken har en høyreside som består av nøyaktig en terminal (leksikalsk regel), eller som består av bare ikketerminaler, så kan algoritmen gjøres mer effektiv: Hver gang vi shifter et ord over på stacken, reduserer vi (Men fremdeles eksponetiell!) 25. februar 2015 15
I dag Recursive-descent parser, kort repetisjon Shift-reduce parser (bottom-up) Algoritme for anerkjenning Eksempelimplementasjon Svakheter ved RD- og SR-parsing CKY Algoritme Implementasjon 25. februar 2015 16
Problemer spesielt for Shift-Reduce Unære produksjonsregler: Shift-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: NP DET N PPS PPS PP PPS PPS # Når skulle vi foreslå dem? Hvor mange? Iterasjon? 17
Problemer for RD-parsing 1. Venstrerekursjon: Hvordan takler parseren N AP N N N PP? 2. Dobbeltarbeid: Som 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 25. februar 2015 18
Problem for både RD og SR Ineffektivitet RD: Eksempel: S NP VP Noen valg under NP Noen valg under VP Vi foretar valgene for VP på nytt for hvert alternativ under NP Tilsvarende for SR For hvert valg vi foretar må vi se på alle muligheter for resten av strengen på nytt 25. februar 2015 19
I dag Recursive-descent parser, kort repetisjon Shift-reduce parser (bottom-up) Algoritme for anerkjenning Eksempelimplementasjon Svakheter ved RD- og SR-parsing CKY Algoritme Implementasjon 25. februar 2015 20
Dynamisk programmering I en beregning kan det inngå delberegninger som må foretas flere ganger Med DP tar vi vare på resultatet av disse beregningene underveis slik at Vi slipper å gjøre delberegningene flere ganger Øker effektiviteten, F.eks. i noen tilfeller fra eksponentiell til polynomisk tid Kan lagre flertydige strukturer med felles deler Vi skal se på CKY-parser, nå Chartparser, senere 21
Chomsky-normalform (CNF) CKY algoritmen forutsetter at grammatikken er på Chomsky-normalform En grammatikk er på Chomsky-normalform hvis alle reglene er på en av følgende former: A B C (ikketerminaler) A t (t en terminal) Vi skal senere se at: Enhver CFG G hvor ε L(G), er svakt ekvivalent til en G på CNF. Altså L(G) = L(G ) 25. februar 2015 22
CKY-parsing Hovedide: 1. For hvert segment [i, j] av ord i input, bestem hvilke ikke-terminaler som disse ordene kan avledes fra 2. Bottom-up 3. Kortere segmenter før lengre segmenter 23
CKY-parsing, forts. Hvilke kategorier har ord j, dvs segment [j-1,j]? Betrakt alle regler: A w j for en eller annen A Lagr disse A-ene i tabell[j-1, j] Se så på segmenter av to ord, [i, i + 2]: For å legge en ikke-terminal, A, i tabell[i, i+2] må det Finnes en regel A B C for en eller annen B og C B må utspenne [i, i+1] C må utspenne [i+1, i+2] 24
CKY-parsing ff. Deretter se på tre-ordsfragmenter [i, i+3]: For å legge en ikke-terminal, A, i tabell[i, i+3] må det Finnes en regel A B C for en eller annen B og C B må utspenne [i, i+1] og C må utspenne [i+1, i+3], eller B må utspenne [i, i+2] og C må utspenne [i+2, i+3] I det generelle tilfellet [i, j]: Det må finnes en regel A B C for en eller annen B og C B må utspenne [i, k] og C må utspenne [k, j], for en eller annen k, hvor i<k<j 25
Example 2/25/2015 Speech and Language Processing - Jurafsky and Martin 26
Example 2/25/2015 Speech and Language Processing - Jurafsky and Martin 27
Example Hvordan fylle søyle 5 2/25/2015 Speech and Language Processing - Jurafsky and Martin 28
Example 2/25/2015 Speech and Language Processing - Jurafsky and Martin 29
Example 2/25/2015 Speech and Language Processing - Jurafsky and Martin 30
Example 2/25/2015 Speech and Language Processing - Jurafsky and Martin 31
Example 2/25/2015 Speech and Language Processing - Jurafsky and Martin 32
CKY Algorithm 2/25/2015 Speech and Language Processing - Jurafsky and Martin 33
I dag Recursive-descent parser, kort repetisjon Shift-reduce parser (bottom-up) Algoritme for anerkjenning Eksempelimplementasjon Svakheter ved RD- og SR-parsing CKY Algoritme Implementasjon 25. februar 2015 34
CKY-implementasjon (følger pseudok.) def cky(words, cfg): tabl = [[set([]) for j in range(len(words)+1) ] for i in range(len(words))] for j in range(len(words)): tabl[j][j+1] = set([p.lhs() for p in cfg.productions() if p.rhs() == (words[j],)]) for i in range(j-1,-1,-1): for k in range(i+1, j+1, 1): tabl[i][j+1] = tabl[i][j+1].union( [p.lhs() for p in grammar.productions() if (p.rhs()[0] in tabl[i][k] and p.rhs()[1] in tabl[k][j+1])]) return tabl 35
CKY-implementasjon (mer prosedyrell) def cky(words, cfg): tabl = [[[] for j in range(len(words)+1) ] for i in range(len(words))] for j in range(len(words)): tabl[j][j+1] = [p.lhs() for p in cfg.productions() if p.rhs() == (words[j],)] for i in range(j-1,-1,-1): for k in range(i+1, j+1, 1): for p in grammar.productions(): if (p.rhs()[0] in tabl[i][k] and p.rhs()[1] in tabl[k][j+1]): if not p.lhs() in tabl[i][j+1]: tabl[i][j+1].append(p.lhs()) return tabl 36
Properties Grammar: S NP VP NP Det Nsg NP Npl VP IV VP TV NP Det en NP en Nsg fisker maler Npl fisker maler snurrer IV fisker maler snurrer TV fisker maler en fisker maler snurrer Det NP NP S Nsg Npl NP IV VP TV S S VP Nsg Npl NP IV VP TV S S S VP Npl NP IV VP 37
Properties Grammar: S NP VP NP Det Nsg NP Npl VP IV VP TV NP Det en NP en Nsg fisker maler Npl fisker maler snurrer IV fisker maler snurrer en fisker maler snurrer Det NP Det kan være vilkårlig mange TV kategorier fisker maler i en celle. NLTK s har en mangelfull implementasjon av wfst der en celle bare har rom for et symbol NP S Nsg Npl NP IV VP TV S S VP Nsg Npl NP IV VP TV S S S VP Npl NP IV VP 38
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 En løsning til 1 er å omforme grammatikken til CNF: Neste gang Hjelp for begge problemene å innføre dotted items og chart-parsing senere i semesteret 25. februar 2015 39