Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

INF2820 Datalingvistikk – V2012 Jan Tore Lønning.

Liknende presentasjoner


Presentasjon om: "INF2820 Datalingvistikk – V2012 Jan Tore Lønning."— Utskrift av presentasjonen:

1 INF2820 Datalingvistikk – V2012 Jan Tore Lønning

2 LITT PYTHON 2

3 Hvorfor Pyhton NLTK – Natural Language Tool Kit: Omgivelser for å eksperimentere med datalingvistikk Diverse datalingvistiske algoritmer Inkluderte språkdata, korpora Vekt på læring Python var først scripting language: Styre andre programmer, inkludert NLTK rutiner Gode redskaper for behandling av tekst string, list Intuitiv og lesbar syntaks som en pseudokode ”Read-eval-print”-løkke for rask utvikling 3

4 Python syntaks Tilordning: a = 5 Python bruker indent som blokkavgrenser: Andre språk: begin-end, ( ) Hva tror du blir resultatet av kallene f(8) g(8) 4 def f(i): for j in [2,3,4]: i=j+i print i def f(i): for j in [2,3,4]: i=j+i print i def g(i): for j in [2,3,4]: i=j+i print i def g(i): for j in [2,3,4]: i=j+i print i

5 Python datatyper integer float string: ”Hello world” lister: [3, 4, 5] [’Hello’, ’world’] [3, 4, c] Aksesseres med indekser ”mutable” 5 >>> a = "Hello world" >>> a 'Hello world' >>> len(a) 11 >>> a[0] 'H' >>> a[-1] 'd' >>> b = a[3:7] >>> b 'lo w' >>> type(b) >>> a = "Hello world" >>> a 'Hello world' >>> len(a) 11 >>> a[0] 'H' >>> a[-1] 'd' >>> b = a[3:7] >>> b 'lo w' >>> type(b) >>>c = 10 >>>e = [3,4,c,c+c,5*c] >>>e [3,4,10,20,50] >>>e[3] = 19 >>>e [3,4,10,19,50] >>>f = e[1:] >>>f [4,10,19,50] >>>e[3]=f >>>e [3,4,10,[4,10,19,50],50] >>>f[2]=0 >>>e ? >>>c = 10 >>>e = [3,4,c,c+c,5*c] >>>e [3,4,10,20,50] >>>e[3] = 19 >>>e [3,4,10,19,50] >>>f = e[1:] >>>f [4,10,19,50] >>>e[3]=f >>>e [3,4,10,[4,10,19,50],50] >>>f[2]=0 >>>e ?

6 Python er objektorientert Alt er objekter Har sine metoder Eksempler med strenger: ”Hello world,”.split() ”world,”.strip(’,’) 6

7 DFA i Python 7 def recognize(fa, streng): state = fa.start while True: if len(streng)==0: return state in fa.finals elif (state,streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] streng = streng[1:] Jurafsky & Martin, fig Enkel Python if state in fa.finals: return True: else: return False if state in fa.finals: return True: else: return False samme som

8 DFA i Python - datastruktur 8 def recognize(fa, streng): state = fa.start while True: if len(streng)==0: return state in fa.finals elif (state,streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] streng = streng[1:] Datastruktur Enkel Python class DFA: def __init__(self): self.edge = {} self.finals = [] f = DFA() f.start = 0 f.finals.append(4) f.edge[(0,'b')] = 1 f.edge[(1,'a')] = 2 f.edge[(2,'a')] = 3 f.edge[(3,'a')] = 3 f.edge[(3,'!')] = 4 Denne strukturen for visning på skjerm Bedre praksis (mer tekst): Rutiner i klassen som leser inn data og konstruerer objektet Legg funksjonen som metode i klassen Denne strukturen for visning på skjerm Bedre praksis (mer tekst): Rutiner i klassen som leser inn data og konstruerer objektet Legg funksjonen som metode i klassen

