Anpassning av en fonetisk algoritm till svenska Projektskiss i kursen ”Språkteknologisk forskning och utveckling” Sandra Derbring 1. Bakgrund I dagens läge finns många program för stavningskontroll ute på marknaden. De enklaste matchar ett inskrivet ord mot en inlagd ordlista och markerar om ordet inte finns med i den. Lite mer komplexa program utnyttjar också regler för att föreslå korrekta stavningsförslag. Dessa program utgår från bland annat n-gramsbaserade metoder eller Minimum Edit Distance, som grundar sig på vetskapen om att de flesta fel beror på inskrivning och inte felstavning, samt att ordet bara innehåller ett stavfel. Metoderna utgår alltså från att det felskrivna ordet är av ungefär samma längd som det rätta; samt att de felskrivna bokstäverna ligger nära de rätta på tangentbordet. Dessutom antar man att den första bokstaven sällan är felskriven. En n-gramsbaserad metod ger orden sannolikhet efter hur många trigram de har gemensamt. En bakvänd MED-metod beräknar antalet nödvändiga editeringsoperationer och rangordnar efter detta. Dessa metoder fungerar för vanliga skribenter, som i första hand behöver bli uppmärksammade på sina performansfel, och som själva kan välja vilket av förslagen som passar bäst. Det finns dock en grupp användare som inte har lika stor nytta av denna teknik, men som skulle behöva den. Lika ofta som de blandar ihop bokstäver (vilket skulle kunna lösas med tidigare nämnda tekniker), stavar dyslektiker ofta utifrån hur ordet låter. Detta gör att deras felskrivningar inte alls behöver få en stor likhet med den sträng de egentligen ville skriva. De har också problem att i en lista med korrigeringsförslag välja det rätta. Den här gruppen av användare behöver en stavningskontroll som i alla fall delvis baseras på andra metoder. Det finns ett par fonetiska algoritmer, varav den äldsta och mest kända är SOUNDEX. Algoritmen tilldelar varje ord en likhetsnyckel enligt ett visst mönster och tar sedan fram ord med samma nyckel som förslag. SOUNDEX är en ganska grov algoritm, som fungerar bra i vissa sammanhang men som har vissa klara brister. Bland annat utgår SOUNDEX från att första bokstaven alltid är rätt. Detta behöver inte vara fallet om ordet börjar med ett ljud som har många olika stavningar. SOUNDEX är utvecklad för engelska, och har språkspecifika regler, vilket inte gör den direkt applicerbar på svenska. Det har gjorts ett par anpassningar och utvecklingar av algoritmen, bl.a. Double Metaphone, men också dessa är utvecklade för engelska. En anpassning av SOUNDEX, dels för svenska, dels för att förbättra resultaten vore en intressant uppgift som skulle kunna få en praktisk användbarhet. 2. Problemställning Mitt projekt syftar rent generellt till att förbättra stavningskontroller för att underlätta för dyslektiker genom att arbeta med en ljudbaserad felkorrigeringsmetod. Mer specifikt kommer jag att utgå från den fonetiska algoritmen SOUNDEX och anpassa den för svenska, samt för typiska dyslektiska feltyper. I arbetet kommer jag troligen att utnyttja fördelarna hos de befintliga metoder som nu finns i kombination med egna tillägg eller anpassningar. Stavningsprogram brukar ofta delas upp i tre delar: feldetektering, korrektionsgenerering och korrektionsrangordning. Feldetekteringen kommer troligen inte vara signifikant annorlunda från redan befintlig sådan utan jag kommer koncentrera mig på felkorrigeringen – det vill säga hitta ersättningsförslag och sedan rangordna dem. 3. Metod 3.1. Generering av korrekta förslag 3.1.1. Datainsamling För att kunna anpassa SOUNDEX-algoritmens regler bör vi veta någonting om hur svenska stavfel vanligtvis ser ut. Vi behöver alltså samla in material om de typiska stavfel en svensk dyslektiker gör. Detta kan göras med hjälp av en korpus. Projektet SCARRIE utvecklade en korpus baserad på 9000 autentiska fel från tidningstexter. Det finns även ett antal andra felkorpusar. De är inte riktigt typiska för den sortens kompetensfel vi letar efter, men en liknande korpus med avseende på dyslektiker kan användas, eller byggas upp om så krävs. En felkorpus kan byggas upp genom att man använder sig av en stor mängd ordpar, där ena ordet är en felstavning av det andra. Korpusen kan också bestå av fria texter, men där alla felstavningar är mappade till sin rätta stavning. 3.1.2. Regelskrivning Nästa steg blir att skapa de regler som ska ligga till grund för algoritmen. Då systemet bygger på likhetsnycklar, måste vi tilldela varje ord en nyckel för att kunna jämföra ord med varandra. SOUNDEX antar att första bokstaven alltid är densamma i det felstavade ordet såväl som i det korrekta, men det antagandet håller inte om vi betänker att ett ord kan börja med ett ljud som kan stavas på många olika sätt (tjuta, skjuta). SOUNDEX tar heller inte hänsyn till vokaler, vilket nog blir nödvändigt i det här projektet, eftersom det är en stor källa till fel i svenskan. Utan att närmare ha undersökt vilka feltyper en dyslektiker gör, kan följande hypoteser kanske belysa problemet: o-å (kolla/kålla); e-ä (hemlig/hämlig); y-u (cykel/sukel); o-u (ergonomisk/ergunomisk); ie-ije (associera/associjera); e-a (Sverige/Svarge). Eftersom nycklarna baserar sig på ljud, måste orden delas upp i fonem och klassas efter ljudgrupp. Detta innebär att det lexikon orden hämtas från måste vara fonetiskt transkriberat. Ljud som är lätta att förväxla läggs i samma ljudgrupp (sje-ljud, vokaler, nasaler, labialer, frikativor, klusiler etc.). Liksom i SOUNDEX förenklas dubbelkonsonanter till bara en konsonant. En given anpassning av algoritmen för svenska är att den ska klara av även å, ä och ö. SCARRIE har som ett delprojekt listat typiska kompetensfel samt en uttömmande regelbeskrivning av svenska stavnings- och uttalsregler som man skulle kunna använda. 3.1.3. Uppmärkning och generering Den ordlista som ska användas i stavningsprogrammet bör nu med hjälp av algoritmen uppmärkas med likhetsnycklar. Varje gång systemet upptäcker ett felstavat ord, tilldelas också detta ord en likhetsnyckel. De ord som då kan genereras som rättningsförslag blir de ord som har samma nycklar. Algoritmen känns relativt enkel att implementera. Som programspråk skulle jag välja Python, dels för att det är ett intuitivt språk, dels för dess lätthanterliga lexikonfunktion. 3.2. Rangordning av korrekta förslag Ett problem med den engelska versionen av SOUNDEX är att den är alltför grov och genererar många resultat – det är många ord som kan ingå under en nyckel, särskilt om man inte begränsar begynnelsebokstaven. Hur det blir för svenska efter våra regelomskrivningar låter vi vara osagt, men risken finns att listan på korrigeringsförslag blir lång, särskilt om det handlar om korta ord. Då stavningskontrollen är gjord för dyslektiker är det naturligtvis av största vikt att förslagen är relevanta och så bra ordnade som möjligt eftersom personen själv kanske inte kan urskilja vilket av förslagen som är rätt. Hur kan man då bäst rangordna listan (och kanske till och med utesluta ord ur den)? Om man arbetar med n-gramsbaserade metoder är det vanligt att man ger de ord som har flest n-gram gemensamt med det felstavade ordet hög rangordning. Vid regelbaserade system kan man använda sig av statistik för hur vanliga feltyper är och ge reglerna värden. En liknande statistisk rangordning skulle kunna appliceras här: att helt enkelt rangordna de förslag man har efter vilka typer av fel som korrigerats. Det förslag som är resultatet av att ha rättat det fel som är statistiskt mest sannolikt kommer att rangordnas högst. När man arbetar med ljudbaserade system är det inte säkert att det ord som är det avsedda ligger närmast det felstavade ordet på ett mätbart sätt. Istället bör en kontextbaserad statistik utföras, både med syftning till syntaktisk och semantisk kontext. 3.2.1. Syntaktisk parsning Ett sätt att utesluta mindre relevanta förslag är att se huruvida de tillhör en ordklass som skulle kunna passa in i meningen. Ett intuitivt sätt att lösa detta är att parsa texten eller meningen för att få en analys. Parsern kan antingen vara regelbaserad eller exempelbaserad. Viktigt är att parserns lexikon är stort, så att inga ord i onödan får en partiell eller felaktig parsning. Detta skulle kunna hända ändå, om flera av orden i meningen är felstavade eller grammatiskt inkorrekta. En alternativ lösning skulle kunna vara att ordlistan taggas med ordklassinformation och ett antal mönster för hur ordklasser får kombineras används, vilket på så sätt skulle ta fram ordklassen på den tagg som ska ersättas. 3.2.2. Disambiguering Om den syntaktiska parsningen uteslöt ord av fel ordklass, kommer listan nu bestå av ett antal ord med samma ordklass och ytligt sett samma sannolikhet att vara det rätta. En analys av kontexten kan här vara till stor hjälp för att kunna föreslå rätt ord. Hur man ska gå tillväga här har jag ännu inte helt tagit ställning till; ett förslag är att använda kollokationer – se vilka ord som omger ordet och utifrån en rättstavad korpus hitta vilket av rättstavningsförslagen som har högst frekvens för denna kollokation. 4. Ytterligare förbättringar Vi har nu talat om hur man kan förbättra själva algoritmen för att föreslå rättstavade relevanta ord och att rangordna dessa. Ett par komponenter som inte inkluderas i algoritmen, men som skulle förbättra det slutgiltiga resultatet kan vara värda att nämnas. För det första bör man se till att lexikonet som stavningskontrollen använder sig av är stort, och gärna att det innehåller namn och sammansättningar, i alla fall i en viss utsträckning. För det andra kan stavningskontrollen kombineras med en grammatisk kontroll. För det tredje är det en god pedagogisk idé att presentera förslagen på rättstavningar tillsammans med en exempelmening, så att användaren kan få underlag för att välja det ord som passar bäst. 5. Utvärdering För att utvärdera algoritmen skulle det vara intressant att utvärdera den ur flera perspektiv. Den är ju framförallt utvecklad för att passa ljudbaserade stavfel, och förhoppningen är ju att den ska förbättra korrektionen för sådana. Därför skulle jag vilja köra en text med typiska sådana stavfel, dels genom min algoritm, dels genom de andra typer av metoder som finns (Minimum Edit Distance, n-gram, probabilistisk och statistisk metod), dels mot den ursprungliga SOUNDEX-algoritmen. Jag skulle också gärna vilja se om denna typ av anpassning höjer resultaten för mer vanliga stavfel, så en körning mot samma system med en ”vanlig” felstavad text skulle jag också göra. Det är även intressant att veta hur stor textmängd som krävs för att få tillförlitliga resultat och var gränserna går, så jag skulle använda mig av olika stora mängder data. Det man mäter är hur hög precision och recall man får, framför allt i rangordningen på resultaten (vilket ord rekommenderades främst och var det rätt?), dels på själva genereringen. Man kan också testa med stickprov av vissa typer av felstavningar (ambiguiteter, ljudbaserade felstavningar, homofoner etc.). Också resurser för systemet är intressant att beakta i termer av minnes- och tidsåtgång. Kanske skulle också en kvalitativ utvärdering med en tänkt användare vara intressant. Referenser [1] http://www.oribi.se/ [2]www.nada.kth.se/utbildning/grukth/exjobb/rapportlistor/2004/rapporter04/ericson_linus_0 4045.pdf [3] http://www.lingfil.uu.se/ling/wp/wp3b.pdf [4] http://www.ddj.com/cpp/184401251?pgno=2 [5] http://www.dcs.bbk.ac.uk/~roger/spellchecking.html [6] http://stp.lingfil.uu.se/exarb/arch/1999-001.pdf