INF2820 Datalingvistikk V2016. Jan Tore Lønning

Like dokumenter
INF2820 Datalingvistikk V2015. Jan Tore Lønning

INF2820 Datalingvistikk V forelesning, 30.1 Jan Tore Lønning

INF2820 Datalingvistikk V2017 Forelesning 3, 30.1 Jan Tore Lønning

1/26/2012 LITT PYTHON. INF2820 Datalingvistikk V2012. Hvorfor Pyhton. Python syntaks. Python er objektorientert. Python datatyper.

INF2820 Datalingvistikk V2012. Jan Tore Lønning

INF2820 Datalingvistikk V2018 Forelesning 3, 29. jan. Jan Tore Lønning

INF2820 Datalingvistikk V2012. Jan Tore Lønning

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

INF2820 Datalingvistikk V2017 Forelesning 2, 23.1 Jan Tore Lønning

INF2820 Datalingvistikk V2015. Jan Tore Lønning

1/31/2011 SAMMENHENGER FSA OG REGULÆRE UTTRYKK. Regulære språk. Fra FSA til RE. Fra regulært uttrykk til NFA REGULÆRE UTTRYKK I DATALINGVISTIKK DEL 2

INF2820 Datalingvistikk V2014. Jan Tore Lønning

INF2820 Datalingvistikk V2014. Forelesning 4, 6.2 Jan Tore Lønning

INF2820 Datalingvistikk V2015. Jan Tore Lønning

INF2820 Datalingvistikk V2016. Jan Tore Lønning

INF2820 Datalingvistikk V2016. Jan Tore Lønning

INF2820 Datalingvistikk V2017 Forelesning 1.2 Jan Tore Lønning

INF2820 Datalingvistikk V2015. Forelesning 4, 9.2 Jan Tore Lønning

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

INF 2820 V2016: Obligatorisk innleverinsoppgave 1

Skanning del I INF /01/15 1

INF2820 Datalingvistikk V Gang Jan Tore Lønning

INF2820 Datalingvistikk V gang, Jan Tore Lønning

INF2820 Datalingvistikk V2014. Jan Tore Lønning

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

INF2820 Datalingvistikk V2012. Jan Tore Lønning & Stephan Oepen

Skanning del I. Kapittel 2 INF 3110/ INF

Scanning - I Kap. 2. Hva scanneren gjør

INF2820 Datalingvistikk V2012. Jan Tore Lønning

INF2820 Datalingvistikk V2012

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Informasjon Eksamen i IN1000 høsten 2017

Følger Sipsers bok tett både i stoff og oppgaver.

INF2820 Datalingvistikk V Gang Jan Tore Lønning

INF2820 Datalingvistikk V2014. Jan Tore Lønning

INF2820 Datalingvistikk V Gang 26.2 Jan Tore Lønning

INF 2820 V2018: Innleveringsoppgave 1

Objektorientert programmering i Python

INF2820 Datalingvistikk V2016. Jan Tore Lønning

INF2820 Datalingvistikk V2015. Jan Tore Lønning

INF2820 Datalingvistikk V Gang 13.3 Jan Tore Lønning

Informasjon Prøveeksamen i IN1000 høsten 2018

2/24/2012. Context-Free Grammars. I dag. Avledning. Eksempel: grammar1 PARSING. Jan Tore Lønning

INF2820 Datalingvistikk V Gang 9.3 Jan Tore Lønning

Dagens tema: Regulære språk og uttrykk

Oppgave 1. Spørsmål 1.1 (10%) Gitt det regulære uttrykket: a((bcd)+(cd))*cd

INF2820 Datalingvistikk V gang, Jan Tore Lønning

MAT1030 Plenumsregning 1

INF2820 Datalingvistikk V2017 Forelesning 1.1, 16.1 Jan Tore Lønning

Syntax/semantics - I INF 3110/ /29/2005 1

INF2820 Datalingvistikk V Gang 4.5 Jan Tore Lønning

3/5/2012. Chart alternativ datastruktur. Fundamentalregelen. Chart-parsing. Bottom-up FORMELL SPRÅKTEORI. Jan Tore Lønning