9 Rekursjon  iterasjon 9 def recognize(fa, streng): state = fa.start while True: if len(streng)==0: return state in fa.finals elif (state,streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] streng = streng[1:] Rekursiv Iterativ def recognize3(fa, streng, trace=0): state = fa.start return rec(fa, state, streng, trace) def rec(fa, state, streng, trace): if trace > 0: print streng, state if len(streng)==0: return state in fa.finals elif (state, streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] return rec(fa, state, streng[1:], trace)

10 PROSESSERING MED NFA 10

11 11 Søkerom

12 12 Breddeførst søk JFLAP Parallellsøk er noe tilsvarende Breddeførst søk JFLAP Parallellsøk er noe tilsvarende

13 13 Dybdeførst søk m/ Backtracking Jurafsky og Martin Dybdeførst søk m/ Backtracking Jurafsky og Martin

14 Husk: rekursiv DFA 14 def recognize(fa, streng): state = fa.start while True: if len(streng)==0: return state in fa.finals elif (state,streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] streng = streng[1:] Rekursiv Iterativ def recognize3(fa, streng, trace=0): state = fa.start return rec(fa, state, streng, trace) def rec(fa, state, streng, trace): if trace > 0: print streng, state if len(streng)==0: return state in fa.finals elif (state, streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] return rec(fa, state, streng[1:], trace)

15 NFA i Python - Backtracking 15 def recognize4(fa, streng, trace=0): state = fa.start return rec(fa, state, streng, trace) def rec(fa, state, streng, trace): if trace > 0: print streng, state if len(streng) == 0: return state in fa.finals else: states = [e[2] for e in fa.edges if state == e[0] and streng[0] == e[1] ] for state in states: if rec(fa,state, streng[1:], trace): return True return False DFA NFA uten  -transisjoner def recognize3(fa, streng, trace=0): state = fa.start return rec(fa, state, streng, trace) def rec(fa, state, streng, trace): if trace > 0: print streng, state if len(streng)==0: return state in fa.finals elif (state, streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] return rec(fa, state, streng[1:], trace)

16 NFA i Python - Datastruktur 16 def recognize4(fa, streng, trace=0): state = fa.start return rec(fa, state, streng, trace) def rec(fa, state, streng, trace): if trace > 0: print streng, state if len(streng) == 0: return state in fa.finals else: states = [e[2] for e in fa.edges if state == e[0] and streng[0] == e[1] ] for state in states: if rec(fa,state, streng[1:], trace): return True return False NFA uten  -transisjoner class NFA: def __init__(self): self.edges = [] self.finals = [] … f = NFA(…) f.start = 0 f.finals.append(4) f.edges= [ (0,'b',1), (1,'a',2), (2,'a',3), (3,'a',3), (3,'!',4) ] g=NFAFromFile('template.nfa')

17 Python: ”list comprehension” edges = [e for e in fa.edges if state == e[0] and streng[0] == e[1] ] edges = [] for e in fa.edges: if state == e[0] and streng[0] ==e[1]: edges.append(e) 17

18 Python: ”list comprehension” states = [e[2] for e in fa.edges if state == e[0] and streng[0] == e[1] ] states = [] for e in fa.edges: if state==e[0] and streng[0]==e[1]: states.append(e[2]) 18

19 Jurafsky og Martins algoritme 19 Strengt tatt: nøytral mht. Dybde-først vs bredde-først Bruker løkke+agenda i stedet for rekursjon Bruker løkke+agenda i stedet for rekursjon

20 Egenskaper ved algoritmene Både dybde-først m/backtracking breddeførst vil i verste fall ha eksponentielt tidsforbruk proporsjonalt med k n, der n= |w|, lengden av input k  2 er maks antall kanter fra en node merket med samme symbol Med epsilontransisjoner Kan risikere ikke terminerer! Men vi vet jo at hvis vi først lager DFA får vi linjært tidsforbruk! 20

21 En raskere algoritme En konfigurasjon består av: En mengde tilstander Resten av strengen Start: Q0 = E({q0}) (E er epsillontillukning) Oppdatering Gitt konfigurasjon: w_n = s  w’ Qn={q1, …, qk} La ny konfigurasjon være w_n+1 = w’ Qn+1=E(  N(q1,s)  N(q2,s)  …   N(qk,s)) Akseptering Konfigurasjonen w_n =  Qn={q1, …, qk} Aksepterer hvis minst en av q1, …, qk er en sluttilstand. 21

