TDDD02 Föreläsning 2 HT-2013 Reguljära uttryck och reguljära språk Lars Ahrenberg
Översikt Reguljära uttryck sökproblem i texter definitioner och exempel UNIX-funktionen grep Reguljära transformationer textmodifieringar UNIX-funktionen sed Ändliga automater Lagring av lexikon och index
Enkla sökproblem i texter Hitta någon eller alla förekomster av ett givet ord Hitta alla böjningsformer av ett ord Hitta ord som har fler än tio bokstäver Hitta ordsekvenser som följer ett visst mönster, t.ex.... den hmp-a hmp-n Sekvens där varje ord börjar på stor bokstav
Reguljära uttryck Reguljära uttryck är ett sätt att definiera villkor på strängar. Den mängd av strängar som uppfyller villkoren från ett reguljärt uttryck kallas ett formellt språk eller dess denotation. Man säger också att uttrycket 'denoterar' mängden (eller språket).
Två besläktade användningar I matematiken (formell språkteori) definieras reguljära uttryck generellt. I programmeringsspråk definieras och implementeras reguljära uttryck på olika sätt och strängar = teckensträngar rikare syntax
Grundläggande begrepp En sträng är en sekvens av symboler en symbol kan i princip vara vad som helst MÄRK! den tomma strängen (ε) De tillåtna symbolerna för ett språk kallas alfabet (eller lexikon) Reguljära språk utgör en enkel klass av språk, som bl.a. definieras med reguljära uttryck
Reguljära språk Ändliga mängder är reguljära, Mängder som kan skapas med operationerna konkatenering, union (även kallat disjunktion), upprepad konkatenering är också reguljära, Dessa operationer är grundläggande i reguljära uttryck
Reguljära språk Operationer och deras beteckning Konkatenering (ingen särskild, uttrycken skrivs efter varandra) Disjunktion ' ' Upprepning (Kleenes stjärna) *
Exempel Vilka mängder definieras av ba* (1 2 3 4 5 6 7 8 9)(0 1 2 3 4 5 6 7 8 9)
Fler exempel Skriv med reguljära uttryck {bc, bca, bcaa, bcaaa, bcaaaa, } {ab, db, acb, dcb, accb, dccb, }
Regularitet i naturliga språk Morfologi t.ex. böjning med hjälp av suffix (katt bil stol...)(ar(na)? en)? Syntax t.ex. frasmönster utifrån ordklasser ART ADJ SUBST (en grön bil, ett stort hus, den vita stenen,...)
Reguljära uttryck i programspråk UNIX grep (flaggor) regexp filnamn returnerar textrader som matchar regexp sed 's/regexp/ändring/' < filnamn byter ut strängar som matchar regexp mot ändring Python modulen re
Textfiler En textfil är i princip en sträng av tecken hämtade från ett alfabet och kodade enligt en viss teckenkodning (ASCII eller ISO-8859-1, UTF-8, ) Några särskilda tecken: newline (\n) tab (\t) å, ä, ö m.fl. s.k. diakritiska tecken är ofta kodade på olika sätt i olika teckenkodningar
Teckenmängder i reguljära uttryck Mängd, eller disjunktion [aeioy]: matchar någon av de angivna vokalerna [a-z]: matchar godtycklig bokstav ur det engelska alfabetet. (- anger ordning i teckenkodningen) [0-9]: matchar godtycklig siffra Negation (^) [^a]: matchar allt utom a (och \newline)
Teckenmängder i reguljära uttryck Symboler för specifika mängder \w bokstavssymbol (engelska alfabetet) \d siffra, dvs samma som [0-9] \s, separatortecken inkl. blanktecken, \t och \n. matchar alla tecken (utom \newline)
Upprepningar Symboler för upprepningar * 0 eller flera upprepningar, + 1 eller flera upprepningar? 0 eller 1 upprepningar {n,m} minst n, max m upprepningar {n, } minst n upprepningar Räckvidden för en upprepning kan markeras med parenteser. Jämför ab+ och (ab)+
Disjunktionsoperator ( ) Om disjunktionen gäller strängar med fler än två symboler, eller godtyckliga reguljära uttryck kan ' ' användas. [stor liten] matchar endera av de två strängarna 'stor', 'liten' Jämför a+b+ [a+ b+]
Quote (\) Bokstäver och siffror matchar sig själva, liksom en del andra tecken, men tecken som står för operationer (?, *, +,, ) kan inte göra det. Då används quote ba? matchar b och ba ba\? matchar ba?
Villkor på matchning Uttryck matchar i regel girigt, dvs mot så långa strängar som möjligt, men kan annars varieras på olika sätt, t.ex. en eller max antal gånger per textrad, med eller utan överlappning Följande symboler ( ankare ) kan användas för att styra matchningen ^regex regex$ matchar bara i början på rad matchar bara i slutet på rad \bregex\b matchar mot ordsträngar
UNIX-funktionen grep grep ( global regular expression print ) Skriver ut rader som matchar ett givet reguljärt uttryck i en given textfil, dvs ett radfilter Exempel: > grep ' inte ' infil.txt Generellt: > grep <flaggor> '<regexp>' <filnamn>
Varianter av grep Olika implementeringar av grep skiljer sig åt i fråga om vilka flaggor och vilka varianter av reguljära uttryck de tillåter. Exempel: egrep ( extended ) ggrep (GNU grep på Solaris) ggrep -E (extended GNU grep på Solaris)
Mönster och matchningar med grep /bo/ /[Bb]o/ /\bbo/ /^[Bb]o/ /bor$/ /bo\.$/... Bosse bor i Mjölby. Bosse bor i Mjölby. Bosse bor i Mjölby. Bosse bor i Mjölby. Bosse bor i Mjölby. (ingen match) Bosse är mjölbybo.
Varianter av textmodifieringar Ta bort all uppmärkning, t.ex. HTML-taggar Ändra layout, skriva alla meningar på egen rad, skriva alla ord på egen rad Tokenisering och normaliseringar byta ut stora bokstäver mot små, skilja på skiljetecken och ord, Markera intressanta ord och fraser egennamn, substantiv, sifferuttryck,...
Exempel: HTML-fil <p><strong>en enkelbiljett till Berlin, gratis lägenhet i ett år och en cykel.<br /> Det är vad det stora flygbolaget lockar alla svenska Berlinälskare med.<br /> Men det finns en hake: Du måste byta namn till Klaus-Heidi.<br /> Jag skickade in ansökan om att byta namn direkt, säger Klaus- Heidi Nilsson.</strong></p>
Exempel: HTML-fil <p><strong>en enkelbiljett till Berlin, gratis lägenhet i ett år och en cykel.<br /> Det är vad det stora flygbolaget lockar alla svenska Berlinälskare med.<br /> Men det finns en hake: Du måste byta namn till Klaus-Heidi.<br /> Jag skickade in ansökan om att byta namn direkt, säger Klaus- Heidi Nilsson.</strong></p>
Efter filtrering av formatering En enkelbiljett till Berlin, gratis lägenhet i ett år och en cykel. Det är vad det stora flygbolaget lockar alla svenska Berlinälskare med. Men det finns en hake: Du måste byta namn till Klaus-Heidi. Jag skickade in ansökan om att byta namn direkt, säger Klaus-Heidi Nilsson.
Skiljeteckenseparering En enkelbiljett till Berlin, gratis lägenhet i ett år och en cykel. Det är vad det stora flygbolaget lockar alla svenska Berlinälskare med. Men det finns en hake: Du måste byta namn till Klaus-Heidi. Jag skickade in ansökan om att byta namn direkt, säger Klaus-Heidi Nilsson.
Skiljeteckenseparering En enkelbiljett till Berlin, gratis lägenhet i ett år och en cykel. Det är vad det stora flygbolaget lockar alla svenska Berlinälskare med. Men det finns en hake : Du måste byta namn till Klaus-Heidi. Jag skickade in ansökan om att byta namn direkt, säger Klaus-Heidi Nilsson.
Skiftlägesneutralisering ( lowercasing ) En enkelbiljett till Berlin, gratis lägenhet i ett år och en cykel. Det är vad det stora flygbolaget lockar alla svenska Berlinälskare med. Men det finns en hake : Du måste byta namn till Klaus-Heidi. Jag skickade in ansökan om att byta namn direkt, säger Klaus-Heidi Nilsson.
Efter skiftlägesneutralisering en enkelbiljett till berlin, gratis lägenhet i ett år och en cykel. det är vad det stora flygbolaget lockar alla svenska berlinälskare med. men det finns en hake : du måste byta namn till klaus-heidi. jag skickade in ansökan om att byta namn direkt, säger klaus-heidi nilsson.
Ändra layout (t.ex. en mening per rad) en enkelbiljett till berlin, gratis lägenhet i ett år och en cykel. det är vad det stora flygbolaget lockar alla svenska berlinälskare med. men det finns en hake : du måste byta namn till klaus-heidi. jag skickade in ansökan om att byta namn direkt, säger klaus-heidi nilsson.
Ny layout en enkelbiljett till berlin, gratis lägenhet i ett år och en cykel. det är vad det stora flygbolaget lockar alla svenska berlinälskare med. men det finns en hake : du måste byta namn till klausheidi. jag skickade in ansökan om att byta namn direkt, säger klaus-heidi nilsson.
Textmodifiering med reguljära uttryck Textmodifieringar av olika slag kan ses som substitutioner: Filtrera = ersätta med tomma strängen, Ändra = ersätta med alternativ sträng, Markera = lägga till någon slags tagg i angiven position Skapa nya rader = lägga till \newline Vanlig syntax: s/<regexp>/<newexp>/;
UNIX-funktionen sed sed ( stream editor ) Utför angivna substitutioner på rader i en fil Exempel: > sed 's/e/a/' infil.txt Generellt: > sed <flaggor> '<substitutioner>' <textfil>
Substitioner med sed Argument till sed är en substitution och en text eller textfil. Exempel: >echo 'Hello world!' sed 's/o/a/' Hella world! >echo 'Hello world!' sed 's/o/a/g' Hella warld! >echo 'Hello world!' sed '[A-z][a-z]*/X/g' X X! g för 'global'
Substitioner med bakåtreferenser sed går utöver regexpar genom att ge möjlighet till bakåtreferenser: \(r\) sparar den specifika sträng som matchar r \1, \2, hämtar sparade värden Exempel: >echo 'Hello world!' sed 's/\([a-zåäö]\)\([,\!\.]\)/\1 \2/g' Hello world!
sed med filargument sed med filanrop Hämtar substitutionerna från en separat fil s/[eioyuåäö]/a/g; s/a+/a/g; subst.sed Exempel: > sed -f subst.sed < infil.txt
Ändliga automater En ändlig automat (Finite-State Automaton) definieras av ett alfabet en uppsättning tillstånd, varav ett eller flera utgör starttillstånd och sluttillstånd en uppsättning tillståndsövergångar som var och en är associerad med en symbol ur alfabetet (ev. nollsymbolen)
Igenkänning och generering En sträng kan kännas igen (eller läsas) av en automat om man, med början i ett starttillstånd, kan nå ett sluttillstånd genom att matcha en symbol i taget mot en tillståndsövergång. Omvänt, kan en automat generera en sträng genom att den traverseras från ett starttillstånd till ett sluttillstånd och skriver ut en symbol för varje tillståndsövergång som görs.
Två sätt att definiera strängmängder Reguljärt uttryck Automat ba+ b a a 1 2 3
Reguljära språk Ett språk som kan definieras av ett reguljärt uttryck kan också definieras av en ändlig automat, och omvänt. Utmärkande för reguljära språk är att de inte tillåter icke-lokala beroenden mellan olika delar av en sträng. ('minnet' är begränsat till det senaste tillståndet.) Exempel: språket a n b m är reguljärt. språket a n b n = {ab,aabb,aaabbb, } är icke-reguljärt.
Determinism En ändlig automat är deterministisk om det för varje par av tillstånd och symbol finns högst en övergång till ett annat tillstånd. Deterministiska automater ger effektiva igenkännare. Motsatsen kallas icke-deterministisk Teorem: Varje icke-deterministisk ändlig automat kan konverteras till en deterministisk automat.
En icke-deterministisk automat a b 4 b a 1 a 2 b 3 a 5 a L = { a, aa, aba, abba, abbba, abbbba,... }
En ordlista eller ett index kan lagras som en deterministisk automat (ett bokstavsträd) c k a a b i l d c
Fullformslexikon back backa... bi bil bilar bilarna bild bilder bilderna...
Problem med fullformslexikon Duplicering av morfem och information (icke-kompakt) Hanterar inte lexikonets dynamik böjning, avledningar, sammansättningar Visar inte ordens morfologiska struktur Morfologisk parsning = dela upp ett ord i sina morfem (ordled) och ev. egenskaper
Lemmatisering och morfologisk klassificering Textord Information, exempel bilen bil N_sing_best bilar bil N_plur_obest bila V_pres bilder bild N_plur_obest billiga billig A_plur_obest billig A_best...
En automat med information i sluttillstånden 0, N_plur_obest Stam ar 1 2 3 en -2, N_plur_obest 5-2: 'remove last 2 characters Stam: bil, stol, hund, Textord matchas mot automaten -2, N_sing_best