Perceptron som ordklasstaggare: ett fördjupningsarbete i 729G43 -Artificiell Intelligens Niklas Blomstrand Linköpings Universitet
Inledning Att veta vilken ordklass ett ord tillhör är en viktig del i bearbetning utav språklig data eftersom ett ords ordklass innehåller mycket information, dels om själva ordet men även om dess grannar. Det är till exempel viktigt att inom röstigenkänning veta ett ords ordklass eftersom det kan påverka dess uttal, till exempel mört (substantiv) och mört (adjektiv) eller kort (substantiv) och kort (adjektiv). Ordklasstaggning är också viktigt för språkforskningen för att till exempel hitta vanliga eller mindre vanliga språkliga konstruktioner (Jurafsky & Martin, 2009). För att kunna sätta rätt ordklass till stora mängder ord snabbt och mer eller mindre korrekt används ofta datorprogram och algoritmer som är speciellt utformade för detta. På grund av de många tvetydigheter som finns när det gäller att korrekt sätta ordklass på ett ord är det svårt att skriva ett program med tydliga regler för hur ordklasstaggningen skall gå till. Därför används ofta program som analyserar stora mängder korrekt taggade ord och på så vis lär sig vilka ord som tillhör vilken ordklass. När analysen är klar kan man använda programmet för att sätta ordklasser på nya, otaggade ord. Denna process är ett exempel på maskininlärning och i denna rapport beskrivs hur perceptronen, en typ av algoritm inom maskininlärning, kan användas för att bestämma vilken ordklass ett visst ord tillhör. Rapporten går först igenom vad maskininlärning och ordklasstaggning är samt hur en grundläggande perceptron fungerar. Efter följer hur denna perceptron kan användas för ordklasstaggning samt vilka ändringar som behöver göras från den grundläggande modellen för att detta skall fungera. Syfte Syftet med arbetet var skapa en ordklasstaggare för svenska samt att få en djupare kunskap om hur en perceptron fungerar och kan modelleras för detta syfte. Teori Maskininlärning Daume (2015) skriver att på den mest grundläggande nivån handlar maskininlärning om att förutse framtiden baserat på vad som hänt tidigare. Det kan till exempel gälla att förutse hur mycket någon gillar en bok baserat på hur de betygsatt böcker de redan läst. Oavsett vad det gäller så är grundprincipen att göra informerade gissningar om en okänd egenskap hos ett objekt baserat på observerade egenskaper hos det objektet (Daume, 2015). 1
Maskininlärning kan delas in i tre huvudsakliga kategorier, övervakad inlärning, oövervakad inlärning och förstärkt inlärning (Russel & Norvig, 2010). Perceptronen, den algortim som studerats, faller inom kategorin övervakad inlärning och därför förklaras inte de andra. Övervakad inlärning innebär att programmet blir matad med exempel på indata och utdata och programmets uppgift är att lära sig sambandet mellan dessa för att kunna förutse utdata från ny indata (Russel & Norvig, 2010). Man kan se det som att man får en tabell med data och utifrån värdena i de olika kolumnerna skall man predicera ett okänt värde i den sista kolumnen (Honnibal, 2013). De exempel programmet observerar kallas ofta för träningsmängd eller träningsdata. Hur vet man då om ett program lärt sig något? Russel och Norvig (2010) skriver att ett program som förbättrar sin prestanda på framtida uppgifter med hjälp av dessa observationer har lärt sig något. Men det gäller att vi ger programmet rätt uppgifter, inom maskininlärning vill man få fram ett program eller en algoritm som är bra på att generalisera. Programmet skall observera specifika exempel och sedan användas på nya data som är relaterade till träningsmängden (Daume, 2015). För att illustrera vad detta innebär använder Daume ett exempel. Låt säga att vi har exempelprogrammet ovan som förutser hur mycket någon gillar en bok beroende på hur de betygsatt tidigare böcker. Om vi skulle be programmet förutse betyget för en film istället skulle det antagligen ge ett felaktigt svar eftersom programmet inte har någon erfarenhet om filmer, uppgiften är alltså inte relaterat till träningsmängden och programmets prestanda blir inte representativt av dess inlärning. Skulle vi istället fråga om en bok som vi redan har gett ett bra betyg förväntar vi oss att programmet också ger den ett högt betyg men detta visar inte på någon form av inlärning eller generalisering, endast återkallning av tidigare kunskap (Daume, 2015). Det finns olika typer av problem som kan lösas med maskininlärning och de har delats in efter vad det är de försöker förutse, de är klassifikation, regression och rankning (Daume, 2015). Problemet som löses här är att sätta rätt ordklass på rätt ord och detta faller inom kategorin klassifikation, alltså att förutse något som tillhör en ändlig mängd av värden (ordklasserna). Ordklasstaggning Ett program eller en algoritm som utför ordklasstaggning blir matad med strängar utav ord och målet är att bestämma vilken ordklass varje ord skall ha. Detta är ofta inte helt enkelt eftersom många ord kan tillhöra fler än en ordklass, till exempel får som kan var både substantiv och verb. Vilken ordklass ett ord tillhör bestäms dels av ordet självt men påverkas även av vilka ordklasser orden före i meningen har (Jurafsky & Martin, 2009). Ett exempel på 2
detta som tas upp av Jurafsky och Martin (2009) är skillnaden mellan possessiva och personliga pronomen, efter ett possessivt pronomen är det stor chans att nästa ord är ett substantiv och efter ett personligt följer ofta verb. I meningen Jag får en katt imorgon. kan man därför använda sig av kunskapen att Jag är ett personligt pronomen och sluta sig till att får därför är ett verb snarare än substantiv. Jurafsky och Martin (2009) skriver att de flesta algoritmer som utför ordklasstaggning kan delas in i en av två kategorier, regelbaserade eller stokastiska. Vidare skriver de att regelbaserade taggare ofta innehåller en databas med handskrivna regler som specificerar vilka ordklasser som är tillåtna att följa varandra. De stokastiska taggarna försöker istället lösa problemet genom att använda en corpus (stor samling text) med träningsdata och sedan räkna ut sannolikheten för att ett givet ord i en given kontext tillhör en viss ordklass (Jurafsky & Martin, 2009). Den algoritm som undersöks här är en typ av stokastisk taggare på så vis att den använder en corpus för träning och taggar ett ord givet dess kontext men den ger ingen sannolikhet för att ordklassen den satt är korrekt. Algoritmen baseras på Perceptronen som presenterades av Frank Rosenblatt 1962 (Bishop, 2006). I följande avsnitt beskrivs dess generella principer och följs sedan upp med hur den kan användas för ordklasstaggning. Perceptronen Perceptronen är en algoritm inom maskininlärning som är skapad med inspiration från hjärnans neuroner (Picton, 1994). Den får ett antal indata (x1, x2, xn) som är kopplade till en vikt (w1,w2, wn). Perceptronen beräknar den viktade summan z av dess indata (z = n i=0 x i w i ), där n är antalet indata. Summan körs genom en aktiveringsfunktion y för att beräkna algoritmens utvärde. Aktiveringsfunktionen jämför summan z mot ett tröskelvärde och ger utvärde 1 om z >= 1 och 0 annars (Russel & Norvig, 2010). Beräkningen illustreras i tabell 1 nedan för tre olika datapunkter, a, b och c. Tröskelvärdet som används för att beräkna utvärdet är 0. indata vikter summa per data och vikt summa utvärde x 0 x 1 x 2 w 0 w 1 w 2 c 0 c 1 c 2 z y x 0 *w 0 x 1* w 1 x 2*w 2 c 0+c 1+c 2 om z >= 0 så 1 annars 0 a 1 0-2 1 1 2 1 0-4 -3 0 b 1 0 0 1 3 1 1 0 0 1 1 c 1-1 1 1 1 2 1-1 2 2 1 Tabell 1. Tre datapunkter a,b,c är kopplade till varsitt indata värde och vikt. Varje datapunkts utvärde beror på om summan av dess indata * vikt är större eller mindre än tröskelvärdet. 3
Den grundläggande perceptronmodellen är en binär klassificerare eftersom den endast ger utvärde 1 eller 0, den kan alltså bestämma om några indata tillhör klass 1 eller 0. Detta kan illustreras med hjälp av ett diagram, i figur 1 nedan tillhör de vita punkterna klass 0 och de svarta tillhör klass 1. De separeras av den röda linjen, en så kallad beslutsgräns. Målet för perceptronen är att ändra sina vikter så att beslutsgränsen flyttas till dess att den separerar datapunkterna. Om det finns en beslutsgräns i datamängden som separerar alla datapunkter i en är datamängden linjärt separerbar (Russel & Norvig, 2010). x 2 3.5 3 2.5 2 1.5 1 0.5 0 0 0.5 1 1.5 2 2.5 3 x 1 figur 1. En grafisk representation av en datamängd där de vita punkterna blivit tilldelade klass 1 och de svarta klass 0, de separeras av en beslutsgräns I tabell 1 finns ett indatavärde x0 som alltid är satt till 1, detta är en konstant som används när man till exempel har indatavärden som alla är 0 och tröskelvärde som är större än 0 men vill predicera ett utvärde som är 1. Utan detta värde skulle summan alltid bli 0 eftersom vikterna multipliceras med indata som i detta fall är 0. När konstanten är med kan dess vikt justeras så att den övergår tröskelvärdet och trots att indatan är 0 klassificeras datapunkten som 1. Konstanten används även för att förflytta beslutsgränsen från origo. Figur 2 nedan visar ett exempel där konstanten inte används och en svart datapunkt blir felaktigt klassificerad eftersom beslutsgränsen utgår från origo. I figur 3 är konstanten med och beslutsgränsen kan därför förskjutas från origo längs x2 axeln och den svarta datapunkten klassificeras korrekt. För att förstå hur detta fungerar, tänk dig linjens ekvation (y = k*x + m). Om vi översätter denna ekvation till perceptronens beräkning är k*x indata och dess vikter, summan av dessa bestämmer linjens lutning och m är konstanten, precis som i linjens ekvation bestämmer konstanten hur långt från origo som linjen är förskjuten men i perceptronen är den med som ett indatavärde (Sarle, 2002). 4
x 2 3.5 3 2.5 2 1.5 1 0.5 0 0 0.5 1 1.5 2 2.5 3 x 1 Figur 2. Konstanttermen saknas och därför utgår alltid beslutsgränsen från origo, detta medför att en svart datapunkt blir felaktigt klassificerad x 2 3.5 3 2.5 2 1.5 1 0.5 0 0 0.5 1 1.5 2 2.5 3 x 1 Figur 3. Konstanttermen finns med i perceptronen och därför kan beslutsgränsen förskjutas från origo, den svarta datapunkten klassificeras korrekt Perceptronens inlärning Som nämndes tidigare är perceptronen en övervakad maskininlärningsalgoritm vilket innebär att vi har tillgång till en mängd träningsdata som algoritmen använder för att lära sig. I träningsmängden finns exempel på indata samt vilket utvärde som perceptronen förväntas producera givet dessa indata, ett facit. Perceptronen har även en egenskap som kallas online vilket innebär att den tittar på ett exempel i taget och inte på hela datamängden samtidigt (Daume, 2015). För att lära sig går algoritmen följaktligen igenom träningsmängden, ett exempel i taget, och jämför sitt utvärde med det som står i facit. Om perceptrones utvärde stämmer med facit ändras inget utan den fortsätter med nästa exempel, stämmer det inte uppdateras vikterna så att algoritmen skulle ge en bättre gissning om den fick se samma exempel igen. Hur mycket vikterna ändras beror på en parameter som kallas inlärningshastighet. För att illustrera hur detta fungerar visas ett exempel på en perceptron vars mål är att lära sig den logiska AND funktionen som visas i tabell 2. 5
indata utvärde x1 x2 y 1 1 1 1 0 0 0 1 0 0 0 0 Tabell 2. Den logiska AND funktionen. Utvärde skall bli 1 när båda indata värden är 1, annars 0. Målet är alltså att endast ge utvärde 1 när båda indata är 1 och utvärde 0 annars. Indata i perceptronen är x0,x1 och x2 med x0 som konstant och satt till 1 samt ett facit för förväntat utvärde. Inlärningshastigheten (h) är satt till 0.1, trökselvärdet (t) är satt till 0.5. Vikterna är från början satta till 0 och de slutgiltiga vikterna för ett exempel blir nästa exempels startvikter. Träningsdatan består av fyra exempel och varje rad i tabellen visar vilka ändringar som görs för varje exempel. Den feta linjen markerar att perceptronen har gått igenom alla exempel och påbörjar en ny iteration. Hela processen visas i tabell 3. I detta enkla exempel tar det endast tre iterationer för perceptronen att lära sig producera rätt utvärde och det illustrerar hur vikterna för varje indata-värde långsamt ökar för att till slut överskrida tröskelvärdet. 6
indata facit startvikter summa per data och vikt summa tröskelvärde utvärde fel ändring slutgiltig vikt x0 x1 x2 r w0 w1 w2 c0 c1 c2 z t y e d w0 w1 w2 x0 *w0 x1* w1 x2*w2 om z >= t så 1 annars 0 r-y h*e w0+x0*d w1+x1*d w2+x2*d 1 1 1 1 0 0 0 0 0 0 0 0.5 0 1 0.1 0.1 0.1 0.1 1 1 0 0 0.1 0.1 0.1 0.1 0.1 0 0.2 0.5 0 0 0 0.1 0.1 0.1 1 0 1 0 0.1 0.1 0.1 0.1 0 0.1 0.2 0.5 0 0 0 0.1 0.1 0.1 1 0 0 0 0.1 0.1 0.1 0.1 0 0 0.1 0.5 0 0 0 0.1 0.1 0.1 1 1 1 1 0.1 0.1 0.1 0.1 0.1 0.1 0.3 0.5 0 1 0.1 0.2 0.2 0.2 1 1 0 0 0.2 0.2 0.2 0.2 0.2 0 0.4 0.5 0 0 0 0.2 0.2 0.2 1 0 1 0 0.2 0.2 0.2 0.2 0 0.2 0.4 0.5 0 0 0 0.2 0.2 0.2 1 0 0 0 0.2 0.2 0.2 0.2 0 0 0.2 0.5 0 0 0 0.2 0.2 0.2 1 1 1 1 0.2 0.2 0.2 0.2 0.2 0.2 0.6 0.5 1 0 0 0.2 0.2 0.2 1 1 0 0 0.2 0.2 0.2 0.2 0.2 0 0.4 0.5 0 0 0 0.2 0.2 0.2 1 0 1 0 0.2 0.2 0.2 0.2 0 0.2 0.4 0.5 0 0 0 0.2 0.2 0.2 1 0 0 0 0.2 0.2 0.2 0.2 0 0 0.2 0.5 0 0 0 0.2 0.2 0.2 Tabell 3. En illustration av hur en perceptron ändrar sina vikter för att lära sig producera korrekt utvärde. 7
Perceptron som ordklasstaggare För att en perceptron skall kunna användas för ordklasstaggning krävs att den klarar av multipel klassifikation eftersom det finns fler än två ordklasser. I Stochholm Umeå Corpus 2.0 (SUC2) som användes för att träna och utvärdera perceptronen finns 25 olika ordklasser (Gustafson-Capková & Hartmann, 2006) och perceptronen måste kunna bestämma vilken av dessa som passar bäst för ett givet ord. Ett annat problem som behöver förbättras från den grundläggande perceptron som beskrivits tidigare är att den inte är vidare bra på att generalisera. Hela modellen kan ändras väldigt mycket om den gissar fel på de sista exemplen i träningsdatan, vikterna kommer då att ändras enbart efter dessa fel och det kan påverka dess prestanda på andra exempel (Daume, 2015). Implementation Implementationen av den svenska ordklasstaggaren grundar sig på Honnibals Averaged perceptron som är skriven i python (Honnibal, 2013). Honnibals kod har modifierats för att kunna tränas och testas på SUC2 datamängden. Nedan följer en förklaring på hur implementationen fungerar. Skapa data för träning och testning Det första som behövde ändras i Honnibals kod är hur taggaren tar emot datamängden som den skall tränas på. Vanligtvis måste en text som skall taggas med ordklasser tokeniseras, det innebär att man delar upp texten så att alla ord och tecken som kan tillhöra en ordklass står för sig själv. Det gör man oftast enklast genom att sätta ett mellanslag mellan ord och sådana tecken, detta innefattar även punkter, utropstecken och frågetecken med mera (Jurafsky & Martin, 2009). Detta steg behövdes inte för denna implementation eftersom SUC2 redan är tokeniserad. Funktionen createdata delar upp SUC2- datan i en träningsmängd och en testmängd. Träningsmängden består av 90% av den ursprungliga datan (66818 meningar och ca 1.05 miljoner tokens), resterande 10% (7425 meningar och ca 110 000 tokens) användes som testdata. För att undvika att ordklasstaggaren skall bli bra på endast en typ av texter slumpades alla meningar innan träningsmängd och testdata skapades, koden för detta kan ses i figur 4. 8
Figur 4. createdata slumpar alla meningar i SUC2.0 och skapar sedan träningsmängd och testmängd Träna ordklasstaggaren Honniball (2013) skriver att eftersom många ord sällan tillhör mer än en ordklass kan man, för att göra ordklasstaggningen mer effektiv, ta reda på vilka dessa ord är och på så vis slippa gissa när det är dags att tagga. Detta är det första som händer i träningsfunktionen train, ett tagdict skapas av funktionen _make_tagdict genom att iterera över alla (ord, ordklass) tupler i träningsdatan och räkna hur många gånger ett ord har en viss tagg. Om samma ord har en viss ordklass mer än 20 gånger och denna ordklass används för ordet mer än 97% av gångerna läggs ordklassen och ordet till i tagdict. Koden för _make_tagdict kan ses i figur 5, hela train funktionen visas i figur 6. Figur 5. _make_tagdict skapar ett dictionary som associerar ett ord till en ordklass om den ordklassen är absolut vanligast för det ordet. 9
Figur 6. train funktionen, ordklasstaggaren itererar över alla ord i den fil som den tar emot och försöker gissa vilken tagg som passar bäst till ett givet ord. För alla de ord som inte hamnar i tagdict måste ordklasstaggaren tränas att lära sig rätt ordklass givet ordens kontext. För att skapa ett ords kontext går programmet igenom en mening och lägger alla ord i meningen i en lista. För varje ord i meningen görs en koll för att se om ordet finns med i tagdict, finns det inte där hämtas ordets egenskaper de som hjälper programmet att avgöra vilken ordklass ordet tillhör. De egenskaper ordklastaggaren använder sig utav hämtas med funktionen _get_features som visas i figur 7. I avsnittet om maskininlärning skrevs att inlärningen kan ses som att man får en tabell med data och målet är att utifrån värden i varje kolumn predicera en okänd kolumn, även i exemplen på perceptronen har indata visats i kolumner, x0, x1 och x2. För ordklasstaggaren är dessa kända kolumner, vår indata, de egenskaper som returneras av funktionen _get_features. 10
Figur 7. _get_features returnerar ett dictionary som innehåller alla de egenskaper som ordklasstaggaren använder för att bestämma vilken ordklass ett ord tillhör Med hjälp av ett ords egenskaper försöker ordklasstaggaren göra en gissning av vilken ordklass som passar bäst. Här måste det finnas en lösning på hur man bestämmer mellan 22 olika ordklasser och inte bara två. Lösningen för denna implementation är att lagra vikter för egenskap/ordklass kombinationer. Varje egenskap blir på så vis associerad med en eller flera ordklasser och dessa ordklasser har en egen vikt för denna egenskap. För att gissa ett ords ordklass går programmet igenom alla ordets egenskaper och adderar vikten för varje ordklass som är associerad med varje egenskap, den ordklass som får högst vikt över alla ordets egenskaper blir den ordklass som programmet gissar på. Att välja ordklassen med högst vikt görs i funktionen predict som visas i figur 8. Figur 8. Predict går igenom alla egenskaper för ett ord och summerar vikten för varje ordklass som är associerad med egenskaperna. Den ordklass med högst vikt blir vald. Från början finns det dock inga vikter utan dessa måste programmet lära sig, detta görs i funktionen update som visas i figur 9. Själva tanken bakom uppdatering är simpel, vikten för 11
den korrekta ordklassen ökar och vikten för den felaktiga gissningen minskar, på så vis kommer perceptronen att göra en bättre gissning om den skulle få försöka på samma exempel igen. update-funktionen lagrar också hur mycket ett egenskap/klass par har uppdaterats totalt samt när de uppdaterades senast, dessa två parametrar används för att räkna ut genomsnittsvikten för en ordklasserna. Figur 9. update ökar vikten för den ordklass som var rätt och minskar vikten för den som var felaktig för ett ords alla egenskaper. Att använda genomsnittsvikten istället för den totala vikten löser problemet med perceptronens dåliga generalisering (Honnibal, 2013). Genomsnittsvikten räknas ut i funktionen average_weights som visas i figur 10, efter detta steg är träningen färdig, ordklasstaggaren kan nu testas på testdatan. Figur 10. average_weights beräknar den genomsnittliga vikten för varje klass för att perceptronen skall kunna generalisera bättre. Testa ordklasstaggaren Ordklasstaggaren använder funktionen tag för att tagga en fil med testdata som har samma format som träningsdatan. Funktionen fungerar på samma sätt som train med undantaget att den inte uppdaterar några vikter utan lagrar helt enkelt det ord och den ordklass som taggaren 12
gissade på för ordet i en lista. Listan returneras sedan och kan köras genom funktionen evaluate för att jämföras mot facit. tag och evaluate visas i figur 11 respektive 12. Figur 11. tag gissar på ett en ordklass utifrån ett ords egenskaper. Ordet och ordklassen lagras som en tupel i en lista som returneras Figur 12. evaluate beräknar ordklasstaggarens prestanda genom att jämföra tupler från listan som returneras av tag med facit. Även precision och recall beräknas här. 13
Resultat Med en iteration över träningsdatan klarar ordklasstaggaren korrekt tagga 95.66% av orden i testmängden. I tabell 4 visas även precisionen (antal korrekt klassificerade taggar/antal ord som fått den taggen) samt recall (antal korrekt klassificerade taggar / antal ord som har den taggen i facit) för varje ordklass i datamängden. Förklaring för varje ordklass kan ses i appendix. ordklass precision recall HS 100% 100% PAD 100% 100% MID 99.90% 99.88% MAD 99.92% 99.92% PP 98.62% 96.67 PS 98.07% 99.31% VB 98.04% 97.75% IE 97.65% 94.73% DT 97.37% 95.22% NN 97.24% 95.61% HP 96.39% 89.54% PN 95.62% 97.30% KN 95.26% 97.49% RG 94.20% 97.54% PM 92.95% 92.31% HD 91.52% 81.81% AB 91.45% 91.36% JJ 89.39% 91.67% SN 89.35% 94.08% HA 82.74% 92.96% PC 81.91% 84.98% RO 79.43% 93.92% IN 78.91% 94.24% PL 74.64% 81.95% UO 30.24% 82.66% Tabell 4. Precision och recall för samtliga ordklasser i testmängden Slutsats och förbättringar Resultatet för denna ordklasstaggare är jämförbart med det av Stagger, en svensk ordklasstaggare som får 95.87% korrekt taggade ord på samma data. Dock använder Stagger ett annat sätt att dela upp data i tränings och testmängd.(östling, 2013). Det finns ett antal ändringar förbättra ordklasstaggarens resultat, en första sådan skulle vara att testa andra egenskaper, till exempel de som Stagger använder, och undersöka hur resultatet förändras. Det finns även andra typer av textmängder som taggaren kan testas på för att komma fram till vad det är för typ av ord och ordkombinationer som den har svårt att klassificera. 14
Trots alla förbättringar som skulle kunna göras erbjuder perceptronen en simpel och effektiv lösning som ordklasstaggare. Genom att studera Honnibals kod och gjort ändringar förstår jag hur denna modell kan användas för ordklasstaggning och jag har även fått mer kunskap om perceptronen som modell och ordklasstaggning överlag. 15
Referenser Bishop, C. M. (2006). Pattern Recognition and Machine Learning. New York: Springer. Daume, H. (09 2015). A Course in Machine Learning. Hämtat från A Course in Machine Learning: http://ciml.info/ Gustafson-Capková, S., & Hartmann, B. (December 2006). Språkbanken. Hämtat från Stockholm-Umeå Corpus - SUC 2.0 manual: http://spraakbanken.gu.se/parole/docs/suc2.0-manual.pdf Honnibal, M. (den 18 September 2013). spacy blog. Hämtat från A Good Part-of-Speech Tagger in about 200 Lines of Python: https://spacy.io/blog/part-of-speech-pos-taggerin-python Jurafsky, D., & Martin, J. H. (2009). Speech and Language Processing: An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition (2:a uppl.). Upper Saddle River, N.J: Pearson Education. Östling, R. (2013). Stagger: an open-source part of speech tagger for swedish. Northern European Journal of Language Technology, 1-18. Picton, P. (1994). Introduction to neural networks. Basingstoke: Macmillan. Russel, S. J., & Norvig, P. (2010). Artificial Intelligence a Modern Approach. Boston: Pearson Education. Sarle, W. S. (den 11 10 2002). Neural Network FAQ. Hämtat från Part 2 of 7: Learning, Why use a bias/threshold?: ftp://ftp.sas.com/pub/neural/faq.html 16
Appendix Förklaring av ordklasser i SUC 2.0 (Gustafson-Capková & Hartmann, 2006). tagg ordklass exempel AB Adverb inte DT Determinerare denna HA Frågande/relativt adverb när HD Frågande/relativ determinerare vilken HP Frågande/relativt pronomen som HS Frågande/relativt possesivt pronomen vars IE Infinitivmärke att IN Interjektion ja JJ Adjektiv glad KN Konjunktion och MAD Större avgränsare. MID Mindre avgränsare, PAD Parad avgränsare ( NN Substantiv pudding PC Particip utsänd PL Partikel ut PM Egennamn mats PN Pronomen hon PP Preposition av PS Possessivt pronomen hennes RG Grundtal tre RO Ordningstal tredje SN Subjunktion att UO Utländskt ord the VB Verb kasta 17