Added content of section Diskussion and Slutsats
[ailab3.git] / rapport.tex
blob6bfa3cbc27686a98e70d9c4d47f9e17246358c05
1 \documentclass[a4paper, 12pt]{article}
2 \usepackage[swedish]{babel}
3 \usepackage[utf8]{inputenc}
4 \usepackage{verbatim}
5 \usepackage{fancyhdr}
6 \usepackage{graphicx}
7 \usepackage{parskip}
8 % Include pdf with multiple pages ex \includepdf[pages=-, nup=2x2]{filename.pdf}
9 \usepackage[final]{pdfpages}
10 % Place figures where they should be
11 \usepackage{float}
13 % vars
14 \def\title{Projekt}
15 \def\preTitle{Laboration 3: Information Retrieval \& Extraction}
16 \def\kurs{Artificiell Intelligens med inriktning mot kognition och
17 design B, ht 2008}
19 \def\namn{Anton Johansson}
20 \def\mail{dit06ajn@cs.umu.se}
21 \def\namnett{Victor Zamanian}
22 \def\mailett{dit06vzy@cs.umu.se}
24 \def\handledareEtt{Dennis Olsson, denniso@cs.umu.se}
25 \def\inst{datavetenskap}
26 \def\dokumentTyp{Laborationsrapport}
28 \begin{document}
29 \begin{titlepage}
30 \thispagestyle{empty}
31 \begin{small}
32 \begin{tabular}{@{}p{\textwidth}@{}}
33 UMEÅ UNIVERSITET \hfill \today \\
34 Institutionen för \inst \\
35 \dokumentTyp \\
36 \end{tabular}
37 \end{small}
38 \vspace{10mm}
39 \begin{center}
40 \LARGE{\preTitle} \\
41 \huge{\textbf{\kurs}} \\
42 \vspace{10mm}
43 \LARGE{\title} \\
44 \vspace{15mm}
45 \begin{large}
46 \namn, \mail \\
47 \namnett, \mailett
48 \end{large}
49 \vfill
50 \large{\textbf{Handledare}}\\
51 \mbox{\large{\handledareEtt}}
52 \end{center}
53 \end{titlepage}
55 \newpage
56 \thispagestyle{empty}
57 \mbox{}
58 \newpage
60 \pagestyle{fancy}
61 \rhead{\footnotesize{\today}}
62 \lhead{\footnotesize{\namn, \mail \\ \namnett, \mailett}}
63 \chead{}
64 \lfoot{}
65 \cfoot{}
66 \rfoot{}
68 \section*{Sammanfattning}
69 Reguljära uttryck (Regular Expressions) är uttryck som innehåller
70 olika syntax för att identifiera, eller ''matcha'', specifika
71 textsträngar ur en större mängd text. Det finns många olika
72 användningsområden för reguljära uttryck inom området Artificiell
73 Intelligens, till exempel att hämta data från dokument på Internet och
74 tolka det utifrån någon preferens; ''Sök (och ersätt)''-funktioner i
75 ordbehandlare och textredigerare; och tolkning och validering av data,
76 till exempel datum-, telefon-, och personnummerinmatning i
77 webbformulär.
79 \newpage
80 \tableofcontents
81 \newpage
83 \rfoot{\thepage}
84 \pagenumbering{arabic}
86 % TODO @anton - Problem-solving as search, basic to AI, Norvig.
88 \section{Introduktion}
89 % till ämnet.
90 Denna rapport går igenom användandet av Reguljära uttryck (Regular
91 Expressions på engelska, även förkortat som ''regexp'' eller bara
92 ''regex'') med avseende på informationshämtning inom området
93 Artificiell Intelligens.
95 Rapporten är formulerad och utförd enligt specifikation på sidan:\\
96 \begin{footnotesize}
97 \verb!http://www.cs.umu.se/kurser/5DV063/HT08/assignments/lab3-spes-ht08.html!
98 \end{footnotesize}
100 \section{Syfte}
101 % med uppgiften, beskrivet med egna ord.
102 Syftet med rapporten är att fördjupa sig inom ett smalt ämne inom
103 området Artificiell Intelligens och presentera teori för det valda
104 ämnet på ett vetenskapligt sätt.
106 \section{Metodbeskrivning}
107 %: beskrivning av metod, material, design och procedur
108 Denna rapport är sammanställd främst genom en litteraturstudie inom
109 området Artificiell Intelligens i förhållande till Reguljära uttryck.
110 Information och tankar är samlade från böcker och internetsidor, för
111 att försöka få en överblick över de Reguljära uttryckens betydelse och
112 användande inom området.
114 \section{Litteraturstudie}
115 %, teoretisk fördjupning
116 Enligt \cite{speech} härstammar Reguljära uttryck från Alan Turings
117 modell (1936) för aritmetisk beräkning, även kallad
118 Turingmaskin. Denna maskin var abstrakt, ett tankeexperiment, för att
119 utföra beräkningar.
120 % TODO Church-Turings hypotes säger att varje tänkbar process kan
121 % utföras av en Turingmaskin, och alltså finns det rent principiellt
122 % inte någon mer kraftfull beräkningsmekanism. Enligt wikipedia
123 % http://sv.wikipedia.org/wiki/Turingmaskin
125 Inspirerad av Turings arbete skapade sedan Warren McCulloch och Walter
126 Pitts (1943) en förenklad modell för neuronen, se \cite{norvig}
127 kapitel 18.
129 Stephen Cole Kleene definierade sedan (1951 och 1956) Ändlig
130 automation (Finite automation), Reguljära uttryck och påvisade deras
131 likhet.
133 Både Reguljära uttryck och Finite automation är en del av den språktyp
134 som brukar kallas Reguljära språk, (Regular Language).
136 I \cite{speech} ger man ett exempel på hur Finite automation och
137 Reguljära uttryck förhåller sig till varandra. Säg att man ska
138 definiera ett naturligt språk, för enkelhets skull försöker vi
139 definiera vad som är ''ko-språk''. Vi kan säga att korrekt
140 ''ko-språk'' definieras av kombinationerna:
142 \begin{verbatim}
143 Muu!
144 Muuu!
145 Muuuu!
147 \end{verbatim}
149 Detta skulle kunna beskrivas med en modell för \textbf{Finite-state
150 automation} enligt figur nedan.
152 \begin{figure}[H]
153 \begin{center}
154 \includegraphics[width=110mm]{images/state.pdf}
155 \caption{Ändlig automation för ''ko-språk''}
156 \label{state.pdf}
157 \end{center}
158 \end{figure}
160 Tillstånden \verb!q0-q4! är de giltiga tillstånd som finns, \verb!q1!
161 är starttillståndet och \verb!q4! representerar sluttillstånd. Pilarna
162 i figuren markerar möjliga förflyttningar mellan tillstånden.
164 Denna information går även att representera som en
165 \textbf{State-transition-tabell}, se nedan:
167 \begin{center}\label{stt}
168 \begin{tabular}{|c|l|l|l|}
169 \hline
170 & \multicolumn{3}{|c|}{Indata} \\
171 \hline
172 Tillstånd & M & u & ! \\
173 \hline
174 0 & 1 & 0 & 0 \\
175 1 & 0 & 2 & 0 \\
176 2 & 0 & 3 & 0 \\
177 3 & 0 & 3 & 4 \\
178 4 & 0 & 0 & 0 \\
179 \hline
180 \end{tabular}
181 \end{center}
183 Ovanstående tabell läses uppifrån och ner. Starttillståndet \verb!0!
184 har en giltig förflyttning till tillstånd \verb!1!, detta gäller
185 enbart för indata \verb!M!, för alla andra indata finns inga giltiga
186 förflyttningar, detta markeras med \verb!0!.
188 Det korresponderande \textbf{Reguljära uttrycket} för att beskriva
189 ''ko-språk'' skulle vara:
191 \begin{verbatim}
192 Muu+!
193 \end{verbatim}
195 Man läser det ungefär som man läser vanlig text. \verb!M! är tillåtet
196 starttillstånd, följt av ett \verb!u!, sedan markerar operatorn
197 \verb!u+! att en eller flera \verb!u! är tillåtna. Meningen avslutas
198 med \verb?!?, vilket markerar sluttillståndet. % Se sektion TODO för
199 mer info om regexp syntax.
201 % REGEXP-MANUAL:
202 % Står på sidan 848 i Norvig.
204 Ett reguljärt uttryck består enkelt nog av text som ska matchas. Om
205 man vill matcha texten ''hej'' i en textsträng ''hoppsanhejsan'' så
206 blir det reguljära uttrycket helt enkelt bara ''hej'' och ''hej'':et i
207 ''hoppsanhejsan'' matchas. Däremot är det mer sällan man använder
208 reguljära uttryck för sådana enkla matchningar. Man vill i stället
209 använda dem till att matcha \textbf{generella mönster}. Ett exempel på
210 ett mönster skulle kunna vara en e-postadress på formen
211 \verb!<användarnamn>@<subdomän>.<domän>!, där \verb!<användarnamn>!
212 kan innehålla (i detta exempel) alla siffror, alla små och stora
213 bokstäver (från A till Z), understreck, punkt, procenttecken,
214 bindestreck och plus.
216 I stället för att behöva skriva ett textmönster för varje e-postadress
217 som är möjlig att konstruera (i praktiken oräkneligt antal
218 variationer) kan man använda sig av speciella ''texthändelser'' för
219 att beskriva till exempel början\slash slutet av ett ord och
220 början\slash slutet av en hel sträng. Man kan också definiera
221 teckenklasser som man vill inkludera i sitt uttryck, till exempel alla
222 stora bokstäver, alla små bokstäver, siffror, eller till och med
223 vilken godtycklig kombination av tecken som helst. Här nedanför visas
224 en kort tabell med några texthändelser och deras motsvarande reguljära
225 uttryck.
227 \begin{center}
228 \begin{footnotesize}
229 \begin{tabular}{|c|p{4cm}|l|l|l|}
230 \hline
231 \textbf{regex-uttryck} & \textbf{Texthändelse} & \textbf{Exempel} & \textbf{Matchar} \\ \hline
233 \verb!\b! & Början eller slutet på ett ord & \verb!\b!text\verb!\b! & ''ord1 \textbf{text} ord3'' \\ \hline
235 \verb!^! & Början av en textsträng & \verb!^!text & ''\textbf{text} i början'' \\ \hline
237 \verb!$! & Slutet av en textsträng & \verb!lutet$! & ''text i s\textbf{lutet}'' \\ \hline
239 \verb![A-Za-z0-9]! & Definierar klass med tecknen A till Z, a
240 till z och 0 till 9. & \verb![abc0-9]! & ''\textbf{b}r\textbf{a} text med \textbf{23} te\textbf{c}ken'' \\
242 \hline
244 \verb!.! (punkt) & Står för vilket tecken som helst. & \verb!^.! & ''\textbf{t}ext'' \\ \hline
245 \end{tabular}
246 \end{footnotesize}
247 \end{center}
249 Om man vill matcha en e-postadress i löpande text skulle man alltså
250 vilja använda sig av \verb!\b! runt uttrycket för att markera att det
251 som finns runt omkring adressen måste vara ordavgränsare av något
252 slag, dvs. någon typ av blanktecken. Vill man däremot kontrollera
253 indata från till exempel ett formulärfält där det är meningen att en
254 användare ska ange enbart en e-postadress är det däremot önskvärt att
255 omsluta uttrycket med \verb!^! i början och \verb!$! i slutet för att
256 markera att hela strängen måste \textbf{börja och sluta med} adressen.
258 Låt oss definiera en teckenklass med alla siffror, dvs
259 ''\verb![0-9]!'' och använda det i ett reguljärt uttryck, till exempel
260 ''\verb!\b$[0-9]!''. Om vi sedan försöker matcha strängen ''\$10000''
261 med det mönstret kommer vi endast matcha följande (fet stil)
262 ''\textbf{\$1}0000''. Detta beror på att teckenklassen vi definierat
263 matchar bara \textit{det första} tecknet som platsar i
264 klassen. Självklart skulle vi vilja kunna matcha flera tecken i en och
265 samma teckenklass utan att behöva definiera en likadan klass för hela
266 det antalet tecken vi vill matcha. Därför har man definierat något som
267 kallas kvantifierare som gör att man kan bestämma hur många gånger man
268 vill matcha en specifik klass, ett mönster eller bara ett tecken (så
269 kallade ''tokens''). Nedanstående tabell beskriver olika
270 kvantifierare.
272 \begin{center}
273 \begin{footnotesize}
274 \begin{tabular}{|c|p{4cm}|l|p{4cm}|}
275 \hline
276 \textbf{kvantifierare} & \textbf{Beskrivning} & \textbf{Exempel} & \textbf{Matchar} \\ \hline
278 \verb!?! & Matchar föregående uttryck noll eller en gång. &
279 colou\verb!?!r & ''\textbf{colour}'' och ''\textbf{color}'' \\ \hline
281 \verb!+! & Matchar föregående uttryck en eller fler gånger. &
282 Mu\verb:+:! & ''\textbf{Mu!}'', ''\textbf{Muu!}'',
283 ''\textbf{Muuu!}'', \ldots \\ \hline
285 \verb!*! & Matchar föregående uttryck noll eller flera gånger &
286 10\verb!*! & ''\textbf{1}'', ''\textbf{10}'', ''\textbf{100}'',
287 \ldots \\ \hline
289 \verb!{!$n$\verb!,!$m$\verb!}! & Matchar föregående uttryck
290 minst $n$ gånger och som mest $m$ gånger. &
291 \verb!^!1\verb![!0\verb!]{!1,5\verb!}! & ''\textbf{10}'',
292 ''\textbf{100}'', ''\textbf{1000}'', ''\textbf{10000}'' och
293 ''\textbf{100000}'' men inte ''1'' och inte ''1000000'' (6
294 nollor eller mer).\\ \hline
295 \end{tabular}
296 \end{footnotesize}
297 \end{center}
299 Nu kan vi beskriva många olika variationer av mönster genom olika
300 texthändelser och kvantifierare, men vad händer om man vill inkludera
301 till exempel ett frågetecken i sitt mönster? Då måste man ''komma
302 runt'' (escape) frågetecknets regexp-betydelse för att komma åt dess
303 textuella värde. Detta görs vanligtvis med bakåtvänt snedstreck
304 (\textbackslash). Till exempel måste vi i vårt e-post\-adress\-mönster
305 matcha en punkt (i domännamnet), som vi måste uttrycka som
306 ''\verb!\.!''.
308 Nu har vi tillräckligt stor kunskap för att uttrycka ett reguljärt
309 uttryck som matchar en generell e-post\-adress. Vi börjar med att
310 beskriva \verb!<användarnamn>!. Användarnamnet kunde som sagt var
311 innehålla små och stora bokstäver (från A till Z), siffror, punkt,
312 understreck, procenttecken, plustecken och bindestreck. Vi uttrycker
313 detta som
315 \begin{verbatim}
316 \b[A-Za-z0-9._%+-]+
317 \end{verbatim}
319 där det sista plustecknet som sagt innebär att alla de tecken som den
320 definierade tecken\-klassen innefattar måste matchas minst en
321 gång. Plustecknet inom tecken\-klass\-definitionen tolkas som ett
322 ''textplus'' och inte som ett ''regex-plus''. Vi lägger också till
323 ordavgränsare som gör att uttrycket bara matchar användarnamnet i
324 början av ett nytt ord (dvs. själva e-post\-adressen) och inte matchar
325 ett användarnamn när det kommer direkt efter ett icke tillåtet
326 användarnamnstecken. Hade vi glömt ordavgränsaren hade följade
327 användarnamn matchats:
328 \\ ''\copyright\&\texttrademark\textexclamdown\textbf{sven.svensson}@host.doman''
329 vilket vi inte vill eftersom de icke tillåtna tecknen inte bör finnas
330 före användarnamnet.
332 Vi uttrycker sedan domännamnet som
334 \begin{verbatim}
335 [A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b
336 \end{verbatim}
338 där plustecknet betyder precis samma sak som i uttrycket för
339 användarnamnet och ''\verb!\.!'' står för punktens textuella
340 värde. Sedan finns det ett krav på det som står efter punkten i
341 domännamnet, nämligen att denna ''token'' måste bestå av minst 2 och
342 som mest 4 tecken, därav kvantifieraren \verb!{!2\verb!,!4\verb!}!.
343 \verb!\b! i slutet av uttrycket innebär att det måste finnas en
344 ordavgränsare efter domännamnet.
346 Sätter vi nu samman dessa uttryck med ett snabel-a i mitten får vi ett
347 uttryck för en generell e-post\-adress \textbf{i löptext}. Vill vi
348 definiera ett uttryck för att undersöka om totala textmängden består
349 av endast en e-post\-adress kan vi ersätta \verb!\b! i början med
350 \verb!^! och i slutet med \verb!$! (till exempel om vi vill
351 kontrollera ett formulärfält på en webbsida)
352 \cite{regexinfo:website}. De två olika uttrycken ser ut som följer:
354 \begin{verbatim}
355 \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b
356 \end{verbatim}
360 \begin{verbatim}
361 ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$
362 \end{verbatim}
364 % Olika sätt att matcha e-mail adresser.
365 % \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b
366 % ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$
367 % http://www.regular-expressions.info/email.html
369 \section{Resultat}
370 % innehållande sammanställning/analys av eventuell testdata,
371 % implementering av algoritmer osv.
373 % TODO - resultat, användningsområden kopplade till AI.
374 % TODO @anton - Kolla upp och skriv om ELIZA, regexp memory.
375 \subsection{Applikationer av Reguljära uttryck}
376 Följande sektioner berör olika användningsområden för Reguljära
377 uttryck inom Artificiell intelligens.
379 \subsubsection{ELIZA}
380 Mer avancerade former av Reguljära uttryck kan använda sig av
381 minnesfunktioner för att spara tidigare matchningar. I
382 programmeringssråket Perl kan man göra ersättningar på formen:
383 \begin{verbatim}
384 s/hej/hejsan/
385 \end{verbatim}
387 Här ersätts alla \verb!hej! med \verb!hejsan!. För att spara träffar i
388 sökningen och ersätta med samma ord i ersättningssträngen använder man
389 grupper inom parenteser \verb!()!. Den sträng som en grupp matchar kan
390 sedan refereras till. \verb!\1!, till exempel, representerar
391 innehållet i första gruppen.
393 \begin{verbatim}
394 s/jag heter (\w+)/på dig \1, trevligt att höras/
395 \end{verbatim}
397 Ovanstående Reguljärt uttryck skulle ersätta ''Hej jag heter Anton''
398 med ''Hej på dig Anton, trevligt att höras''. Denna typ av Reguljära
399 ersättningar utgör grunden för implementationen av Chatroboten ELIZA,
400 som utvecklades av Joseph Weizenbaum, se \cite{speech}. Här följer en
401 kort konversation med Emacs implementering av ELIZA:
403 \begin{itemize}
404 \item[-] Hello my name is Anton
405 \item[-] \textbf{ELIZA:} How do you do? What brings you to see me?
406 \item[-] I need help with some Artificial Intelligence questions
407 \item[-] \textbf{ELIZA:} Why do you say you need help with some
408 artificial intelligence questions?
409 \item[-] I'm writing an essay about Regular Expressions
410 \item[-] \textbf{ELIZA:} Is it because of your plans that you say you
411 are writing an essay about regular expressions?
412 \item[-] yes
413 \item[-] \textbf{ELIZA:} I see... Well, what makes you believe this is so?
414 \end{itemize}
416 Ovanstående exempel vittar om att denna typ av chatrobot har en
417 relativt fast ram med frågor och svar att följa. Det tar inte lång tid
418 för en mänsklig användare att förstå att det inte är en mänsklig
419 motpart man kommunicerar med. ELIZA är implementerad för att svara på
420 frågor som rör psykoterapi--så fort man lämnar det bekanta ämnet blir
421 följdfrågorna ologiska ur ett mänskligt perspektiv.
423 Emacs implementation av ELIZA har en mängd hårdkodade svar. Följande
424 kodsnutt visar svaren som kan fås av indata som innehåller vissa
425 nyckelord gällade död:
427 \begin{footnotesize}
428 \begin{verbatim}
429 (setq deathlst
430 '((this is not a healthy way of thinking \.)
431 ((doc$ bother) you\, too\, may die someday \?)
432 (i am worried by your obsession with this topic!)
433 (did you watch a lot of crime and violence on television as a child \?))
435 \end{verbatim}
436 \end{footnotesize}
438 Även mängder med vanliga ord sparas för att på ett bättre sätt kunna
439 tolka indata, exempelvis vanliga synonymer, pronomen, verb och förkortningar:
441 \begin{footnotesize}
442 \begin{verbatim}
443 (setq replist
444 (wanna . (want to))
445 (gimme . (give me))
446 (gotta . (have to))
447 (gonna . (going to))
448 (never . (not ever))
449 ...)
450 \end{verbatim}
451 \end{footnotesize}
453 \subsubsection{Tolkning av indata}
454 Det finns en mängd användbara Reguljära uttryck för att tolka och på
455 ett vettigt sätt behandla indata som ett datorsystem får från
456 användare. Det kan gälla exempelvis verifiering av e-postadresser,
457 datum, person- och telefonnummer och så vidare. Detta är användbart
458 vid all typ av indata från användare, och i hög grad aktuellt när det
459 gäller forumlär på Internet.
461 Till exempel kan man istället för att kräva att användare ska skriva
462 för- och efternamn i separata rutor använda Reguljära uttryck för att
463 försöka tolka vad som är vad. Samma sak gäller adresser och
464 telefonnummer. Det kan vara intressant att ha information och ett
465 telefonnummers riktnummer och landskod, utan att för den sakens skull
466 kräva att en användare ska behöva specificera allt sådant manuellt.
467 Följer man bara vanliga konventioner för hur telefonnummer skrivs kan
468 man skapa ett Reguljärt uttryck för att fånga upp all denna
469 information ur en enda textsträng. All sådan här tolkning av indata är
470 väldigt bra ur användarsynpunkt, ''Don't make me click'', som Aza
471 Raskin \cite{raskin:website} säger i en presentation om
472 användarvänlighet på webbsidor.
474 %@TODO fixa url löpande
475 Ett annat bra exempel på hur Reguljära uttryck kan underlätta
476 inmatning av data finns implementerat i den webbaserade
477 kalendertjänsten från Google Inc.
478 (\begin{footnotesize}http://google.com/calendar/\end{footnotesize}).
479 För att skapa en ny händelse i kalendern kan användaren klicka på
480 aktuell dag och skriva till exempel ''Äta mat hos mamma kl
481 10-12''. Detta genererar en händelse med rubrik ''Äta mat hos mamma''
482 och placeras med start kl 10 och slut kl 12 i kalendern. Ett Reguljärt
483 uttryck för detta skulle kunna vara att matcha de första siffrorna
484 efter \verb!(kl|klockan)!, dessa borde vara starttimme för
485 händelsen. Följs dessa siffror av \verb!.! eller \verb!:! utan
486 mellanslag efter skulle nästa två siffror kunna representera minuter,
487 nästa siffror, eventuellt efter ett bindestreck, kan representera
488 sluttid. På detta sätt kan man med hjälp av Reguljära uttryck
489 representera naturligt språk för datorn. Vidare skulle extra nyckelord
490 kunna läggas in, till exempel \verb!hos!, \verb!på! eller \verb!i! för
491 att markera att det som följer är en plats, eller \verb!med! för att
492 markera att följande text innehåller information om deltagare i
493 händelsen.
495 \subsubsection{Datahämtning} \label{datah}
496 Reguljära uttryck kan användas för att hämta och tolka information ur
497 en större mängd data. Ett trivialt exempel är till exempel att försöka
498 svara på frågan, ''Vad är det för väder i Umeå idag?'' baserat på
499 innehållet från sidan:
501 \begin{verbatim}
502 http://www.tfe.umu.se/weather/1440/900/10/sv-SE/now.htm
503 \end{verbatim}
505 Html-taggen som visar den aktuella temperaturen i Umeå har följande
506 utseende:
507 \begin{verbatim}
508 <td class="tempfont" ... >0,7 &deg;C</td>
509 \end{verbatim}
511 Det som skiljer denna tagg från de andra på sidan är attributet
512 \verb!class="tempfont"!. Den aktuella temperaturen visas mellan
513 \verb!<td ...>! och \verb!</td>!, det innebär att det i detta exempel
514 skulle vara $0,7\,^{\circ}\mathrm{C}$ dagen sidan hämtades. Följande
515 Reguljära uttryck matchar den strängen som innehåller temperatur i sin
516 första grupp, dvs uttrycket inom \verb!()!, som senare kan refereras
517 till med \verb!\1!:
519 \begin{verbatim}
520 <td class="tempfont.+?>([0-9]+,[0-9]+)
521 \end{verbatim}
523 Med denna information kan man sedan förenkla och säga att bra väder
524 gäller för alla $temperaturer \geq 15$ och dåligt väder gäller för
525 $temperaturer < 15$. Detta Reguljära uttryck är mycket specifikt och
526 enbart användbart på denna specifika sida så länge temperaturen
527 inkapslas exakt av den HTML-taggen och eventuella attribut.
529 \section{Diskussion}
530 % av resultatet, koppling till tidigare studier.
531 Reguljära uttryck har visat sig vara ett mycket användbart verktyg vid
532 hämtning och tolkning av data ur text, dock kan det bli väldigt
533 beräkningstungt om man använder sig av de mer komplicerade former av
534 Reguljära uttryck där man sparar undan grupper av träffar i
535 minnet. Den simplaste formen av Reguljära uttryck har en komplexitet
536 på $O(n)$ där $n$ är antalet tecken i texten där ett mönster söks.
537 Dessa typer av Reguljära uttryck kan implementeras med en
538 ''State-transition-tabell'', se sid \pageref{stt}. Vid användande av
539 mer avancerade Reguljära uttryck kan körningstiden öka exponentiellt i
540 förhållande till textmängden som ska sökas igenom.
542 För analys av data i XML-format som i sektionen om Datahämtning
543 \textbf{\ref{datah}} finns lämpade metoder såsom XQuery, Expat och
544 SAX.
546 \section{Slutsats}
547 Reguljära uttryck har visat sig vara mycket användbara inom vitt
548 spridda användningsområden. Användningsområdena som tagits upp i denna
549 rapport är enbart ett litet urval av de omfattande möjligheter som
550 Reguljära uttryck erbjuder. Vare sig man har använder sig av Reguljära
551 uttryck för att manipulera text direkt i en textredigerare eller om
552 man bygger in uttrycken i olika typer av applikationer och system så
553 erbjuder de Reguljära uttrycken nästintill oändliga möjligheter för
554 analys av text.
556 %. Använd minst två referenser utöver kursboken.
557 \bibliographystyle{alpha}
558 \bibliography{books}
560 \end{document}