TDT4110 IT Grunnkurs Høst 2015

MAT1030 Diskret Matematikk

Magnus Moan (Undertegnede) Enkle datastrukturer, trær, traversering og rekursjon

INF2820 Datalingvistikk V2012. Jan Tore Lønning

UNIVERSITETET I OSLO

Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF2820 Datalingvistikk V Gang 2.3 Jan Tore Lønning

INF2820 V2017 Oppgavesett 5 Gruppe 21.2

Anatomien til en kompilator - I

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver - LF. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

Kap.4, del 2: Top Down Parsering Kap. 5, del 1: Bottom Up Parsing INF5110, 7/ Legger ut en oppgave til kap. 4 (se beskjed).

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

Læringsmål uke 7. Introduksjon til objektorientert programmering. Paradigmet objektorientering. Objektreferanser. INF1001 Høst 2016 Uke 7

INF2820 Datalingvistikk V Gang Jan Tore Lønning

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

Hva er syntaks? En overskrift i en norsk avis: Dagens tema Grundig repetisjon og utdyping:

INF2820 Datalingvistikk V Gang 9.3 Jan Tore Lønning

INF2820 Datalingvistikk V Gang 19.3 del 1 Jan Tore Lønning

INF2820 Datalingvistikk V Gang 27.2 Jan Tore Lønning

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

INF1820: Introduksjon til språk-og kommunikasjonsteknologi

INF1820: Introduksjon til språk-og kommunikasjonsteknologi

UNIVERSITETET I OSLO

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

Etter uke 9 skal du. Introduksjon til objektorientert programmering. Innhold. Klasser som abstraksjoner

Øvingsforelesning 5 Python (TDT4110)

Anatomien til en kompilator - I

Løsnings forslag i java In115, Våren 1996

UNIVERSITETET I OSLO

IN1000 Obligatorisk innlevering 7

Øvingsforelesning 2 - TDT4120. Grafer og hashing. Benjamin Bjørnseth

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

IN1140, H2018 gruppetime oppgaver Introduksjon til Tekst i Python

Øvingsforelesning 5 Python (TDT4110)

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2080 Logikk og beregninger

TMA4140 Diskret Matematikk Høst 2016

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

INF3110 Programmeringsspråk

INF2820 Datalingvistikk V Gang 2.3 Jan Tore Lønning

Etter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering

INF 2820 V2015: Obligatorisk innleveringsoppgave 3

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

TDT4120 Øvingsforelesning 1 Introduksjon til Python

Transkript:

INF2820 Datalingvistikk V2016 Jan Tore Lønning

I dag Automater og regulære uttrykk Litt Python Implementasjon av DFA i Python Naiv NFA-algoritme Smart NFA-algoritme Pythonimplementasjon av smart NFA 1. februar 2016 2

DFA Hva har vi lært? Definisjon av deterministiske endelige tilstandsautomater Hvordan disse definerer et språk Hvordan vi kan konstruere en DFA for komplementet til et språk definert av en DFA Algoritme for anerkjenning med DFA går i linjær tid 1. februar 2016 3

NFA Hva har vi lært? Definisjon av ikkedeterministiske endelige tilstandsautomater (NFA) Hvordan disse definerer et språk Hvordan vi gitt en NFA kan konstruere en DFA for det samme språket 1. februar 2016 4

Regulære språk Følgende er ekvivalente: a) L kan beskrives med et regulært uttrykk. b) Det fins en NFA som anerkjenner L. c) Det fins en DFA som anerkjenner L. 1. Gjort ekvivalensen av (b) og (c). 2. Fra (a) til (b) forholdsvis greit å se. 3. Fra (b/c) til (a) er litt vanskeligere å vise Litt notasjon: Hvis R er et regulært uttrykk, er L(R) språket beskrevet av R. Hvis M er en FSA, så er L(M) språket anerkjent av M. 5

Lag automat for reg. uttrykk Eksempel: ((a c)*b(a c))* 6

2. Fra regulært uttrykk til NFA til til til JFLAP-algoritme litt annerledes: legger til flere ε-kanter 1. februar 2016 7

