Automatisk morfologisk segmentering för svenska substantiv



Relevanta dokument
Två-nivåmodellen, TWOL. 2D1418 Språkteknologi, Nada KTH Höstterminen 2004 Lisa Lagerkvist, Me-01

Gränssnitt för FakeGranska. Lars Mattsson

grammatik Ordklasser, nominalfraser, substantiv

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

Språkteknologi och Open Source

12 Programstege Substantiv

Kungl. Tekniska högskolan NADA Grundformer med Stava

Dependensregler - Lathund

Taltaggning. Rapport av Daniel Hasselrot , 13 oktober 2003

Grammatiska morfem kan också vara egna ord, som t ex: och på emellertid

Varför är morfologi viktigt? Morfologisk analys och generering. Vad är ett ord (idag vs. i dag) Kan man inte lägga alla ord i en lexikonfil?

Användarhandledning Version 1.2

Medieteknologi Webbprogrammering och databaser MEB725, 5p (7,5 ECTS) Klientprogrammering JavaScript Program på flera sidor

Innehållsförteckning till Svenska Online. Adress: Uppdaterat

Grim. Några förslag på hur du kan använda Grim. Version 0.8

TDDD02 Föreläsning 2 HT Reguljära uttryck och reguljära språk Lars Ahrenberg

Taggning av räkneord som årtal eller andra räkneord, Språkteknologi 2D1418, HT 01 Jonas Sjöbergh, , 15 oktober 2001

Skrivstöd. Joakim Nivre. Introduktion till språkteknologi. Skrivstöd. Inledning. Orsaker till stavfel. Detektering av icke-ord

Software Translator 6.1 Manual

ORDKLASSERNA I. Ett sätt att sortera våra ord

Utveckling av ett grafiskt användargränssnitt

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Grundläggande textanalys. Joakim Nivre

Grammatik för språkteknologer

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

LPP Magiska dörren ÅR 4

Svensk nationell datatjänst, SND BAS Online

Vanliga frågor för VoiceXpress

Morfologi, särdrag, lexikon och syntax. När är det bra med morfologi? Vad är ett ord? Morfem. Stam och affix

INNEHÅLLSFÖRTECKNING... 1 INLEDNING ORDBOKEN I VERKTYGSLISTEN ORDBOKEN... 3

5HVLVWHQVWDEHOO 'DWD3DUWQHU. Er partner inom data

Fråga: Vi ska skapa en omvärldsbevakningsgrupp och undrar hur ska man tänka när man skapar bevakningar för att plocka upp trender inom ett ämne?

MÖSG ht 2005 Maskinöversättningssystemet MATS

Analys av BI-system och utveckling av BIapplikationer

TDDA94 LINGVISTIK, 3 poäng tisdag 19 december 2000

ClaroDictionary med tal. ClaroDictionary utan tal