22 NFA-anerkjenning i Python (uten  ) 22 def recognize(fa, streng): state = fa.start while True: if len(streng)==0: return state in fa.finals elif (state,streng[0]) not in \ fa.edge.keys(): return False else: state = fa.edge[(state,streng[0])] streng = streng[1:] Ikke-deterministisk Deterministisk def recognize5(self, streng, trace=0): states = [self.start] while True: if trace > 0: print streng, list(states) if len(streng)==0: successtates = [s for s in states if s in self.finals] return len(successtates)> 0 elif len(states) == 0: return False else: states = set([e[2] for e in self.edges if e[0] in states and streng[0] == e[1] ]) streng = streng[1:]

23 Egenskaper Svarer til underveis å bygge de delene vi trenger av DFA-ene som svarer til denne NFA-en. Algoritmen er linjær i |w|=n. Men kvadratisk i antall tilstander: m O(n m**2) Terminerer 23

24 Implementasjonon av NFA-er Oppsummering: 1.DFA-algoritmen: Konstruer en ekvivalent DFA (Minimaliser denne) Bruk DFA-en 2.NFA-algoritmen: Som simulerer DFA underveis For 1: Teoretisk raskere Mot 1: DFA-en kan få 2 n tilstander der n er tilstander i NFA-en: Tar mye plass Kan i praksis ta lengre tid å slå opp i DFA-en Hvilken algoritme som er best: Er et empirisk spørsmål Avhenger av oppgaven 24

25 REGULÆRE UTTRYKK I PRAKSIS 25

26 Regulære uttrykk – to tilnærminger Teoretisk Sett på så langt Oprinnelig (1950-tallet) J&M seksj 2.3 Tilstreber: Minst mulig notasjon for å definere klassen Formelt meget veldefinert Praktisk ”RegEx” Unix (grep/egrep), Perl, Emacs, … Tilstreber effektiv i bruk Spesialsymboler, div. forkortelser. MEN: kan inneholde muligheter som går ut over de regulære språkene! 26

27 Forskjeller til teoretiske RE Vi beskriver ikke et språk men søker etter substrenger av et språk Ankere ^ begynnelsen av linjen $ slutten av linjen Går ut over rene RE Muligheten til å referere tilbake til hele grupper: Går utover regulære språk Kan ikke uten videre bruke DFA som algoritme 27

28 Implementasjon av regex 3.Backtracking: En prøver å matche regex direkte mot (et segment av) strengen Leser regex fra venstre mot høyre (tilpasset for * + …) Ser om en kan utvide strengsegmentet til å matche neste symbol i regex Hvis ikke: backtrack – gå tilbake på tidligere valg SØK: finn et delsegment av strengen som matcher OBS: Regex går også utover kontekstfrie språk 28

29 Implementasjon av regex Hvis ekte regulært uttrykk: Gjør om til NFA Bruk algoritme 1 eller 2 Hvis regex går utover regulære uttrykk er det vanlige Bruk algoritme av type 3 29

30 Ta med hjem: Gitt en NFA: N som beskriver et språk L=L(N) Da finnes det en DFA: D som beskriver samme språk, L=L(D) Skal vi implementere N, kan vi enten konstruere D (forrige gang) Eller prosessere direkte med N (som om det var D) Uansett er prosedyren Ikke flertydig Deterministisk Tidsforbruket er linjært i input Gitt en NFA: N som beskriver et språk L=L(N) Da finnes det en DFA: D som beskriver samme språk, L=L(D) Skal vi implementere N, kan vi enten konstruere D (forrige gang) Eller prosessere direkte med N (som om det var D) Uansett er prosedyren Ikke flertydig Deterministisk Tidsforbruket er linjært i input 30


Laste ned ppt "INF2820 Datalingvistikk – V2012 Jan Tore Lønning."

Liknende presentasjoner


Annonser fra Google