2. Fra regulært uttrykk til NFA Gitt et regulært uttrykk r Lag en automat N med to tilstander: starttilstand og en sluttilstand en kant fra start til slutt merket med r Omform kantene trinn for trinn som vist på forrige side Da vil L(N)=L(r) Observasjon: N vil være ikke-deterministisk med ε-kanter 1. februar 2016 8

3. Fra FSA til RE Hvorfor ikke bare reversere forrige algoritme? Kryssende løkker! 9

Legg til ny start og sluttilstand Fjern 1 og 1 tilstand 10

Ved fjerning av tilstand k: For alle tilstander i og j: new(i,j) := old(i,j) + old(i,k) old(k,k)*old(k,j) 11

Fra DFA til RE: 1. Lag: 1. Ny begynnertilstand med ε-kant til original begynnertilstand 2. Ny sluttilstand med ε-kant fra alle originale sluttilstander. (Dette er eneste sluttilstand.) 2. Omform alle til 3. Hvis det ikke går kant fra tilstand i til tilstand k, så er det det samme som en kant merket med Ø. 4. Fjern i tur og orden alle indre tilstander. Ved fjerning av tilstand k: For alle gjenværende tilstander i og j: new(i,j) := old(i,j) + old(i,k) old(k,k)* old(k,j) Ikke nødvendig å kunne konstruksjonen. Men vite at det er mulig! 12

Hva har vi lært? At DFA, NFA og regulære uttrykk definerer de samme språkene: de regulære språkene Hvordan vi gitt et regulært uttrykk kan konstruere en NFA for samme språk, og deretter en DFA for språket (Kjennskap til hvordan en DFA kan omformes til et regulært uttrykk, men ikke forventet å gjøre dette.) 1. februar 2016 13

I dag Automater og regulære uttrykk Litt Python Implementasjon av DFA i Python Naiv NFA-algoritme Smart NFA-algoritme Pythonimplementasjon av smart NFA 3. februar 2016 14

Python Gode strukturer for tekst: Strenger Lister Read-eval-print-loop Lesbar, strukturert kode: Kompakt, nesten pseudokode Gir gode programmeringsvaner Lett å lære Objektorientert Mye brukt: tilgjengelig, bibliotek, grensesnitt Nyttig senere i livet: scripting 1. februar 2016 15

Vi antar at alle nå kan (Fra et eller annet p.språk) Variable og verdier Tilordninger og andre kommandoer Booleske tester If-uttrykk While-løkker For-løkker Funksjoner (sub-rutiner) And how to do it in Python a, bcd, alpha114 5, 5.0, abc,. a = 5, a = a+5 print(a) [python 2 også >>>print a] a == b, a >=b,.. if a == b: c = c+2 while for def f(x): 16

Python syntaks 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 Python bruker indent som blokkavgrenser: Andre språk: begin-end, ( ) Hva tror du blir resultatet av kallene f(8) g(8) 17

Python datatyper integer float string: Hello world lister: [3, 4, 5] [ Hello, world ] [3, 4, c] Aksesseres med indekser mutable >>> a = "Hello world" >>> a 'Hello world' >>> len(a) 11 >>> a[0] 'H' >>> a[-1] 'd' >>> b = a[3:7] >>> b 'lo w' >>> type(b) <type 'str'> 18

Python er objektorientert Alt er objekter Som har sine metoder Eksempler med strenger: Hello world,.split() world,.strip(, ) Vi skal ikke bruke dette mye i egen kode Men vi vil se mange innebygde klasser i NLTK 20

I dag Automater og regulære uttrykk Litt Python Implementasjon av DFA i Python Naiv NFA-algoritme Smart NFA-algoritme Pythonimplementasjon av smart NFA 1. februar 2016 21

DFA i Python def drec(tape, dfa): index = 0 state = dfa.start while True: if index == len(tape): if state in dfa.finals: return "accept" else: return "reject" elif not (state, tape[index]) in \ dfa.edge.keys(): return "reject" else: state = dfa.edge[(state,tape[index])] index += 1 Jurafsky & Martin, fig. 2.13 22