Precodia. Manual. Precodia 1.0. Elevdata AB. Produktionsstöd har erhållits från Specialpedagogiska skolmyndigheten. (

First Class uppgift 2

Tentamen, Algoritmer och datastrukturer

Bildbaskontoret. Bruksanvisning. Handitek. anpassar tekniken till människan BRUX\...\ BILDBASKONTORET

Tio vanliga Excel-problem

efact Sök Sök/Rapporter ( )

Lexikon: ordbildning och lexikalisering

TDDC74 - Projektspecifikation

Att söka information (med betoning på Internet)

3. Hämta och infoga bilder

Manual HSB Webb brf

Kursplan i svenska som andra språk på Alsalamskolan enligt kursplan 2011

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Internet. En enkel introduktion. Innehåll:

När är det bra med morfologi? Morfologi (formlära) Vad är ett ord? Ordbildning och ordböjning. Antal bokstäver i mamma? Morfem

MÄLARDALENS HÖGSKOLA. CD5560 Formella språk, automater och beräkningsteori. Användarmanual. för simulatorn JFLAP

Språkpsykologi/psykolingvistik

Uppgift 1 ( Betyg 3 uppgift )

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Våren Nationalencyklopedin. Avancerad guide

729G09 Språkvetenskaplig databehandling

Uppgifter till praktiska tentan, del A. (7 / 27)

Uppgift 1 ( Betyg 3 uppgift )

Värmedistribution i plåt

ORDKLASSTAGGNING. Marco Kuhlmann Institutionen för datavetenskap

Ersätta text, specialtecken och formatering

PROV. 12 Egenskaper (provavsnitt)

Grundläggande textanalys, VT2013

Hammarbyskolan Reviderad februari 2009 Lokal kursplan i svenska/svenska som andra språk

Datalogi för E Övning 3

Utveckling av simulator för ärendehanteringssystem

So ka artiklar och annan litteratur

Programmering i Scratch 2.0

Introduktion till frågespråket SQL (v0.91)

Palette. Matchning fakturor mot order - Manual. Version 1.0 /

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

Grafisk visualisering av en spårbarhetslösning

Korp. Övningar Språkbankens höstworkshop oktober 2016

Lyssna, Skriv och Läs!

Forskning och utveckling inom språkteknologi Uppgift 3: Projektförslag Parallelliserad dependensparsning i CUDA

Följande program utvecklades av BITTECH. De flesta såldes via Elevdata, Frölunda Data och VetaMer. De finns inte längre till försäljning.

Rekursion och induktion för algoritmkonstruktion

Grunder. Grafiktyper. Vektorgrafik

Fonologi. Kommutationstest. Minimala par. Hur bestämmer man vilka fonem ett språk har?

Logging Module into the PRIME Core

Din lärare kan se om och när du har utfört ditt uppdrag. Då får du ett nytt.

Tentamen i Introduktion till programmering

Morfologi och automatisk morfologisk analys och generering. Varför är morfologi viktigt? Vad är ett ord (idag vs. i dag)

FOR BETTER UNDERSTANDING. Snabbguide.

Ordklasser. Substantiv är benämningar på människor, djur, växter och föremål. Du kan sätta en, ett eller flera framför substantiv.

- Kan skriva grundläggande information utifrån sig själv t.ex. personnummer, adress, telefonnummer etc.

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Vad säger WCAG om kognition?

Uppgift 1 ( Betyg 3 uppgift )

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Arduinokurs. Kurstillfälle 4

Persiska. Albin Finne. Mark Peldius D1418 Språkteknologi

Karp. Övningar Språkbankens höstworkshop oktober 2016

Ordklasser och satsdelar

Läslandet 2 Ord och meningar

Objektorienterad programmering D2

IMPORTERA POSTER TILL DIVA Anvisning för export av poster från andra databassystem för import till DiVA

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Transkript:

Automatisk morfologisk segmentering för svenska substantiv Veronika Ekström verek@stp.ling.uu.se Examensarbete i datorlingvistik Språkteknologiprogrammet Institutionen för lingvistik och filologi Uppsala Universitet 8 juni 2005 Handledare: Beàta Megyesi, Uppsala Universitet Fredrik Larsson, Phoneticom AB

Sammandrag Den här uppsatsen beskriver utvecklingen av ett program som förklarar svåra ord på hemsidor. Den primära uppgiften är att minimera programmets lexikon. Detta innebär att varianter av ord skall kunna förklaras trots att dessa inte finns med i lexikonet. Med Porters stemmingsalgoritm för svenska som utgångspunkt har regler skapats som modifierar orden till en gemensam form. Porters algoritm plockar bort vissa ändelser men behandlar inte stamändringar hos ord. Speciella regler för omljud har därför skrivits. Eftersom substantiv är den mest frekventa ordklassen i lexikonen har reglerna anpassats till dessa. Programmet har testats för att se hur många korrekta matchningar som gjorts. Två tester gjordes, den ena med och den andra utan ordklasstaggare. Utan ordklasstaggare var 90,1% av matchningarna korrekta och med ordklasstaggare var siffran 98,2%. Genom att använda sig av en ordklasstaggare fungerar programmet bra och resultatet förbättras avsevärt.

Innehåll Förord 1 Inledning. 1 2 Bakgrund 3 2.1 Morfologi. 3 2.2 Substantivets böjningsformer..... 3 2.2.1 Species...... 3 2.2.2 Numerus.... 4 2.2.3 Kasus.... 4 2.2.4 Genus... 4 2.3 Automatisk morfologisk analys... 5 2.4 Statistisk morfologisk analys... 5 2.5 Två-nivåmodellen... 7 2.5.1 PC-KIMMO... 8 2.5.2 SWETWOL... 9 2.6 Stemming... 9 2.6.1 Lovins stemmer... 10 2.6.2 Paice/Husk stemmer...... 12 2.6.3 Porters stemmingsalgoritm.... 13 2.6.4 Porters stemmingsalgoritm för svenska... 15 2.7 Ordklasstaggning... 15 2.7.1 TnT... 16 2.8 Xplain... 16 3 Automatisk morfologisk analys 18 3.1 Implementering av algoritmen... 18 3.2 Programmets uppbyggnad...... 19 3.2.1 Lexikonet.... 20 3.2.2 Inläsning av filer.... 20 3.2.3 Start- och Stopfunktionerna... 21 3.2.4 Bearbetning av texten... 21 3.2.5 Ordräkning... 22 3.2.6 Matchning.... 23 3.2.7 Reglerna.... 24 3.2.8 Tillämpning av reglerna 24 3.3 Träning... 25 3.3.1 SUC... 26 4 Utvärdering och resultat. 29 4.1 Utvärderingsmetod... 29 4.2 Testresultat..... 30 4.2.1 Test med otaggad text.. 30 4.2.2 Test med taggad text. 31 4.3 Homografer... 32 4.4 Sammanfattning av testresultat 33

5 Diskussion.. 34 5.1 Framtida utvecklingsmöjligheter.... 34 6 Sammanfattning. 36 Litteraturförteckning. 37

Förord I denna uppsats redovisas ett examensarbete inom Språkteknologiprogrammet vid institutionen för lingvistik och filologi, Uppsala Universitet. Examensarbetet har utförts på Phoneticom AB i Uppsala. Jag vill tacka min handledare på Institutionen för lingvistik och filologi, Beàta Megyesi, som har bidragit med konstruktiva kommentarer framförallt under rapportskrivningen. Ett stort tack även till min handledare på Phoneticom AB, Fredrik Larsson, som gett mig stöd och goda råd under examensarbetet. Tack! Veronika Ekström, Uppsala juni 2005

1. Inledning Användandet av internet har ökat lavinartat de senaste åren. Det finns ett stort intresse från såväl allmänhet som företag att utnyttja nätet. Många affärskedjor säljer sina produkter via internet och banker erbjuder t.ex. sina tjänster på detta sätt. De allra flesta företag och myndigheter har en egen hemsida där man får tillgång till mer eller mindre relevant information. I många fall är det enklare och snabbare att nå information via nätet än att sitta i en telefonkö. Man behöver inte heller anpassa sig efter några öppettider. Ett växande intresse från en stor grupp användare ställer krav på att tillgängligheten förbättras. I dagens datoriserade samhälle är användningen av informationssökning via internet eller i olika databaser mycket omfattande. Det kan handla om att söka efter artiklar med ett speciellt innehåll eller specifika ord i lexikon som finns on-line. Informationssökning handlar om att extrahera den information som passar användarens krav. Den enorma mängd information som publiceras på nätet utgör en viktig informationskälla för allmänhet och företag. Eftersom det är enkelt att lägga ut information har antalet hemsidor blivit så stort att det kan bli svårt att hitta en specifik sida. För att kunna lokalisera de uppgifter man söker behövs ett söksystem som sorterar informationen och avgör vad som är relevant. Det kan finnas kataloger eller databaser som är sorterade efter ett visst ämnesområde vilket underlättar sökningen. För att öka antalet träffar vid en sökning använder sig sökmotorer ofta av trunkering. Detta innebär att ordets ändelse/ändelser plockas bort. Genom denna modifiering får varianter av ett ord en gemensam form. Söker man då på t.ex. tidningar kan man få resultat som innehåller tidning, tidningarna o.s.v. När man får tillgång till resultatet av sökningen är det viktigt att man förstår och kan ta tillvara på den information som ges. De uppgifter som finns på exempelvis olika myndigheters hemsidor bör vara begripligt för alla. Det kan förekomma termer och uttryck som är specifika för ett visst område och som inte alla känner till. Genom att vidta vissa åtgärder kan man förbättra förståelsen. Som exempel på en sådan tjänst finns Xplain. Detta program är skapat för att underlätta förståelsen av texter med viktig information. Programmet förklarar de svåra orden på en hemsida och kan även kombineras med en uppläsningsfunktion. De ansvariga för en sida bestämmer själva vilka ord som skall förklaras genom att lägga in dessa i ett lexikon. I nuläget krävs att det ord som skall slås upp finns i samma form i lexikonet. Eventuella varianter kan alltså inte förklaras. När det gäller uttryck som består av två eller flera ord stannar sökningen ifall ett av orden finns i lexikonet vilket innebär att uttrycket inte kan förklaras. För att kunna lösa dessa problem kan man använda sig av morfologisk analys som är användbart inom flera språkteknologiska områden. Med automatisk morfologisk analys kan man t.ex. öka antalet träffar vid informationssökning, skapa stamlexikon 1

som används vid maskinöversättning, identifiera morfemgränser för ett korrekt uttal hos text-till-tal system ordklasstagga en text. Genom att använda stamlexikon begränsas lexikonets storlek och man sparar både plats och tid. Vid taligenkänning kan okända ord kan identifieras tack vare igenkänning av vissa morfem. Automatisk morfologisk analys används för både analys och generering av nya ord. Man kan använda det inom forskning för att se hur vanlig en viss ordform är eller vad det finns för typer av böjningar och avledningar. Syftet med detta examensarbete är att utveckla och förbättra Xplain genom att hitta ett sätt att minimera programmets lexikon. Detta betyder att varianter av ord skall kunna förklaras även om dessa inte finns med i lexikonet. Programmet skall även kunna förklara uttryck som består av flera ord samt behandla stamförändringar. Då substantiv är den ordklass som är mest frekvent i lexikonen kommer det nya programmet att anpassas efter dessa. Uppsatsen består av sex kapitel. Efter inledningen ges i kapitel två en kort beskrivning av svensk morfologi med särskild tonvikt på substantiv. Kapitlet ger även en teoretisk bakgrund till olika typer av automatisk morfologisk analys. Det tredje avsnittet beskriver utvecklingen av programmet samt vilka delar det består av och avslutas med en genomgång av hur programmet tränats. Det fjärde kapitlet tar upp den utvärderingsmetod som använts och resultatet av utvärderingen. I kapitel fem diskuteras framtida utvecklingsmöjligheter och i det avslutande kapitlet ges en sammanfattning av uppsatsen. 2

2. Bakgrund I det här kapitlet ges en kort introduktion till morfologi följt av ett avsnitt där substantivets böjningsformer beskrivs. Detta utgör grunden för de regler som kommer att skrivas. Efter detta följer en längre presentation av automatisk morfologisk analys med dess undergrupper. Kapitlet avslutas med en beskrivning av Xplain. 2.1 Morfologi Morfologi också kallad formlära handlar om hur ord bildas och böjs. Med hjälp av morfem, som är den minsta betydelsebärande enheten i språket, kan man bilda olika ordformer samt nya ord av gamla genom avledning och sammansättning. Morfemen brukar delas in i fria och bundna. Fria morfem kan fungera som egna ord medan bundna aldrig kan stå ensamma. Affix är samlingsnamnet för bundna morfem och kan i sin tur delas in i tre grupper: prefix, infix och suffix beroende på var i ordet de står (före, i eller efter). Ett ord består oftast av en stam och ett affix. När man tagit bort alla morfem från ett ord återstår det som kallas för rot den grundläggande enheten hos ett ord. Stammen och roten kan sammanfalla. Tittar man på följande exempel man se att i ordet otänkbara utgör otänkbar stam för suffixet -a, tänk är stam för -bar o.s.v. 2.2 Substantivets böjningsformer Som språkets största ordklass spelar substantiven en central roll. De bär på mycket information och står därmed för en stor del av innehållet i en text. De tillhör gruppen öppna ordklasser vilket innebär att antalet ständigt växer allt eftersom nya ord tas in. Dessa bildas via avledning, sammansättning eller lånas in. Substantiven böjs i species (bestämdhet), numerus, kasus och genus. 2.2.1 Species Species kan anges genom att ett ord placeras framför substantivet, vilket är det vanligaste sättet inom de europeiska språken. I de skandinaviska språken gör man istället detta genom att lägga till ett suffix. I svenskan är dessa: Exempel 1 -n skon -en stolen -t hjärtat -et taket -na stugorna Det finns även en sk bestämd fristående artikel (den, det och de) i svenskan som förekommer före substantivet. Vanligaste användningen är när substantivet kommer efter en bestämning. 3

2.2.2 Numerus När det gäller böjning efter numerus kategoriseras substantiven i olika grupper som kallas för deklinationer. Följande exempel visar de olika ändelserna: Exempel 2 -or skolor -ar vantar -er växter -r skor -n bin -0 hus Det finns vissa undantag, t.ex. låneord som kan vara svåra att placera i någon speciell grupp. Till undantagen räknar man även omljud som innebär en vokalförändring i stammen. Förändringen kan ske mellan följande vokaler: Exempel 3 2.2.3 Kasus u-ö o-ö å-ä a-ä mus-möss rot-rötter gås-gäss man-män Det tredje böjningssättet består av två former: genitiv och grundform. Genitiv uttrycker ägande och anges med suffixet -s. Exempel 4 Grundform: bil, bord, dag Genitiv: bilens, bordets, dagens 2.2.4 Genus Genus anges med formerna neutrum och utrum. Den första kategorin innehåller ord som föregås av ett: Exempel 5 ett bord ett hus Orden kan ersättas med ett personligt pronomen i det här fallet det: Exempel 6 Bakom skogen finns ett hus. Det är stort och gammalt. Den andra kategorin består av de ord som som kan föregås av en: Exempel 7 en buss en flicka 4

Dessa ord kan ersättas med något av följande personliga pronomen: han, hon eller den: Exempel 8 En flicka gick längs vägen. Hon bar på en korg med frukt. 2.3 Automatisk morfologisk analys Automatisk morfologisk analys kan utföras antingen med hjälp av regler eller statistisk information. Följande kapitel beskriver olika program som utför automatisk morfologisk analys. Som exempel på statistisk morfologisk analys ges programmet Linguistica och som exempel på regelbaserad morfologisk analys presenteras tvånivåmodellen och stemming, båda med exempel. Figur 1 nedan visar uppdelningen: Automatisk morfologisk analys Regler Statistik Tvånivåmodellen Stemming Linguistica PC-KIMMO SWETWOL Lovins Porters Paice/Husk Figur 1 Uppdelning av automatisk morfologisk analys. 2.4 Statistisk morfologisk analys Med hjälp av statistiska hjälpmedel kan man t.ex. få information om hur frekvent en viss ordform är i en text. Man kan använda frekvensen av vissa ord eller n-gram för att identifiera stammar. Med statistik kan man även avgöra hur stor sannolikhet det är för ett visst morfem. Resultatet kan sedan användas för att avgöra vilken ordklass ett ord tillhör. Program som använder sig av statistik är billiga att utveckla men bör kontrolleras eftersom det alltid finns oregelbundenheter och undantag i språket. Programmet Linguistica är ett exempel på oövervakad träning där man med hjälp av statistisk information avgör vad som är stammen och ändelsen/ändelserna för orden i en text (Goldsmith, 2004). Programmet har ej tillgång till någon lingvistisk information såsom regler, lexikon eller taggad text. Ett väl fungerande program som enbart med hjälp av statistik utför en morfologisk analys av ett språk, är intressant eftersom det kan ta flera månader att göra detta manuellt. Som input tar programmet en korpus innehållande 5000 1000 000 ord. Programmet testas kontinuerligt och för tillfället undersöker man hur det fungerar på språk som somaliska och urdu. Man kan säga att programmet består av två steg: 1. uppdelning av ordet till stam och suffix. 5

2. en Minimum Description Length (MDL) analys som i slutändan avgör vilka uppdelningar som är korrekta. Det första steget består av en algoritm som i sin tur kan delas in i två delar: 1. den första delen ger ett förslag på vad som är ordets stam och suffix. 2. den andra delen modifierar förslaget om så behövs. Algoritmens första del är inspirerad av en metod utvecklad av Zelig Harris (Goldsmith, 2004). Orden ordnas i en s.k. trädstruktur där de ord som börjar på samma bokstav hamnar under samma nod. Finns det flera ord som börjar på a har noden en pekare till de bokstäver som kommer direkt efter a:et. Med hjälp av den här strukturen grupperas orden så att de ord som har samma prefix finns på samma ställe (prefix i det här sammanhanget syftar på en gemensam sträng av bokstäver i början av ordet en eventuell stam). Harris använde sig av successor frequency som innebär att man tittar på antalet unika bokstäver som direkt följer efter ett visst prefix.om följande ord finns i en korpus: governed, governing, governor, government, governs skulle prefixet gover ha värdet 1 som successor frequency eftersom den enda bokstaven som kan komma efter är n. Om man istället antar att govern är stammen får successor frequency värdet 5 eftersom bokstäverna e, i, o, m och s kommer direkt efter. Harris menade att höga värden hos successor frequency kunde tyda på en lämplig gräns för morfemuppdelning. I Linguistica modifierar man Harris metod genom att lägga till några villkor för att en uppdelning skall ske: 1. Ett affix måste förekomma i minst 3 ord för att det ska anses vara intressant. 2. För att en delning ska ske efter en bokstav n måste värdet på successor frequency vara exakt 1 efter både bokstav n-1 och n+1. Efter en första indelning grupperas stammarna beroende på vilka ändelser de har. Grupperna kallas för signaturer och har formen: Exempel 9 NULL.ed.ing.s accent add administer afford alert amount appeal Eftersom stammarna även utgör enskilda ord och kan stå ensamma används NULL för att beteckna detta. Den andra delen av av algoritmen går igenom listorna med signaturer som skapats. Signaturerna modifieras eller tas bort efter vissa krav. Algoritmen testades på boken The adventures of Tom Sawyer av Mark Twain (Goldsmith, 2001) och de fel som uppstod var av följande art: 6

1. Två suffix som sammanfaller till ett t.ex.signaturen ings från ordet gatherings som egentligen borde ha formen ing.s. 2. Slutet av stammen finns med i ändelsen t.ex. signaturen ted.ting.ts. från orden hunted, hunting och hunts. 3. Signaturer med för korta stammar vilket gör att flera obesläktade ord kopplas ihop. Exempelvis stammen ca med signaturen n.n't.p.red.st.t. De ord som bildas med dessa ändelser blir: can, can't, cap, cared, cast och cat som ej bör få samma stam. 4. Uppdelningen av orden är inte konsekvent då ord som innehåller samma stam hamnar under olika signaturer. T.ex. Stammen abbreviate med signaturen NULL.d.s och stammen abbreviat med signaturen ing. 5. Det kan finnas stammar som är besläktade men inte ser likadana ut, t.ex. win med signaturen NULL.s och stammen winn med signaturen er.ing. I det andra steget där MDL-analysen utförs, avgörs vilka av dessa signaturer som skall behållas och ytterligare ändringar görs som tar hand om ovanstående fel och förbättrar resultatet. Finns t.ex. suffixen -ism och -ist under samma signatur görs dessa om till - m och -t. Målet med Linguistica var att skapa ett snabbt och noggrant program som kan användas för så många språk som möjligt utan att behöva anpassa det till varje språk. Man använder sig av oövervakad träning vilket innebär att texten som ges som input är oannoterad. När ett test på 300 000 ord från Brown-korpusen gjordes fick 72% en korrekt analys (Goldsmith, 2004). Av de 28% som analyserades felaktigt berodde ca 30% på att programmet inte kunde återskapa stamfinala e:n. Exempelvis så fick abusive och abused stammen abus. Om man inte kräver detta skulle 80% av orden få en korrekt analys. 2.5 Två-nivåmodellen I början på åttiotalet utvecklade Kimmo Koskenniemi två-nivåmodellen vid Helsingfors universitet. Den används för generering och analys av ordformer (Koskenniemi 1983). Detta görs med hjälp av parallella regler. De två nivåerna som modellen består av är den ortografiska nivån och den lexikala nivån: Exempel 10 Lexikal nivå: bil+ar+nas Ortografiskt nivå: bil0ar0nas I den lexikala nivån finns stammen och de möjliga ändelserna. Den ortografiska nivån visar hur ordet ser ut på ytan. Två-nivåreglerna används i båda riktningarna. När de går från lexikal nivå till ytnivå genereras nya ordformer och den andra riktningen används för analys av ordformer. Reglerna tillämpas med hjälp av transduktorer. Exempel 11 från Koskenniemi (1984) med det finska substantivet lasi (sv. glas) visar hur reglerna fungerar. Här ser vi den partitiva pluralformen. Exempel 11 lexikal nivå l a s i I A 7

ortografisk nivå l a s e j a Lasi är själva stammen, I står för pluralmorfemet och A representerar den partitiva ändelsen a. Följande par bildas: l-l, a-a, s-s, i-e, I-j och A-a. Hos de tre första paren sker inga ändringar eftersom de båda bokstäverna sammanfaller. För de tre sista paren finns regler som ändrar på tecknen förutsatt att vissa krav uppfylls. Reglerna säger att: a) i omvandlas till e framför en plural form. b) pluralformen I blir j om den förekommer mellan två vokaler ( på ytnivån) c) A blir a - A kan bli antingen a eller ä beroende på stammens utseende. Om kontextkravet i regeln stämmer överens med hur ordet ser ut sker förändringen. Uppbyggnaden av lexikonet är gjord som en trädstruktur med noder som kallas för minilexikon. Modellen kan användas på olika språk, för varje språk krävs specifika regler. Modellen testades genom att göra en tvånivåbeskrivning för finska. Detta innebar att man konstruerade ett minilexikon samt skrev regler. Implementationen av modellen gjordes först i PASCAL och senare i INTERLISP. Målet var att programmet skulle vara effektivt. Ett väl fungerande program som var relativt snabbt blev resultatet (Koskenniemi, 1983). 2.5.1 PC-KIMMO PC-KIMMO är ett program som genererar och analyserar ord med hjälp av tvånivåmodellen. Se http://www.sil.org/pckimmo/. Arbetet med programmet startade 1985 och man hade som mål att göra det mer tillgängligt (den här gången skrevs programmet i C). Målet med PC-KIMMO var att nå fler användare då implementationen av två-nivåmodellen tidigare endast fanns på olika forskningscentra. Med PC-KIMMO kan man skriva egna regler och det är därmed ett bra verktyg att använda i undervisning. Eftersom även källkoden finns tillgänglig kan användaren integrera den i egna program. För att kunna använda programmet måste användaren bidra med två filer. Dessa två filer utgör beskrivningen av ett språk: 1) En fil med regler som specificerar alfabetet och de fonologiska reglerna ( eller stavningsregler). 2) En lexikonfil med ord, morfem och vissa förklarande noter. Alla regler i en tvånivåmodell appliceras samtidigt för att undvika skapandet av mellannivåer. Programmet består av två primära komponenter: generatorn och parsern. Generatorn tar som input en lexikal form och tillämpar reglerna (fonologiska) och returnerar motsvarande ytform. Här används inte lexikonet. Parsern tar den ortografiska formen som input och tillämpar de fonologiska reglerna. I det här fallet görs en jämförelse med lexikonet och den motsvarande lexikala formen returneras tillsammans med information om ordet. 8

