INF2820 Datalingvistikk V2017 7. Gang 27.2 Jan Tore Lønning
I dag Fra sist: Høyre- og venstreavledninger Recursive-descent parser (top-down) Shift-reduce parser (bottom-up) Pythonimplementasjon: Shift-Reduce Recognizer Svakheter ved RD- og SR-parsing CKY-algoritmen Python-implementasjon Chomsky Normal Form (CNF) 22. februar 2017 2
Eksempel: VF og HF Venstreavledning: S NP VP Det N VP the N VP the dog VP the dog V NP PP the dog saw NP 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 NP the dog saw a man in NP the dog saw a man in Det N the dog saw a man in the N the dog saw a man in the park 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 22. februar 2017 3
Høyre- og venstreavledninger En avledning er en venstreavledning ( leftmost derivation ) hvis vi alltid ekspanderer ikke terminalen lengst til venstre. Høyreavledning defineres tilsvarende. Til ethvert tre generert av grammatikken svarer det nøyaktig en venstreavledning og nøyaktig en høyreavledning. 22. februar 2017 4
Recursive Descent parser Lager en venstreavledning Tilsvarer å bygge et tre: Fra toppen ( top-down ) Fra venstre mot høyre 22. februar 2017 5
S the dog saw a man in the park Datastruktur 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 Venstreavledning 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 S saw NP PP saw a man in the park NP VP NP PP a man in the park Det N VP Det N PP a man in the park the N VP a N PP a man in the park the dog VP N PP man in the park the dog V NP PP man PP man in the park the dog saw NP PP PP in the park the dog saw Det N PP P NP in the park the dog saw a N PP in NP in the park the dog saw a man PP NP the park the dog saw a man P NP Det N the park the dog saw a man in NP the N the park the dog saw a man in Det N N park the dog saw a man in the N park park the dog saw a man in the park # # 22. februar 2017 6
I dag Fra sist: Høyre- og venstreavledninger Recursive-descent parser (top-down) Shift-reduce parser (bottom-up) Pythonimplementasjon: Shift-Reduce Recognizer Svakheter ved RD- og SR-parsing CKY-algoritmen Python-implementasjon Chomsky Normal Form (CNF) 22. februar 2017 7
Shift-Reduce 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 reduce shift 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 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 Datastruktur: stack rest input 22. februar 2017 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 22. februar 2017 9
I dag Fra sist: Høyre- og venstreavledninger Recursive-descent parser (top-down) Shift-reduce parser (bottom-up) Pythonimplementasjon: Shift-Reduce Recognizer Svakheter ved RD- og SR-parsing CKY-algoritmen Python-implementasjon Chomsky Normal Form (CNF) 22. februar 2017 10
def recognize(grammar, stack, rwords, trace=0): 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 22. februar 2017 11
Fra anerkjenner til parser La stacken bestå av deltrær Shift som før Stack: 4 elements Remaininginput 12
Fra anerkjenner til parser La stacken bestå av deltrær Shift som før Reduksjon: For hver av de n øverste deltrærne t 1, t 2,, t i, t n på stacken: Ta merkelappen l i på toppnoden Hvis det finnes en regel X l 1, l 2,, l i, l n fjern t 1,, t i, t n fra toppen av stacken Lag et tre t med: Xsom merke på mora t 1,, t i, t n som døtre Push t på toppen av stacken 13
Demo nltk.app.srparser() 22. februar 2017 14
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 Hvis grammatikken er på standardform, kan algoritmen gjøres noe mer effektiv: Hver gang vi shifter et ord over på stacken, må vi redusere, Mao. Det eneste stedet på stacken vi tillater en terminal er på toppen. 22. februar 2017 15
I dag Fra sist: Høyre- og venstreavledninger Recursive-descent parser (top-down) Shift-reduce parser (bottom-up) Pythonimplementasjon: Shift-Reduce Recognizer Svakheter ved RD- og SR-parsing CKY-algoritmen Python-implementasjon Chomsky Normal Form (CNF) 22. februar 2017 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
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 22. februar 2017 18
I dag Fra sist: Høyre- og venstreavledninger Recursive-descent parser (top-down) Shift-reduce parser (bottom-up) Pythonimplementasjon: Shift-Reduce Recognizer Svakheter ved RD- og SR-parsing CKY-algoritmen Python-implementasjon Chomsky Normal Form (CNF) 22. februar 2017 19
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 20
CKY-parsing CKY/CYK (Cocke Kasami Younger) algoritmen 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 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 ) 22. februar 2017 22
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] 23
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 24
CNF-grammatikk til eksempel 2/22/2017 Speech and Language Processing - Jurafsky and Martin 25
Eksempel 2/22/2017 Speech and Language Processing - Jurafsky and Martin 26
Eksempel 2/22/2017 Speech and Language Processing - Jurafsky and Martin 27
Eksempel Hvordan fylle søyle 5 2/22/2017 Speech and Language Processing - Jurafsky and Martin 28
Eksempel 2/22/2017 Speech and Language Processing - Jurafsky and Martin 29
Eksempel 2/22/2017 Speech and Language Processing - Jurafsky and Martin 30
Eksempel 2/22/2017 Speech and Language Processing - Jurafsky and Martin 31
Eksempel 2/22/2017 Speech and Language Processing - Jurafsky and Martin 32
CKY Algorithm 2/22/2017 Speech and Language Processing - Jurafsky and Martin 33
I dag Fra sist: Høyre- og venstreavledninger Recursive-descent parser (top-down) Shift-reduce parser (bottom-up) Pythonimplementasjon: Shift-Reduce Recognizer Svakheter ved RD- og SR-parsing CKY-algoritmen Python-implementasjon Chomsky Normal Form (CNF) 22. februar 2017 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
I dag Fra sist: Høyre- og venstreavledninger Recursive-descent parser (top-down) Shift-reduce parser (bottom-up) Pythonimplementasjon: Shift-Reduce Recognizer Svakheter ved RD- og SR-parsing CKY-algoritmen Python-implementasjon Chomsky Normal Form (CNF) 22. februar 2017 37
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) Enhver CFG G hvor L(G) er svakt ekvivalent til en G på CNF, dvs L(G)=L(G ) 22. februar 2017 38
Chomsky-normalform (CNF) Enhver CFG G hvor L(G) er svakt ekvivalent til en G på CNF Oppskrift: 1. Erstatt alle regler på formen A 2. Erstatt alle regler på formen A B for B en ikke terminal 3. Erstatt alle regler A, der > 1 og inneholder en eller flere terminaler t 1,, t n 4. Erstatt alle regler A B 1 B 2 B n, der n > 2, : 22. februar 2017 39
Trinn 1: A Erstatt alle regler på formen A unntatt evt. S 1. Finn mengden E av alle ikke-terminaler A, s.a. A + 2. For hver regel B : Legg til alle regler på formen B, der fremkommer ved å stryke en eller flere ikke-terminaler fra E i. 3. Stryk alle regler på formen A 22. februar 2017 40
Trinn 2: A B for B en ikke-terminal Erstatt alle regler på formen A B for B en ikketerminal: 1. For enhver ikke terminal B: For enhver A s.a. A B eller A + B: For enhver s.a. B : Innfør A, hvis den ikke alt finnes 2. Fjern alle unære regler med ikke terminal høyreside 22. februar 2017 41
Trinn 3 Erstatt alle regler A, der > 1 og inneholder en eller flere terminaler t 1,, t n 1. Innfør nye ikke terminaler T 1,, T n. 2. Erstatt t i med T i i 3. Innfør reglene T i t i for i = 1,, n 22. februar 2017 42
Trinn 4 Erstatt alle regler A B 1 B 2 B n, der n > 2, For hver regel A B 1 B 2 B n, n > 2, : 1. Innfør nye ikke terminaler C 1,, C n 2 og regler 2. A B 1 C 1 3. C i B i+1 C i+1 for i = 1,, n 3 4. C n 2 B n 1 B n 22. februar 2017 43
Eksempel Grammatikk 1. S a A 2. A a A 3. A a Ab 4. A B 5. B ab c 6. B 22. februar 2017 44
Eksempel Grammatikk 1. S a A 2. A a A 3. A a Ab 4. A B 5. B ab c 6. B Trinn 1 E = {A, B} 1. S a A 2. A a A 3. A a Ab 4. A B 5. B a B c 6. stryk 7. S a 8. A a 9. A a b 10.B a c 22. februar 2017 45
Eksempel Grammatikk 1. S a A 2. A a A 3. A a Ab 4. A B 5. B ab c 6. B Trinn 1 E = {A, B} 1. S a A 2. A a A 3. A a Ab 4. A B 5. B a B c 6. stryk 7. S a 8. A a 9. A a b 10.B a c Trinn 2 E = {A, B} 1. S a A 2. A a A 3. A a Ab 4. stryk 5. B a B c 6. strøket 7. S a 8. A a 9. A a b 10.B a c 11.A a B c 12.A a c 22. februar 2017 46
Eksempel Grammatikk 1. S a A 2. A a A 3. A a Ab 4. A B 5. B ab c 6. B Trinn 1 E = {A, B} 1. S a A 2. A a A 3. A a Ab 4. A B 5. B a B c 6. stryk 7. S a 8. A a 9. A a b 10.B a c Trinn 2 E = {A, B} 1. S a A 2. A a A 3. A a Ab 4. strøket 5. B a B c 6. strøket 7. S a 8. A a 9. A a b 10.B a c 11.A a B c 12.A a c Trinn 3 I. S XA II. A XA III. A XA Y IV. strøket V. B XB Z VI. strøket VII. S a VIII. A a IX. A XY X. B XZ XI. A XB Z XII. A XZ XIII. X a XIV. Y b XV. Z c 22. februar 2017 47
Eksempel Grammatikk 1. S a A 2. A a A 3. A a Ab 4. A B 5. B a B c 6. B Trinn 1 E = {A, B} 1. S a A 2. A a A 3. A a Ab 4. A B 5. B a B c 6. stryk 7. S a 8. A a 9. A a b 10.B a c Trinn 2 E = {A, B} 1. S a A 2. A a A 3. A a Ab 4. stryk 5. B a B c 6. strøket 7. S a 8. A a 9. A a b 10.B a c 11.A a B c 12.A a c Trinn 3 I. S XA II. A XA III. A XA Y IV. strøket V. B XB Z VI. strøket VII. S a VIII. A a IX. A XY X. B XZ XI. A XB Z XII. A XZ XIII. X a XIV. Y b XV. Z c Trinn 4 I. S XA II. A XA III.i A XP III.ii P A Y IV. strøket V.i B XQ V.ii Q B Z VI. strøket VII. S a VIII. A a IX. A XY X. B XZ XI.i A XR X1.ii R B Z XII. A XZ XIII. X a XIV. Y b XV. Z c 22. februar 2017 48
Sample L1 Grammar 2/22/2017 Speech and Language Processing - Jurafsky and Martin 49
CNF Conversion 2/22/2017 Speech and Language Processing - Jurafsky and Martin 50
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 og chart-parsing senere i semesteret 22. februar 2017 51