Anpassning av en fonetisk algoritm till svenska

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