2.5.2 SWETWOL SWETWOL är ett verktyg för morfologisk analys och ordklassmärkning av svensk text. Det utvecklades av Fred Karlsson 1990 och använder sig av två-nivåmodellen. Lexikonet är även här en trädstruktur som består av 299 minilexikon. Tonvikten läggs på sammansättningar då dessa är ett viktigt kännetecken i det svenska språket. Endast åtta två-nivåregler används och lexikonet består av ca 60 000 ord från Svenska akademiens ordlista. Sex av de åtta reglerna presenteras i en artikel om SWETWOL (Karlsson, 1997): 1) D:t <-> _: t ; 2) N:0 <-> [e: r: C r: r Cl: l: n: ]_ ; 3) m:0 <-> :m_n : ; 4) Z:s -> # : :*_#: :0* :x; 5) S:s <- : Sb_; 6) % : <- % : :*_; Den tredje regeln innebär t.ex. att m representeras som noll om det kommer efter m och före n. Ordet simma blir t.ex. simning. Programmet finns att testa på Lingsofts hemsida (http://www.lingsoft.fi) och nedan följer ett exempel på en analys. Exempel 12 "<bilar>" "bila" V ACT PRES "bil" N UTR INDEF PL NO SWETWOL behåller ambiguitet vilket kan ses i exemplet ovan. Programmet testades på en bok innehållande 47 422 ordformer (Karlsson,1997). 0,65 % av dessa förblev oanalyserade d.v.s. 310 stycken. Dessa kan delas in i felstavningar, latinska eller engelska ord, felaktiga ord t.ex. bilstrafiken, ord som ej finns med i kärnlexikonet, ord som specificerar saker t.ex. mineralogiskt och ord som är namn t.ex. Amazonas och Brandenburg. 2.6 Stemming Stemming, som även kallas trunkering, innebär att man plockar bort ändelsen/ändelserna från ordet så att endast stammen återstår. Ingen segmentering görs av de olika ändelserna. Exempelvis skulle ordet stugornas delas in i stug-ornas, istället för stug-or-na-s. I de flesta fall kan man säga att morfologiska varianter av ord oftast har en liknande semantisk tolkning och kan ses som likvärdiga när det gäller informationssökning (Paice, 1994). Därför har man utvecklat ett antal stemmers för att reducera ordet till dess stam eller rotform. Med stemming skulle stugan och stugorna få samma form och på så sätt kan man nå olika varianter av ord. Själva sökningen blir inte beroende av en speciell ordform och 9