DFA i Python datastruktur 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 def drec(tape, dfa): index = 0 state = dfa.start while True: if index == len(tape): if state in dfa.finals: return "accept" else: return "reject" elif not (state, tape[index]) in \ dfa.edge.keys(): return "reject" else: state = dfa.edge[(state,tape[index])] index += 1 23

DFA i Python datastruktur class DFA: def init (self): self.edge = {} self.finals = [] f = DFA() Forenklet struktur f.start Bedre = 0 praksis f.finals.append(4) Lag rutiner i klassen for å konstruere objekt f.edge[(0,'b')] Beskytt objektenes = 1 indre f.edge[(1,'a')] Legg anerkjenning = 2 som en metode I klassen f.edge[(2,'a')] = 3 f.edge[(3,'a')] = 3 f.edge[(3,'!')] = 4 def drec(tape, dfa): index = 0 state = dfa.start while True: if index == len(tape): if state in dfa.finals: return "accept" else: return "reject" elif not (state, tape[index]) in \ dfa.edge.keys(): return "reject" else: state = dfa.edge[(state,tape[index])] index += 1 24

I dag Automater og regulære uttrykk Litt Python Implementasjon av DFA i Python Naiv NFA-algoritme Smart NFA-algoritme Pythonimplementasjon av smart NFA 3. februar 2016 25

Søkerom 26

Breddeførst søk JFLAP 27

Dybdeførst søk m/ Backtracking 28

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! 29

Jurafsky og Martins algoritme Bruker løkke+agenda Vår nfa_naive_recog.py Bruker rekursjon, men samme: hovedstruktur tidsforbruk 30

I dag Automater og regulære uttrykk Litt Python Implementasjon av DFA i Python Naiv NFA-algoritme Smart NFA-algoritme Pythonimplementasjon av smart NFA 3. februar 2016 31

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 Q n ={q1,, qk} La ny konfigurasjon være w n+1 = w Q n+1 =E(δN(q1,s) δn(q2,s) δn(qk,s)) Akseptering Konfigurasjonen w n = ε Q n ={q1,, qk} Aksepterer hvis minst en av q1,, qk er en sluttilstand. 32

I dag Automater og regulære uttrykk Litt Python Implementasjon av DFA i Python Naiv NFA-algoritme Smart NFA-algoritme Pythonimplementasjon av smart NFA 3. februar 2016 33

Smart NFA-anerkjenning i Python def drec(tape, dfa): index = 0 state = dfa.start while True: if index == len(tape): if state in dfa.finals: return "accept" else: return "reject" elif not (state, tape[index]) in \ dfa.edge.keys(): return "reject" else: state = dfa.edge[(state,tape[index])] index += 1 def nrec(tape, nfa): index = 0 states = [nfa.start] while True: if index == len(tape): successtates = [s for s in states if s in nfa.finals] return len(successtates)> 0 elif len(states) == 0: return False else: states = set([e[2] for e in nfa.edges if e[0] in states and tape[index] == e[1] ]) index += 1 DFA NFA 34

NFA datastruktur 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') def nrec(tape, nfa): index = 0 states = [nfa.start] while True: if index == len(tape): successtates = [s for s in states if s in nfa.finals] return len(successtates)> 0 elif len(states) == 0: return False else: states = set([e[2] for e in nfa.edges if e[0] in states and tape[index] == e[1] ]) index += 1 Så langt: NFA uten ε-transisjoner 35

Python: list comprehension successtates = [s for s in states if s in nfa.finals] { s states s nfa finals} success =. success = [] for s in states: if s in nfa.finals: success.append(e) 36

Python: list comprehension states = set([e[2] for e in nfa.edges if e[0] in states and tape[index] == e[1] ]) states = [] for e in nfa.edges: if e[0] in states and tape[index]==e[1]: states.append(e[2]) S { e[2] e E} = { e[ 2] e { e nfa. edges e[0] state e[1] tape[ index] } S = = 37

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 selv med epsilon transisjoner (hvis en passer på å bruke epsilontillukning) 38

Hva har vi lært: 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 39