INF2820 Datalingvistikk V2018 6. Gang - 19.2 Jan Tore Lønning
I dag Kontekstfrie grammatikker og naturlige språk Grammatikker og trær i NLTK Kontekstfrie grammatikker, avledninger og trær Hva er parsing? Høyre- og venstreavledninger Recursive-Descent parser (top-down) Shift-Reduce parser (bottom-up) 15. februar 2018 2
Eksempel: grammar1 15. februar 2018 3
Context-Free Grammars Det mest sentrale verktøyet i datalingvistikk 2/15/2018 Speech and Language Processing - Jurafsky and Martin 4
CFGs for naturlige språk CFG er en generell og fleksibel formalisme Hvordan kan vi best lage CFG for å modellere naturlige språk? 1. Vanlig skille: Syntaktiske regler: Bare ikke-terminaler på høyre side (HS) Leksikalske regler: Høyresiden består av bare en terminal 2. Mange lingvistiske modeller antar at hver frase (hver HS) har et «head» (leder?) 3. En del av disse antar igjen X-bar-modellen 5
Hoder ( heads ) I en CFG-regel har alle elementer på høyresiden samme status I en NL regel har som oftest et ledd hovedrollen NP Det N PP P NP VP V NP VP VP PP a house to the house built the house built the house in a week I et PS-tre og en CFG-regel kan en frase være hodet i en annen frase I noen modeller snakker en bare om ord som hodet 6
Egenskaper ved hoder Semantisk kriterium: Hode og frase synes å være samme type ting Syntactic criteria for a relation between a head H and a dependent D in a construction C [Zwicky, Hudson]: 1. H determines the syntactic category of C; H can replace C. 2. H determines the semantic category of C; D specifies H. 3. H is obligatory; D may be optional. 4. H selects D and determines whether D is obligatory. 5. The form of D depends on H (agreement or government). 6. The linear position of D is specified with reference to H. Ikke alltid enkelt å avgjøre hva som er hodet Ulike grammatiske teorier skiller seg i detaljene (eks. Er the car en DP (the er hodet) eller NP (car er hodet)?) 7
X-bar En antagelse i flere grammatiske modeller/teorier En frase har tre nivåer: Full frase, eks. NP (= N ) Ord, eks N Midtnivå, eks. N (Called Nominal in J&M) Gjelder i prinsippet for all fraser: NP, VP, AP, PP Men ikke alle delene like hyppige for alle typer NP Det N N AP N N N PP VP V V V PP V V NP For generell form og mer informasjon, se Wikipedia 8
Eksempel: NP Det N NP=N N PP comp N PP Adju. A professor of physics from Germany Komplement: of physics Adjunct: from Germany Ikke: a professor from Germany of physics 15. februar 2018 9
Eksempel: VP VP V V V NP PP comp PP Adju. la beina på bordet på kontoret. 15. februar 2018 10
Komplementer (vs. modifikatorer) Komplement (argument): Kim gave the book to Mary Obligatorisk Eks, ugrammatisk: *Kim gave the book Kan ikke skifte med en annen preposisjon: *Kim gave the book from Mary Plasseres i X-bar-teori som Søster til X Datter til X Eks.: P P NP, eks. til skolen V V NP, eks. så Kari V V NP PP, eks. gave the book to Mary 11
Modifikatorer (vs. Komplementer) Modifikator: Kim sang in the garden Kan fjernes uten at det blir ugrammatisk Kan gjentas: sang in the garden with great joy Kan bruke annen preposisjon: sang with great joy Plasseres i X-bar-teori som Søster til X Datter til X Eks.: N N PP, eks. mannen med pistolen N AP N, eks. rød bil V V PP, eks. traff Kari på stasjonen Kan noen ganger være vanskelig å avgjøre om det er komplement eller modifikator 12
N =NP N =NOM DET A =AP N =NOM N =NOM P =PP A =AP N =NOM N P =PP 13
Ikke alle antar X-bar, f.eks ikke Penn treebank 15. februar 2018 14
I dag Kontekstfrie grammatikker og naturlige språk Grammatikker og trær i NLTK Kontekstfrie grammatikker, avledninger og trær Hva er parsing? Høyre- og venstreavledninger Recursive-Descent parser (top-down) Shift-Reduce parser (bottom-up) 15. februar 2018 15
Representasjon av grammatikk i NLTK Interaktiv innlesning >>> gram = nltk.cfg.fromstring(""" S -> NP VP VP -> V NP V NP PP PP -> P NP V -> 'saw' 'ate' 'walked' NP -> PN Det N Det N PP 'I' PN -> 'John' 'Mary' N -> 'dog' 'man' 'telescope' 'park' P -> 'in' 'by' 'on' 'with' Det -> 'a' 'an' 'the' 'my' """) >>> Les fra fil: <name>.cfg S -> NP VP VP -> V NP V NP PP PP -> P NP V -> 'saw' 'ate' 'walked' NP -> PN Det N Det N PP 'I' PN -> 'John' 'Mary' N -> 'dog' 'man' 'telescope' 'park' P -> 'in' 'by' 'on' 'with' Det -> 'a' 'an' 'the' 'my' Entering >>> gram = nltk.data.load( file:<name>.cfg ) February 15, 2018 16
Tilgang til grammatikken >>> gram <Grammar with 25 productions> >>> gram.start() S >>> for i in gram.productions(): print i S -> NP VP VP -> V NP VP -> V NP PP PP -> P NP V -> 'saw' V -> 'ate' V -> 'walked' NP -> PN Etc. >>> rule0 = gram.productions()[0] >>> rule0.lhs() S >>> rule0.rhs() (NP, VP) >>> rule5 = gram.productions()[5] >>> rule5 V -> 'ate' >>> rule5.lhs() V >>> rule5.rhs() ('ate',) >>> February 15, 2018 17
Representasjon av trær i Python En mulig implementasjon ville være å bruke et par (tuppel) Et tre kan forstås som Et par av En streng Morens kategori En liste av trær døtrene Eller en streng et blad, en terminal (S, [(NP, [(Det, ['the']), (N, ['dog'])]), (VP, [(V, ['saw']), (NP, [(Det, ['a']), (N, ['man'])]), (PP, [(P, ['in']), (NP, [(Det, ['the']), (N, ['park'])] )])])]) February 15, 2018 18
NLTKs tre-klasse Klassen Tree utvider klassen List List-en brukes til døtrene: tre[0] er første datter, osv Utvidet med: Metoden tre.label() gir mors kategori Metoder for uttegning, prøv t.print() t.pretty_print() t.draw() S VP NP NP ND TV ND barnet elsket kosedyret 15. februar 2018 19
I dag Kontekstfrie grammatikker og naturlige språk Grammatikker og trær i NLTK Kontekstfrie grammatikker, avledninger og trær Hva er parsing? Høyre- og venstreavledninger Recursive-Descent parser (top-down) Shift-Reduce parser (bottom-up) 15. februar 2018 20
Eksempel: Avledning 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 Flere avledninger av samme streng, for eksempel: S NP VP NP V NP PP NP V NP P NP NP V NP P Det N NP V NP P Det park 15. februar 2018 21
Avledning, leses: kan direkte avledes fra dersom: har formen C for en ikke-terminal C det er en regel på formen C og = 1 * m, leses: m kan avledes fra 1 dersom: det fins en sekvens 1, 2,, m der m>1, og i i+1 En kontekstfri grammatikk G generer språket L(G) = { w A* S * w} Alle sekvenser av terminaler som kan avledes fra startsymbolet 15. februar 2018 22
Hva betyr kontekstfri? Generell frasestrukturgrammatikk: venstresiden kan være en vilkårlig symbolstreng: Kontekstfri grammatikk = kontekstfri frasestrukturgrammatikk: Venstresiden består av én ikke-terminal A 2/15/2018 Speech and Language Processing - Jurafsky and Martin 23
Konvensjoner Forenkling, kan skrive A for A A A 15. februar 2018 24
Flertydighet Samme streng kan avledes på flere måter Er vi interessert i dette? Noen ganger Andre ganger ikke Interessant hvis de representerer ulike måter setningen er bygget opp på (=) ulike strukturer (trær) ulike betydninger ved flertydighet 15. februar 2018 25
Eksempel: grammar1 15. februar 2018 26
Trær Et lokalt tre: En node som ikke er et blad Alle døtrene Rekkefølgen mellom døtrene Kantene mellom mor og datter En regel B s1, s2,, sn tillater ( license ) et lokalt tre hvis og bare hvis det har formen: 15. februar 2018 27 B s1 s2.. sn
Trær En CFG G, generer et tre t hviss Toppen av t er merket med S Bladene er merket med terminaler Hvert lokalt tre er tillatt av en produksjonsregel T(G) for mengde av trær generert av G Utkomme ( yield ) av treet t er symbolene på bladene i riktig rekkefølge Forkortelse: hviss for hvis og bare hvis En streng w er avledbar fra G hviss w er utkomme til et tre i T(G). 15. februar 2018 28
Ekvivalens Definisjon To grammatikker, G1 og G2, er (svakt) ekvivalente hvis og bare hvis L(G1)=L(G2) G1 og G2 er sterkt ekvivalente hvis T(G1)=T(G2) 15. februar 2018 29
I dag Kontekstfrie grammatikker og naturlige språk Grammatikker og trær i NLTK Kontekstfrie grammatikker, avledninger og trær Hva er parsing? Høyre- og venstreavledninger Recursive-Descent parser (top-down) Shift-Reduce parser (bottom-up) 15. februar 2018 30
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 15. februar 2018 31
Ulike typer parsere Back-tracking -parsere Recursive Descent Parser Strategi: Ovenifra og ned ( Top-down ) Shift-Reduce Parser Strategi: Nedenifra og opp ( Bottom-Up ) Tabellparsere CKY Chartparsere Earleys algoritme 32
I dag Kontekstfrie grammatikker og naturlige språk Grammatikker og trær i NLTK Kontekstfrie grammatikker, avledninger og trær Hva er parsing? Høyre- og venstreavledninger Recursive-Descent parser (top-down) Shift-Reduce parser (bottom-up) 15. februar 2018 33
Eksempel: Avledning 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 Flere avledninger av samme streng, for eksempel: S NP VP NP V NP PP NP V NP P NP NP V NP P Det N NP V NP P Det park 15. februar 2018 34
Høyre- og venstreavledninger Til hvert tre svarer det mange avledninger. For kontekstfrie grammatikker er forskjellene mellom avledninger som svarer til samme tre uinteressante. 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. 15. februar 2018 35
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 15. februar 2018 36
I dag Kontekstfrie grammatikker og naturlige språk Grammatikker og trær i NLTK Kontekstfrie grammatikker, avledninger og trær Hva er parsing? Høyre- og venstreavledninger Recursive-Descent parser (top-down) Shift-Reduce parser (bottom-up) 15. februar 2018 37
Recursive Descent parser Lager en venstreavledning Tilsvarer å bygge et tre: Fra toppen ( top-down ) Fra venstre mot høyre Merk Tilstrekkelig å bare se på venstreavledninger fordi de svarer til trær Streber mot tidligst mulig å sjekke mot input-data Et trinn er ikke-deterministisk: Velg en regel! Dette gir et søkerom å holde orden på 15. februar 2018 38
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 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 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 # # 15. februar 2018 39
Algoritme ikke-deterministisk Struktur: Frontier: De symbolene det gjenstår å finne Words: Resten av input som så langt ikke er prosessert Intialisering Words:= Inputordene Frontier:= list( S ) Løkke: Hvis Frontier=Words= : stopp med suksess! Hvis first(words)=first(frontier): Words:=rest(Words), Frontier:=rest(Frontier) Hvis first(frontier) er en ikke-terminal B, velg en regel B, og la Frontier:= + rest(frontier) 15. februar 2018 40
Søkerom Recursive Descent: Deterministisk Dybde-først: Følg det alternativet du har valgt til bunns før du prøver det neste 15. februar 2018 41
Demo nltk.app.rdparser() 15. februar 2018 42
En underklasse av CFG-er I lingvistikk er det vanlig å skille mellom 1. Leksikon: ordene og deres egenskaper 2. Syntaktiske regler: relaterer syntaktiske kategorier Modelleres i CFG ved å bare ha regler av to typer 1. Høyresiden består av en terminal: Det the 2. Høyresiden inneholder bare ikke-terminaler: S NP VP De fleste CFG-grammatikker vi vil se har denne formen I mangel av et bedre navn vil vi si at en slik grammatikk er på Standardform 43
Egenskaper Til enhver CFG G1 fins en CFG G2 på standardform s.a. L(G1) = L(G2) Fremgangsmåte, gitt G1: For enhver terminal t innfør ny ikke-terminal X t og regel X t t For enhver regel A der lengden av er 2: Skift enhver terminal t i med korresponderende ikke- terminal X t Eks: Skift: NP NP and NP Med: X and and NP NP X and NP der X and er ny ikke-terminal Tilsv. for alle regler 44
En noe forbedret algoritme Med mange (f.eks. 20 000) regler på formen N cat, N dog, N man, etc. blir algoritmen svært langsom. Forbedring hvis grammatikk på standardform Ikke omskriv de leksikalske reglene X w For et ord w først i Words, se på alle regler av formen X w, for en eller annen X: (typisk max 10) Er X først i Frontier? I så fall fjern w fra Words og X fra Frontier og fortsett. 15. februar 2018 45
Algoritme grammatikk standardform Struktur: Frontier: De symbolene det gjenstår å finne Words: Resten av input som så langt ikke er prosessert Intialisering Words:= Inputordene Frontier:= list( S ) Løkke: Hvis Frontier=Words= : stopp med suksess! Hvis first(words)=w, first(frontier)=f og det fins en leksikalsk regel F w: Words:=rest(Words), Frontier:=rest(Frontier) Hvis first(frontier) er en ikke-terminal B, velg en (ikkeleksikalsk) regel B, og la Frontier:= + rest(frontier) 15. februar 2018 46
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 15. februar 2018 47
I dag Kontekstfrie grammatikker og naturlige språk Grammatikker og trær i NLTK Kontekstfrie grammatikker, avledninger og trær Hva er parsing? Høyre- og venstreavledninger Recursive-Descent parser (top-down) Shift-Reduce parser (bottom-up) 15. februar 2018 48
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 15. februar 2018 49
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 15. februar 2018 50
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 15. februar 2018 51
Fra anerkjenner til parser La stacken bestå av deltrær Shift som før Stack: 4 elements Remaining input 52
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: X som merke på mora t 1,, t i, t n som døtre Push t på toppen av stacken 53
Demo nltk.app.srparser() 15. februar 2018 54
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. 15. februar 2018 55
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? 56
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 15. februar 2018 57