ett lexikon skulle kunna minimeras då alla ordformer ej behöver ingå. Orden omvandlas alltså till en besläktad form som är gemensam för varianter hos ett ord. Detta gäller förstås inte de fall där det är frågan om stamändring då man måste lägga till speciella regler som tar hänsyn till detta. Alla ord i indatan och orden i de dokument som ska genomsökas bearbetas/behandlas av stemmingalgoritmen för att sedan kunna matchas. I informationssökningssammanhang är det inte ett krav att den stam som genererats är ett riktigt ord. Som exempel kan computation bli comput istället för compute. Detta är inte något problem så länge som obesläktade ord ej kopplas ihop. I annat fall kan felaktiga stammar kan genereras och vissa kommer orsaka mer skada än andra. Dels kan det bildas nonsensord och det är då oftast frågan om egennamn som modifierats. Exempelvis kan Kristoffer bli Kristoff då ändelsen -er tas bort. Ordformer som egentligen skall paras ihop kan efter tillämpningen av reglerna ha olika stammar. Samtidigt kan ord som är semantiskt olika bli felaktigt sammanfogade. Felen kan delas in i två grupper: 1. De ord som tillhör samma grupp men får olika stammar, t.ex. mus och möss. 2. De ord som tillhör olika grupper men får samma stam, t.ex. verbet boka och substantivet bok. Genom att räkna dessa fel kan man få en uppfattning om hur bra en stemmer är och framför allt jämföra den med andra (O'Neill & Paice 1994). Det finns olika typer av stemmers och man brukar dela in dem i regelbaserade, statistiska och sådana som är en kombination av dessa två. De regelbaserade är försedda med lingvistisk kunskap såsom listor med suffix, prefix och regler som utarbetats manuellt. Den statistiska gruppen använder t.ex. information om vilka ändelser som är mest frekventa.även trigram kan användas för att hitta ord som är eller kan vara morfologiskt besläktade. Den här gruppen stemmers letar efter möjliga stammar för alla ord i en text och försöker på så sätt avgöra vad som är en tänkbar ändelse. Som input ges en korpus som har en minimigräns för antalet ord den bör innehålla. Med en för liten korpus blir det svårt att få en klar bild av hur orden är uppbyggda. Poängen är att man ska kunna hitta regelbundenheter i språket. Den kombinerade gruppen är stemmers som t.ex. använder statistiska metoder som en stödfunktion men inte är helt beroende av dessa. Tre stemmers som tillhör de mest kända är Lovins, Paice/Husk och Porter (Paice, 1994). I följande kapitel följer en beskrivning av var och en. 2.6.1 Lovins stemmer Lovins stemmer utvecklades 1968 av Julie Beth Lovins vid Massachusets Institute of Technology (MIT) och det var den första stemmingsalgoritmen som publicerades. Den gjordes för användning inom både informationssökning och datorlingvistik. Detta gjorde det hela problematiskt och den visade sig inte vara bättre på någon av de två 10

områdena. Lovins består av tre delar: ändelser, villkor och modifieringsregler för engelska. Antalet ändelser är 294 och varje ändelse är ihopkopplad med något av de 29 villkoren. Algoritmen arbetar i två steg: 1. Det längsta suffixet som hittas i ordet tas bort förutsatt att villkoret uppfylls. Villkoren ställer krav på hur lång den återstående stammen bör vara och/eller efter vilka bokstäver som ändelsen får plockas bort. 2. Sedan tillämpas modifieringsreglerna oavsett om ett suffix tagits bort eller ej. Ändelserna är indelade i grupper beroende på längd med de längsta först och följs av ett villkor som representeras med en versal. De längsta ändelserna består av 11 bokstäver och de kortaste av en. Exempel 13 visar ändelser med längden 8: Exempel 13.08. ableness A arizable A entation A entially A eouness A ibleness A icalness A ionalism A ionality A ionalize A iousness A izations A lessness A För varje villkor gäller även att stammen inte får vara mindre än 2 tecken lång. Villkoret A innebär att inga krav ställs på den resulterande stammen (förutom att den bör vara minst två tecken lång). Nedan följer ytterligare exempel på villkor där * står för vilken bokstav som helst: Exempel 14 B Stammens minimilängd är 3 E Ta ej bort ändelse om den föregås av e H Ta endast bort ändelsen om den föregås av t eller ll Q Stammens minimilängd är 3 och ändelsen får ej tas bort om den föregås av l eller n X Ta endast bort ändelsen om den föregås av l, i eller u*e Om stammen bör vara längre än 2 tecken kan detta specificeras med ett villkor t.ex. B. Efter att listan med suffix sökts igenom efter en möjlig ändelse bearbetas stammen. Det kan vara frågan om bokstäver som tas bort eller ersätts: Exempel 15 iev -> ief urs -> ur ert -> ers yt -> ys Orden believe, matrix och analytic får formerna belief, matric och analys. Exempel 16 believe -e -> believ iev -> ief -> belief matrix - -> matrix ix -> ic -> matric 11

analytic -ic -> analyt yt -> ys -> analys Sammanfattningsvis kan man säga att Lovins består av en lång lista med suffix som till viss del är begränsad men behandlingen av korta ord kan vara en aning destruktiv. Ändelserna -ements och -ents finns t.ex. inte med. I en artikel om hur man utvärderar stemmers (Paice, 1994) kom man fram till att detta är en stemmer med högt understemming index (UI). Detta innebär att ord som tillhör samma stam inte alltid kopplas ihop. Lovins var genomgående sämre än Porters och Paice/Husk som jämförs i artikeln. Det är en försiktig stemmer som inte alltid reducerar de ord den borde. 2.6.2 Paice/Husk stemmer Denna stemmer var resultatet av ett sammarbete mellan Chris Paice och Gareth Husk på Lancaster University i slutet av åttiotalet. Alla regler finns samlade i en fil men är indelade i alfabetiskt ordnade sektioner. Under sektion a finns regler för ord som slutar på a o.s.v. En regel tar antingen bort eller ersätter en ändelse. Genom denna indelning i sektioner kan man snabbt komma åt de regler som tillhör en viss ändelse. Stemmern är iterativ vilket innebär att den kan tillämpa flera regler för ett ord. Algoritmen kan delas in i 4 steg. I det första steget tittar man på den sista bokstaven i ordet och undersöker om det finns någon sektion för denna. Om det inte finns någon sektion som behandlar den bokstaven avslutas algoritmen, annars tas den första regeln fram. En regel består av fem delar varav två är optionella: 1. En ändelse som består ev en eller flera bokstäver skriven i omvänd ordning 2. En optionell flagga * som betyder att ordet måste vara intakt för att ändringen skall ske 3. En siffra som anger hur många bokstäver som skall plockas bort 4. En optionell sträng som läggs till 5. Symbolen. eller > som avgör om algoritmen skall avslutas eller ej För att en regel skall tillämpas krävs även att vissa allmänna villkor uppfylls. Dessa har skapats för att stammarna inte ska bli för korta och orden reduceras till en bokstav. Första villkoret säger att om ett ord börjar på vokal måste stammen bestå av minst två bokstäver. Det andra villkoret säger att om ett ord börjar på konsonant måste stammen vara minst tre bokstäver lång och minst en av bokstäverna måste vara en vokal. När regeln tillämpas tas det angivna antalet tecken bort och finns det en sträng som skall läggas till görs detta. Avslutas regeln med < återgår algoritmen till det första steget där sista bokstaven i ordet undersöks, är symbolen däremot. avslutas processen. Reglerna kan ha följande form där det som står inom { } är ändelsen före och efter regeln tillämpas: Exempel 17 1. ai*2. { -ia > - } 2. deec2ss. { -ceed > -cess } 3. nois4j> { -sion > -j } 12

Med den första regeln tas -ia bort förutsatt att inga ändelser tagits bort tidigare. Med hjälp av nästa regel reduceras ändelsen -ceed till -ce och därefter läggs -ss till. Den tredje regeln behandlar ändelsen -sion som byts ut mot -j. J änvänds här som ett mellanled för att komma vidare till en ny sektion. Ordet provision blir provij och görs sedan om till provid med hjälp av regeln ji1d. Ett bättre alternativ vore att byta ut dessa ändelser mot andra tecken än bokstäver (Paice, 1990) men detta är inte möjligt i den nuvarande versionen. Ingen formell utvärdering har gjorts av denna stemmer. Enligt en artikel (Paice, 1994) där tre stemmers jämförs har Paice/Husk ett högt overstemming index (OI). Detta innebär att ord som tillhör olika stammar paras ihop till samma grupp. Denna stemmer är konstruerad så att den hellre parar ihop ord än avstår från detta. Den kan vara lämplig att använda i de fall då man söker information och inte vill gå miste om något. Detta innebär samtidigt att man kan sortera bort en del irrelevant information. 2.6.3 Porters stemmingsalgoritm Porters stemmingsalgoritm skapades 1980 av Martin Porter vid universitetet i Cambridge (Porter, 1980). Algoritmen bygger på att ändelserna i engelskan är uppbyggda av kortare, enklare suffix. Den består av fem steg som innehåller olika regler där suffix plockas bort om villkoret för regeln uppfylls. Om regeln tillämpas skickas ordet vidare till nästa steg. Den är välanvänd och finns implementerad på flera språk såsom Java, C och C++. Det är förmodligen den stemmer som används flitigast när det gäller forskning inom informationssökning. När algoritmen tillämpas kommer ord med gemensam stam att samlas i en grupp. Exempelvis skulle följande ord grupperas: Bilen Bilarna Stuga Stugor Cykla Cyklade Bil Bil Stug Stug Cykl Cykl Bil Stug Cykl Figur 2 Gruppering av ord med gemensamma stammar. Beroende på vad den ska användas till kan en stemmer bestå av olika typer av information. Den kan innehålla ett stamlexikon eller en lista med suffix. När man skapade Porters stemmingsalgoritm var syftet att öka prestandan vid informationssökning och man förser därför algoritmen med en lista med suffix och tillhörande villkor. Man bör tänka på att suffixen tas bort i syfte att förbättra resultatet vid informationssökning. Det är alltså inte självklart under vilka omständigheter ett suffix borde tas bort. Exempelvis så får orden relate och relativity samma stam trots att de betyder helt skilda saker. I början när man skriver regler förbättras resultatet tills man kommer till en punkt då reglerna är så pass många att de påverkar vissa ord negativt. När man lägger till en ny regel kan det hända att de förbättringar som den gör är lika 13

många som de fel den orsakar. Villkor för regler Ett villkor för en regel kan se ut på följande sätt: Exempel 18 (m > n) där m(measure) är ett mått på antalet vokal-konsonant kombinationer som finns i ett ord och där n står för ett heltal som oftast ligger i intervallet 0-2. Porter definierar en konsonant på följande sätt: en konsonant är en bokstav annan än/skiljt från a, e,i,o, eller u och annan än y om y föregås av en konsonant. I ordet toy blir t.ex. t och y konsonanter. De kombinationer av konsonanter och vokaler kan förekomma i ett ord kan sammanfattas med : Exempel 19 (C) VC m (V) C står för en lista av konsonanter och V för en lista av vokaler. Längden på listan måste vara större än 0. Som nämnts tidigare är m ett mått på antalet vokal-konsonant kombinationer som finns i ett ord. Villkoret kan även bestå av andra delar, där man ställer andra krav på hur stammen ska se ut: *S - stammen slutar på s. *v* - stammen innehåller en vokal. *d - stammen slutar på dubbel konsonant. *o - stammen slutar på bokstavskombinationen CVC där den andra konsonanten inte får vara någon av bokstäverna: w, x eller y. Nedanstående exempel från Porters stemmingalgoritm för engelska visar hur en regel kan se ut: Exempel 20 (m > 1) EMENT -> Regeln innebär att den återstående stammen bör innehålla minst två vokal-konsonant kombinationer för att EMENT skall plockas bort. Ex. replacement -> replac. En annan typ av regel som kan förekomma är: Exempel 21 (m = 1 and *o) -> E Här bör värdet på m vara exakt ett och stammen skall sluta på vokal-konsonant-vokal för att e skall läggas till. Ex. fil(ing)-> file. Genom att studera hur stammarna skulle se ut efter borttagning av suffixen valde man 14

att använda ett villkor för hur kort en stam får vara. Detta baseras på iakttagelser för att förbättra algoritmen. Porter testade sin algoritm på ett lexikon med 10000 ord för att se hur mycket det kunde förminskas. Stamlexikonet, som skapades med hjälp av algoritmen, innehöll 6370 unika stammar (Porter, 1980). Det ursprungliga lexikonet reducerades med en dryg tredjedel. 2.6.4 Porters stemmingsalgoritm för svenska Algoritmen för svenska består av tre steg där en ändelse plockas bort om villkoret uppfylls(porters stemmingsalgoritms hemsida). För att tillgodose villkoret krävs att ändelsen föregås av minst en vokal-konsonant kombination. Området efter den här kombinationen kallas för R1. R1 syftar på rot 1, inom vissa språk använder man sig även av R2. Det står för rot 2 och är området efter vokal-konsonant följt av vokalkonsonant. Första steget plockar bort den längsta av följande ändelser som matchar ordet: 1a. a arna erna heterna orna ad e ade ande arne are aste en anden aren heten ern ar er heter or as arnas ernas ornas es ades andes ens arens hetens erns at andet het ast I första steget plockar man även bort -s förutsatt att föregående bokstav är någon av följande: 1b. b c d f g h j k l m n o p r t v y I steg 1b. är det inte ett krav att ändelsen finns inom R1. Steg två letar efter följande konsonantpar där den sista bokstaven tas bort: 2. dd gd nn dt gt kt tt Tredje och sista steget innehåller fem ändelser som antingen tas bort eller modifieras: 3. lig ig els -> tas bort löst -> ersätts med lös fullt -> ersätts med full 2.7 Ordklasstaggning Som nämnts tidigare kan automatisk morfologisk analys användas inom ordklasstaggning. Ordklasstaggning innebär att man tilldelar varje ord i en korpus en 15

ordklass eller annan lingvistisk information. Det finns regelbaserade samt statistiska taggare. De statistiska taggarna räknar ut sannolikheten för en viss kombination av ordklasser medan de regelbaserade ordklasstaggarna gör sina bedömningar efter de regler de har. I nästa avsnitt presenteras en effektiv ordklasstaggare som används i utvärderingen av examensarbetet. 2.7.1 TnT TnT, som står för Trigrams'nTags, är en statistisk ordklasstaggare gjord av Thorsten Brants (Brants, 2000). Den kan lätt tränas upp för olika språk och taggset. Den är inte anpassad för ett visst språk utan man har koncentrerat sig på att den ska kunna hantera stora korpora. Taggaren är enkel att använda tillsammans med ett nytt språk, nytt taggset eller ny domän. Ordklasstaggaren är baserad på Markov modeller. Till taggaren hör en lexikonfil och en språkmodell. Inputfilen måste innehålla en token per rad för att programmat skall kunna göra en analys. Varje token skall stå på en egen rad och ingenting annat får stå på den raden. Skulle ett mellanslag komma med så ignoreras allt efter mellanslaget. Filen kan innehålla tomma rader som kan representera meningsslut eller paragrafslut. För kommentarer i filen används %%. TnT tar som argument en flagga(ej nödvändig), en språkmodell och en textfil: tnt [options] model corpus. Den taggade filen är tämligen lik den otaggade. Här finns en extra kolumn med själva taggen. Första kolumnen är alltså token och andra kolumnen taggen och allt efter den andra kolumnen ignoreras. Exempel 21 But CC the DT day NN of IN the DT deadline NN came VBD and CC passed VBD TnT är snabbast när det gäller taggning och träning. Metoden har även visat sig vara bäst när det gäller noggrannhet. Mellan 96 och 97 % av alla ord taggas korrekt beroende på språk och taggset. Enligt ett test gjort på tyska tidningar blir resultatet 8,7 % bättre om ordet är känt. Till och med träningstexter på 1000 ord kan ge ett bra resultat. 2.8 Xplain Enligt en undersökning utförd av Organisation for Economic Co-operation and Development (OECD) har var fjärde svensk så stora läs- och skrivsvårigheter att han/hon har svårt att förstå en artikel i en dagstidning. Det är viktigt att alla ska kunna ta del av den information som ges på t.ex. statliga webbsidor om vad som händer i samhället. Xplain är ett program som förklarar svåra ord och uttryck på hemsidor. Tyngdpunkten ligger på de mer komplicerade orden. 16

Varje kund förses med ett konto, där han/hon kan gå in och lägga till eller ta bort information. Det finns möjlighet att välja hur många ordlistor man vill ha på sitt konto. Man kan exempelvis ha en ordlista per ämnesområde.varje kund sköter alltså sina ordlistor och lägger till nya ord vid behov. För att använda tjänsten läggs en länk till Xplain på webbplatsen. Man behöver alltså inte göra någon installation på server eller dator. En förklaringsknapp läggs till på sidan och när användaren klickar på den laddas sidan om. De ord som har hittats i lexikonet följs av en liten knappsymbol. Genom att trycka på den lilla knappen får man ett pop-up fönster med ordförklaringen. Alternativt kan man låta förklaringen visas i Alt taggen. Då visas förklaringen när man håller muspekaren över ordet. Med hjälp av 'lyssna' funktionen som ingår kan man även få höra hur ordet uttalas och få förklaringen uppläst. Programmet är inte anpassat efter ett visst språk. Kunden skapar ordlistorna och lägger in förklaringar på det språk som önskas. På så sätt kan man t.ex. ha en sida med svensk text där orden förklaras på engelska. 17

3. Automatisk morfologisk analys för svenska Det här kapitlet beskriver utvecklingen av det program som jag skapat. Eftersom Porters stemmingalgoritm tillhör en av de mest använda stemmers och finns tillgänglig för svenska har jag valt att implementera den och använda den som grund i uppgiften. Det är en enkel algoritm som består av ett fåtal steg. Utvecklingen av programmet kan delas in i följande steg: Implementering av algoritmen Bearbetning av texten Inläsning och modifiering av lexikonet Regelskrivning Träning Programmet är skrivet i C++ och består av ett antal moduler. Modulerna är gjorda på ett sådant sätt att de lätt skall kunna återanvändas. En modul kan vara uppbyggd av flera andra. 3.1 Implementering av algoritmen Första steget var att implementera Porters stemmingalgoritm för svenska. De ändelser som inte var avsedda för substantiv slopades. Detta gjordes initialt genom att jag tog bort ändelser från suffixlistan som var typiska för andra ordklasser. Ändelserna -ast och -aste som är typiska för adjektiv är exempel på suffix som plockades bort. Under arbetets gång då programmet testades lade jag till och tog bort ändelser. Exempelvis så lades suffixen -na och -et till. Varje regel gjordes som en egen funktion. I exempel 22 visas hur borttagning av suffixet -s såg ut: Exempel 22 string slutar_pa_s( string b, unsigned int i,unsigned int r) { if ( b[i-1]== 's'&& (b[i-2]== 'b' b[i-2]== 'd' b[i-2]== 'c' b[i-2]== 'f' b[i-2]== 'g' b[i-2]== 'h' b[i-2] == 'j' b[i-2]== 'k' b[i-2] == 'l' b[i-2] == 'm' b[i-2]== 'n' b[i-2] == 'o' b[i-2]== 'p' b [i-2]== 'r' b[i-2]== 't' b[i-2] == 'v' b[i-2]== 'y')) { unsigned int c = i-1; if(r <=c) b = b.erase(c,1) } return b; } Regeln säger att ett finalt s skall tas bort hos ett ord förutsatt att bokstaven innan är någon av dessa: b, d, c, f, g, h, j, k, l, m, n, o, p, r, t, v eller y. Exempelvis så blir bils -> bil och bords -> bord. När algoritmen var implementerad gjorde jag ett litet program med ett ord som input, som sedan fick genomgå algoritmens olika regler. Som grund för att utöka reglerna användes ord ur boken The Morphology of Present-Day Swedish (Hellberg, 1991) 18

och en lista med mönsterord. Under arbetets gång lade jag till regler, byggde på programmet och gjorde vissa ändringar. 3.2 Programmets uppbyggnad Som input tar programmet en textfil, en lexikonfil och en flagga. Sedan görs en jämförelse mellan lexikon- och textfilen för att finna matchningar. Flaggan kan vara antingen: -skalad eller -exakt. Med flaggan -exakt modifieras inte orden innan matchning. Flaggan -skalad innebär att orden först matchas oförändrade. Om detta inte ger något resultat reduceras orden till stammar och matchas igen. Flaggan -skalad innebär en mindre säker matchning men kan samtidigt ge fler resultat. Anropet kan alternativt se ut så här: Exempel 23./xplain text.txt lexikon.txt -exakt Man kan säga att det finns två primära funktioner i programmet: 1. En funktion som bl.a. tar lexikonet och texten som argument. Funktionen går igenom lexikonet och plockar ut det längsta uttrycket. Detta skickas därefter vidare till nästa funktion. 2. I den här funktionen jämförs texten med lexikonuttrycket. Jämförelsen kan ske på två olika sätt beroende på valet att flagga. Dessa två funktioner består i sin tur av ett antal mindre funktioner. Nedan ges ett exempel på programmets input: Lexikonfil Befolkning =invånare Lilla Essingen = stadsdel i Stockholm Textfil Bortsett från Hammarby sjöstad växer Lilla Essingen snabbare än någon annan stadsdel i Stockholm. Förra året ökade befolkningen med 618 personer. Figur 3 Programmets input. Den första funktionen väljer ut det längsta uttrycket i lexikonet. Härvid avses antalet ord, i det här fallet Lilla Essingen. Den andra funktionen jämför texten och ordet och markerar med "*" i texten att ordet finns i lexikonet: 1. Bortsett från Hammarby sjöstad växer *Lilla Essingen* snabbare än någon annan stadsdel i Stockholm Förra året ökade befolkningen med 618 personer. Samma procedur upprepas för det näst längsta ordet i lexikonet o.s.v. och slutresultatet ser ut så här: 2. Bortsett från Hammarby sjöstad växer *Lilla Essingen* 19

snabbare än någon annan stadsdel i Stockholm Förra året ökade *befolkningen* med 618 personer. Ovanstående beskrivning är endast övergripande och i följande kapitel beskrivs funktionerna i programmet mer ingående. 3.2.1 Lexikonet En lexikonrad består av ett ord följt av ett "=" och därefter ordets betydelse. Det spelar ingen roll om ordet initieras med stor bokstav eller ej. Matchningen är inte beroende av detta. En lexikonrad har formen: Exempel 24 uttryck=förklaring För att kunna skriva kommentarer i lexikonet används "#". Denna rad ignoreras då vid inläsningen. 3.2.2 Inläsning av filer Programmet är uppbyggt på så sätt att alla filer som programmet använder först läses in och lagras. Detta görs för att spara tid och man slipper öppna dessa filer gång på gång. Lexikonfilen läses in och modifieras innan den lagras. Lexikonuttrycken grupperas efter det antal ord som ingår. En rad i lexikonet läses in och görs om till typen pair som består av två delar. Med följande kod omvandlar man lexikonraden till typen pair: Exempel 25 pair<string, string> * rad = paret(lexikon_rad) lexikon[flera][raknare[flera]].first = rad->first lexikon[flera][raknare[flera]].second = rad->second Den första delen av pair består av själva ordet/uttrycket som skall förklaras och kan nås genom att anropa first. Den andra delen innehåller förklaringen till ordet och anropas med second. Antalet ord i first räknas och beroende på detta placeras uttrycken i en tvådimensionell array. Under index 1 finns alla de lexikoningångar som består av ett ord o.s.v. Genom att strukturera lexikonet på detta sätt sparar man tid och får en bättre bild av innehållet. Lexikon Ny struktur Aktier pengar Inflations- och tillväxtmål finansiell rådgivning Index 1 2 3 Aktier finansiell rådgivning Inflations- och tillväxtmål pengar Figur 4 Lexikonets nya struktur. Man går systematiskt igenom lexikonet från det längsta till det kortaste uttrycket. I det 20

här fallet börjar man med att jämföra inflations- och tillväxtmål med texten och fortsätter sedan med finansiella intäkter. Av de två andra filerna som läses in innehåller en av filerna alla regler för segmenteringen av orden och den andra undantagsorden d.v.s. ord som ej får modifieras av reglerna. Dessa filer lagras som de ser ut d.v.s. oförändrade. 3.2.3 Start- och stopfunktionerna Dessa funktioner används för att kunna klippa ut den del av texten som skall jämföras med lexikonuttrycket. Man går igenom texten och klipper ut N ord åt gången. N motsvarar antalet ord i lexikonuttrycket. När man har gjort en jämförelse hoppar man fram ett ord och klipper återigen ut N ord. Exemplet nedan visar en text som jämförs med ett lexikonuttryck som består av två ord: Text Lexikon Flickan gick till Gröna Lund. Gröna Lund = nöjesfält i Stockholm Figur 5 Text och lexikonuttryck som skall jämföras. När texten och lexikonuttrycket skall jämföras får man följande ordpar att jämföra med: Exempel 26 Text Flickan gick matchar ej med lexikonuttrycket. 0 1 gick till 1 2 till Gröna 2 3 Gröna Lund 3 4 matchar ej med lexikonuttrycket. matchar ej med lexikonuttrycket. matchar med lexikonuttrycket. Ord 0 fungerar som startord dvs det första ordet i texten. Texten loopas igenom från ord 0 till n. Där n står för antalet ord i texten minus antalet ord i lexikonuttrycket. I det här fallet blir n=3 (5-2). Detta innebär att programmet slutar när ord 3 och 4 har jämförts med lexikonuttrycket. 3.2.4 Bearbetning av texten Innan en jämförelse mellan ett lexikonuttryck och en textdel kan göras behöver man på något sätt rensa bort tecken som inte är relevanta i det här sammanhanget. Det kan vara frågan om t.ex. punkt eller kommatecken. En funktion som tar bort överflödiga tecken är nödvändig. En fråga är hur noggrann rensningen skall vara. 21

En funktion som slopar alla tecken som inte är bokstäver tar bort för mycket information. Siffror kan utgöra en del av ett ord och man förlorar en del av betydelsen om man tar bort dessa. En felmatchning kan då förekomma. Efter att ha tittat på olika texter bestämde jag mig för att funktionen skulle bestå av fyra delar som genomförs i ordningen: 1!., tas bort om det som kommer efter är ett blanktecken. 2 ( ) ' tas alltid bort. 3 - tas bort om det följs av radbrytning d.v.s att det är frågan om ett ord som delats på två rader. Bindestrecket tas bort och ordet dras ihop. 4 ser till att det bara förekommer ett mellanslag mellan två ord samt lägger till ett mellanslag före och efter ett ord. I den första delen tas tecknen bort om de förekommer sist i ett ord. På så sätt kommer inga förkortningar att tolkas som riktiga ord. I den andra delen tas tecknen alltid bort eftersom ett ords betydelse inte påverkas av dessa tecken. Del tre tar aldrig bort bindestreck om det är fråga om två ord. Genom del fyra, som ser till att varje ord omges av mellanslag, kan inga matchningar på delsträngar ske. Nedan visas en text före och efter bearbetning : Före Vill du ha en röd, blå eller svart bil? Efter Vill du ha en röd blå eller svart bil Figur 6 Text före och efter modifiering. Innan man jämför lexikonuttrycken och texten görs alla stora bokstäver om till små. Utan bokstavskontrollen skulle det bli problem med t.ex. ordet Städer. Städer reduceras först till Städ genom att suffixet er tas bort. Sedan bör Städ få formen stad genom en omljudsregel som säger att städ skall omvandlas till stad. Eftersom Städ och städ skiljer sig åt kommer ingen matchning att ske. Genom att göra om alla stora bokstäver till små försvinner problemet. 3.2.5 Ordräkning En funktion som som används på flera ställen i programmet är antalet_ord som räknar antalet ord i en given text. Det var därför viktigt att funktionen fungerade på ett bra sätt. Till en början användes funktionen bara för att räkna orden i lexikonuttrycken. Det var en enkel funktion som som bara räknade antalet mellanslag i ett lexikonuttryck, vilket fungerade bra. När man sedan behövde använda den i andra 22

sammanhang t.ex. räkna orden i en text gjordes en del modifieringar. Funktionen letar efter tecken som inte är ett blanktecken (t.ex. en bokstav, en siffra eller. ) följt av ett blanktecken d.v.s. nyradstecken, tabtecken eller mellanslag. Uppfylls detta krav ökas antalet ord med 1. I meningen Idag snöar det. skulle antalet ord då bli 3. G i idag följs av ett mellanslag, liksom r i snöar och t i det följs av ett nyradstecken vilket ger det korrekta värdet 3. Ett problem som löstes genom att modifiera funktionen var att de sista orden i en texten inte markerades trots att de fanns med i lexikonet. Detta kunde bero på två saker: 1. De sista orden hittades inte i lexikonet, vilket bl.a. kunde bero på att orden reducerades till felaktig stam och därför inte matchades med lexikonuttrycken. 2. De sista orden inte ens jämfördes med lexikonet. Efter att ha kontrollerat att orden reducerades till en korrekt stam och testat att orden markerades om de lades in i början av texten kunde jag utesluta det första alternativet. Som nämnts tidigare loopar man igenom texten och plockar ut de textdelar/ord som skall jämföras med ett lexikonuttryck. Som argument i loopen finns bl.a. antalet ord i texten. Om detta är för lågt kommer loopen att stanna för tidigt och de sista orden jämförs aldrig med lexikonuttrycket. Att antalet ord i texten blev för lågt berodde på att de ord som inte följdes av mellanslag t.ex. de sista ordet på en rad, inte räknades. I den nya funktionen har jag tagit hänsyn till detta. 3.2.6 Matchning När en matchning har gjorts vill man på något sätt spara de ord som matchats i texten. Som resultat vill man ha ordens position i texten för att sedan koppla ihop dem med respektive förklaring. För varje matchning vill man ha en start- och stopposition för ordet/uttrycket i texten. I det här fallet användes dessa positioner enbart för att markera orden i texten och på så sätt ser man att resultatet blir korrekt. Programmet använder sig av en lista av en egen datatyp (en s.k. struct) där information om matchningar sparas. Den här sammansatta datatypen tillåter att man själv bestämmer vilka medlemmar den ska ha. Typen har döpts till matchning och har följande form: Exempel 27 struct matchning{ unsigned int starttposition; unsigned int stopposition; pair<string, string> * lexikon; }; Man får då en lista som består av enheter med medlemmarna start- och stopposition för ett visst ord och även en pekare till förklaringen. Start och stop ger en siffra som står för ett teckennummer. Listan fylls på efterhand. Avslutningsvis går man igenom listan och före varje start- och efter varje stopposition sätts * för att markera ordet/orden. 23