Xenotag Probabilistisk uppmärkning av xenoglosser baserat på tecken-n-gram Martin WARIN STP, Uppsala Universitet m warin@hotmail.com Abstract Här beskrivs en metod att identifiera ord i en text vilka är på ett annat språk än värdspråket. Metoden bygger på sannolikhetsberäkning av teckenfrekvenser. En algoritm får träna sig på en text på värdspråket för att därefter kunna avgöra vilka ord i en främmande text på (huvudsakligen) samma språk som kommer från något annat än målspråket. Resultatet visar sig vara väldigt svagt även om det är bättre än slumpen eftersom det är svårt för algoritmen att skilja mellan främmande ord, låneord, egennamn och akronymer enbart på basis av teckenn-gram. Dessutom smyger sig en del helt vanliga värdspråksord in, utav vilka många skulle kunna hållas ute med heuristik och/eller ordfrekvens-filter. 1 Inledning Att kunna identifiera ord som inte tillhör det språk man arbetar med är mycket viktigt, då de kan störa ens analys avsevärt om de behandlas som tillhörande värdspråket. I det här arbetet beskrivs en metod för att hitta sådana ord, vilka jag kallar xenoglosser. Jag hade fått för mig att ordet xenogloss var allmänt vedertaget i lingvistik-kretsar, men det visade sig vara ett ord som inte används annat än av enstaka tyska lingvister 1. Alltså ger jag här en definition av vad jag menar med xenogloss: xenogloss (grekiska, xenos (främling, gäst), glossa (språk)) En xenogloss är ett ord som inte tillhör värdspråket (språket i vars kontext det används). Xenoglosser är inte att förväxla med låneord. Där låneord inkorporeras i värdsspråket och 1 Xenoglossia eller xenoglossy är däremot tämligen väl använda termer, men behandlar det paranormala fenomenet där en person talar ett språk som hon eller han inte känner till. ofta anpassas fonologiskt är en xenogloss är mer som en tillfällig kodväxling, t.ex.: Det är många som gör en big deal av det.... I detta exempel har ingenting gjorts för att anpassa big deal till värdspråket i fråga om stavning eller dylikt, och även om många svensktalande förstår innebörden är det få som skulle anse uttryck som big deal vara en del av det svenska språket. En person som saknar engelskakunskaper kan bara gissa sig till betydelsen av uttrycket. På sätt och vis får en xenogloss en status som liknar egennamn; du måste känna till referenten i detta fall innebörden av det främmande språkstycket för att kunna avkoda betydelsen, och det finns ingen hjälp att hämta från värdspråket. 1.1 Syfte Jag vill med detta arbete undersöka om man med relativt enkla medel kan uppnå en godtagbar performans vad gäller identifiering av xenoglosser medelst grafotaktisk analys 2. Ett delsyfte är att undersöka hur pass språkoberoende denna metod kan göras. Resultatet förväntas vara en robust, språkoberoende xenogloss-taggare med godtagbar performans. 1.2 Tidigare forskning Relevanta artiklar om liknande arbete har varit svåra att finna. Det finns en intressant uppsats av (Nylander, 2000) där grafotax används för att identifiera fel en OCR-läsare (Optical Character Recognition) begått. En av metoderna hon använde var att kontrollera vilka trigram som var mer frekventa i det med OCR inlästa materialet än i orginalmaterialet. Sedan skrevs suspekta trigram i OCR-output om enligt automatiskt genererade regler. Hon prövade även att använda en på förhand bestämd grafotax baserad på en svensk fonotax (Sigurd, 1965). 2 Grafotax = ortografisk motsvarighet till fonotax, alltså det sätt på vilket ett skriftspråk organiserar sina tecken.
Av denna grafotax skapades regler för hur ords början och slut kan se ut, och ord som bröt mot dessa regler rapporterades som misstänkta fel. Den senare metoden visade sig släppa igenom allt för många fel, eftersom ord kan vara grafotaktiskt godtagbara men ändå icke-ord. Ett problem med svenskans grafotax som (Nylander, 2000) noterat är den näst intill oändliga variationsgraden som tillförs av svenska sammansättningar, vilka kan ge upphov till högst osannolika sekvenser av grafem, t.ex. världsschlager och tioöring. I engelska och andra språk som i större grad tillämpar särskrivning slipper man detta problem. I (Oh and Choi, 1999) används HMMmodeller över stavelse-n-gram för att identifiera låneord i koreanska. De uppnår en hög prestanda, med precision och recall på över 95%. I (Eklund and Lindström, 1998) (och flera andra artiklar av samma författare) studeras fonologiska aspekter av främmande ord i svenska. I artikeln studeras hur svensktalare förändrar sin fon-uppsättning vid uttal av främmande ord, särskilt engelska. Författarna menar att talaren lägger till främmande drag i sin fon-uppsättning drag som de kallar xenofoner och att det är viktigt att tänka på sådana fenomen när man konstruerar t.ex. program för taligenkänning. 2 Metod Jag kommer här att redogöra i grova drag hur den föreslagna metoden fungerar, därefter gå igenom dess testresultat. 2.1 Beskrivning av metoden Följande beskrivna delar har implementerats med var sitt Perl-program. 2.1.1 Träning Det första steget är att skapa en grafotaktisk modell av värdspråket. Detta görs genom att ta en rå text och utifrån den räkna ut frekvenser för uni-, bi- och trigram. I implementationen kan användaren själv bestämma vilket/vilka av dessa n-gram som ska skapas. Innan själva teckenräknandet påbörjas tas alla förekomster av siffror och initiala/finala skiljetecken bort ur texten. Enkla mellanslag behålls, men tabbar och sekvenser av mellanslag tas bort. I normalfall hoppas ord som innehåller en eller flera versaler över, eftersom de kan antas vara egennamn eller akronymer, och därmed kan antas avvika från värdspråkets grafotax. Denna funktion är optionell. I språk som tyska, där alla substantiv inleds med versal, kan den vara nyttig. Att ignorera ord som innehåller versaler i språk som t.ex. svenska eller engelska kan antas ge en högre grad av grafotaktisk renhet, men leder oundvikligen till att mängden träningsdata sjunker, så denna funktion borde egentligen undersökas mer noggrannt än vad som kommer att ske här. Vill man kunna skilja på ordinitiala, ordmediala och ordfinala teckensekvenser finns den möjligheten. I så fall läggs START till som första tecknet och STOP som det sista i varje ord (de behandlas som var sitt tecken). De inkluderas bara i bigram och trigram. Av de strängar som sedan finns kvar räknas n-gram ut. De sparas som en sorterad tabell. Ett (något förenklat) exempel på en sådan kan ses i Tabell 1. <UNIGRAMS = 3.5> 0.2857 1 c 0.2857 1 b 0.2857 1 a 0.1428 0.5 UNSEEN </UNIGRAMS> <BIGRAMS = 4.5> 0.2222 1 a b 0.2222 1 c STOP 0.2222 1 b c 0.2222 1 START a 0.1111 0.5 UNSEEN </BIGRAMS> <TRIGRAMS = 3.5> 0.2857 1 a b c 0.2857 1 b c STOP 0.2857 1 START a b 0.1428 0.5 UNSEEN </TRIGRAMS> Tabell 1: Uni-, bi- och trigramfrekvenser i strängen abc. I Tabell 1 anger kolumn 1 frekvensen av n-grammen, kolumn 2 det faktiska antalet förekomster och kolumn 3 n-gram-typen. Alla tabeller innehåller en UNSEEN-typ per n- gram-mängd, vilken representerar alla typer som inte setts. Eftersom detta är tänkt vara ett språkoberoende verktyg har jag valt att använda en UNSEEN-tag i stället för att på förhand lista alla tänkbara teckensekvenser. UNSEEN tilldelas ett virtuellt antal förekomster mellan 0.01 och 1, i normalfall
0.5. 2.1.2 Smoothning Jag tillhandahåller en smoothningsalgoritm för de tabeller som produceras av träningsalgoritmen. Den utför en linjär och ganska naiv smoothning, men som kommer visa sig ger en liten förbättring av resultatet 3. Smoothningsalgoritmen opererar på en n- gram-tabell (t.ex. Tabell 1 ovan). Varje deltabell behandlas separat; unigram för sig, bigram för sig osv. I varje deltabell plockas alla intilliggande mängdpar av n-gram med samma antal förekomster ut {A = {i 1... i m }, B = {j 1... j n }}, där A är en icke-tom mängd n- gram med inbördes samma frekvens och B den närmsta icke-tomma mängd n-gram vars inbördes gemensamma frekvens är mindre än A:s. Ett förtydligande exempel ges i Figur 1. { } 0.0151 11 t STOP A = 0.0151 11 o u 0.0138 10 a n B = 0.0138 10 START w 0.0138 10 START s Figur 1: Ett intilligande mängdpar innan smoothning. Differansen mellan de två mängderna räknas sedan ut enligt formeln Diff = A freq B freq A B 4 där A freq och B freq är den förekomst som varje medlem av A respektive B har, och A och B är antalet medlemmar i A respektive B. I Figur 1 skulle differansen vara 11 10 2 3 4 = 0.041666... Medlemmarna i A får sina frekvenser subtraherade med B Diff, medan medlemmarna i B får sina adderade med A Diff. När A och B smoothats är differansen mellan dem 50% mindre än den var från början. Sedan är det B:s tur att dela med sig av sin nyvunna sannolikhet till den mängd lika frekventa n- gram som ligger precis efter B. Denna smoothning gör att sannolikheten rinner ner från toppen av tabellen och finfördelas på alla underliggande. Den totala sannolikheten förblir alltid 1 och den inbördes rangordningen förblir alltid oändrad. 3 Observera att jag inte har gjort någon statistisk signifikansprövning, så detta påstående är helt klart falsifierbart. 2.1.3 Taggning När man har en grafotaktisk språkmodell, och eventuellt smoothat den, är man redo att använda taggningsalgorirtmen. Den taggar en rå vertikaliserad text med hjälp av en språkmodell (smoothad eller inte). Algoritmen går igenom texten rad för rad (därmed ord för ord). Rader med endast icke-alfanumeriska tecken lämnas oförändrade, liksom rader innehållande siffror. Jag gör antagandet att ord med siffror i lyder andra principer än värdsspråkets normala grafotax. Matematiska formler, klockslag, registreringsnummer och liknande saker lämnas alltså även de orörda. Alla andra rader antas innehålla ord på ett språk, antingen värdspråket eller något annat. Dessa ord delas upp i sina beståndsdelar, och alla möjliga uni-, bi- och trigramsannolikheter räknas ut (separat). När alla n-gramsannolikheter i ordet/raden räknats används formeln ( ) ngram(w ) / ngram xeno(w ) = log len(w ) där ngram(w ) är slutprodukten av alla n- gram-sannolikheter i ordet, ngram det antal olika n-gram som använts (i normalfall 3; uni-, bi- och trigram) och len(w ) antalet tecken i ordet. Resultatet är ett tal som jag kallar xenopoäng, och ju större ett ords xeno-poäng är desto mer avviker ordet från värdspråkets grafotax. Exakt varför formeln ser ut som den gör kan jag inte förklara. Jag experimenterade en hel del med att hitta en kraft som motverkar att ett ords sannolikhet sjunker nästan exponentiellt med dess längd. Det här var det enda sätt jag fann som gav resultat. Ett problem är att formeln inte på förhand ger några klara besked angående när ett ord är en xenogloss eller inte; skalan är olika beroende på träningskorpus och smoothning. Användaren måste därför själv sätta den gränsen. Det skulle säkert gå att på statistisk väg sätta ett bra tröskelvärde, men det har jag inte haft möjlighet att sätta mig in i. För att hjälpa användaren sätta gränsen mellan xenoglosser och värdspråksord finns funktionen lim-x där x är ett godtyckligt positivt tal. När lim-x inte används taggas alla ord till med sina respektive xeno-poäng. Användaren kan studera resultatet och försöka hitta en gräns mellan poängen för xenogloss-
er och värdspråksord, och sedan köra algoritmen igen med lim-x där x är den uppskattade gränsen. Då kommer alla ord vars poäng överstiger x taggas med en XG-tag och poäng, medan ord med xeno-poäng under x lämnas orörda. Hur allt detta ser ut visas i Figur 2. lim-x utelämnat. 3.3708 Boken 3.7010 är 3.3915 uppdelad 2.9110 efter 3.2356 principen 5.0542 Mu-Bi-Du-Ba lim-5 Boken är uppdelad efter principen <XG = 5.0542>Mu-Bi-Du-Ba</XG> Figur 2: Exempel på taggning med och utan lim-x. 2.2 Utvärdering Jag har valt den 1 miljon löpord stora svenska SUC-korpusen som utvärderingsmateial. I SUC finns taggen <foreign> som omsluter sjok av xenoglosser. <foreign lang=fr> <w n=2289>nouveau-riche<ana> <ps>uo<b>nouveau-riche</w> </foreign> Alla ord inuti en <foreign>-tag taggas med UO, som betyder okänt ord. <foreign>taggningen var en del av postprocessandet av SUC-korpusen och gjordes automatiskt. Enligt en slags dokumentation av SUC-korpusen 4 ska det finnas 1870 sjok omslutna av <foreign>. 2.2.1 Träningsmaterial och testmaterial Jag har valt att göra ett tvådelat crossvalidation-test på SUC-korpusen, vilket innebär att jag två gånger delat den i två bitar: så att jag första gången får två bitar med de första 10% och de resterande 90% av korpusen, och en gång så att jag får de 90% första och resterande 10%. Sedan använder jag var sin 4 stp.ling.uu.se/ evapet/undervisning/dlex04/suc1.html gång den stora biten till träning och den lilla till utvärdering. Slutligen tar man medelvärdet på de två utvärderingarna som slutgiltig performans. 5 En korrekt utförd cross-validation ger en möjlighet att använda hela materialet både som träning- och utvärderingsdata utan att utvärdera något man redan tränat på, och ger större statistisk säkerhet på resultatet. Både träning och taggning sker med SUC-taggar bortplockade (se t.ex. (Manning and Schütze, 1999) s. 210). Jag kommer av tidsskäl inte att testa alla olika valmöjligheter mina program tillåter, utan bara dessa: 1. Uni-, bi- och trigram, ej smoothad. 2. Uni-, bi- och trigram, smoothad en gång. 3. Uni-, bi- och trigram, smoothad fem gånger. I alla tre fallen kommer ord med versaler ignoreras i träningen, och START/STOP kommer inte att användas. UNSEEN kommer att ges värdet 0.75. lim-x bör egentligen sättas olika i de olika körningarna, eftersom skalan för grafotaktisk avvikelse är olika beroende på träningsdata och smoothningsgrad. Dessvärre är det ganska ovetenskapligt och försvårar jämförelse mellan resultaten om jag skulle gå in och plocka olika värden för varje körning, så i stället bestämmer jag att lim-x ska vara 4. Detta tror jag kan vara en rimlig tröskel; det är ungefär det dubbla av medel-xg-poängen av de 100 mest frekventa ordtyperna i första och sista 10% av SUC och ca 75% av XG-poängen för de 100 mest avvikande tokens i samma text. 2.2.2 Guldstandard och baslinje Som guldstandard har jag två separata filer med alla <foreign>-sjok från de första 10% respektive sista 10% av SUC. Om min algoritm kan identifiera alla och endast de ord som finns i dessa filer kommer detta ge 100% precision och 100% recall. De första 10% av SUC inehåller 71 <foreign>-typer, och de sista 10% 69 typer. För att räkna ut ungefär hur min algoritm står sig mot slumpen räknade jag ut en baslinje genom att dela antalet <foreign>-typer i de första och sista 10% av SUC med det totala antalet typer i respektive del, se Tabell 2. 5 I normala fall skulle man ha gjort en 10-delad cross-validation för att få riktigt säkra siffror, alltså där man 10 gånger använder 90% som träning och 10% till utvärdering. Jag ansåg mig inte ha tid till detta, utan att en enkel cross-validation som denna skulle räcka.
Del <foreign> Totalt Baslinje Första 10% 71 20569 0.003 Sista 10% 69 18725 0.004 Tabell 2: Baslinje-precision enligt slumpen. Ett annat tänkbart sätt att skaffa sig en baslinje är att se hur bra performans man får om man betraktar alla ordtyper med frekvensen 1 som xenoglosser, se Tabell 3. Del P R Första 10% 0.004 0.775 Sista 10% 0.004 0.74 Medelvärde 0.004 0.7575 Tabell 3: Baslinje-precision och recall enligt val av minimalt frekventa ord. Båda testerna ger en baslinjeprecision på ca 0.004, och från Tabell 3 får vi också en recallnivå på ca 0.75. 3 Resultat För att få ut precision och recall kontrollerade jag hur stor del av ordtyperna som stämde överrens mellan guldstandard och resultatfilerna. Detta går att se i Tabell 4. Recall är uträknat enligt R = och precision enligt P = ( tp ) tp + fn ( tp ) tp + fp där t och f står för true respektive false, och p och n står för positive respektive negative (Manning and Schütze, 1999). 4 Resultatanalys Vid första anblick är resultaten i Tabell 4 inte så glädjande, måste jag vara den första att erkänna. Det är onekligen fruktansvärt låga siffror, även om de slår baslinjen med god marginal. Detta är dock inte helt oförklarbart. Det visar sig nämligen att algoritmen lyckas hitta ord som är grafotaktiskt avvikande i stor grad, men väldigt många av dem är inte xenoglosser. Tittar man på de vanligaste XGtaggade ordtyperna ser man att de är till stor del egennamn, akronymer eller låneord. Uni-, bi- och trigram, ej smoothad. Cross-valid P 0.020 R 0.0785 Första 10% P 0.013 R 0.070 Sista 10% P 0.027 R 0.087 Uni-, bi- och trigram, smoothad en gång. Cross-valid P 0.0205 R 0.0785 Första 10% P 0.013 R 0.070 Sista 10% P 0.028 R 0.087 Uni-, bi- och trigram, smoothad fem gånger. Cross-valid P 0.0235 R 0.0785 Första 10% P 0.015 R 0.070 Sista 10% P 0.032 R 0.087 Tabell 4: Precision och recall. En del mycket vanliga klart svenska ord finns också med i utdata som misstänkta xenoglosser. Tittar man på listan över mest frekventa XGtaggade tokens 6 finner man bara falska positiver: 48 <XG = 4.0960>hjälp</XG> 40 <XG = 4.2027>Wilecki</XG> 40 <XG = 4.3804>t ex</xg> 35 <XG = 4.4919>Günther</XG> 32 <XG = 4.2877>Münster</XG> 30 <XG = 4.2683>bl a</xg> 27 <XG = 4.3933>jobb</XG> 25 <XG = 4.0168>bygga</XG> 16 <XG = 5.0377>Rüger</XG> 14 <XG = 4.8652>New</XG> Att t ex och bl a smugit sig in här tyder på att ord med någon form av skiljetecken kanske borde få en annorlunda behandling. Vi ser fem klart avvikande egennamn-typer (understrukna) och ett par helt vanliga svenska verb. Ordet New har bara förekommit som del i egennamn, och har därför aldrig klassats som <foreign> i SUC. Om man tittar på de 10 grafotaktiskt mest avvikande ordtyperna finner man klart intressanta ord, varav en är klassad som <foreign> i SUC; piña : <XG = 8.6962>Núñez</XG> <XG = 6.3808>Márquez</XG> <XG = 6.2278>piña</XG> <XG = 6.1289>Zürich</XG> <XG = 6.0923>bh:n</XG> <XG = 5.9984>Dizzy</XG> 6 Detta och alla följande exempel är tagna från de första och sista 10%, smoothad 5 gånger.
<XG = 5.9470>VF:s</XG> <XG = 5.9265>HV:s</XG> <XG = 5.8320>jazz</XG> <XG = 5.7657>BT:s</XG> Det maximala antal xenoglosser som faktiskt hittades (samma oberoende av körning) kan sammanfattas i: Fly-in, Prix, new, play-bunny, walk, Jezt, Que, Weserübung, levé, piña & woman De faktiska xenoglosser som inte hittades måste ju ha haft en XG-poäng under 4, men om man sänkt tröskeln för att höja recall hade precision formodligen sjunkit ännu mer. Faktum är, att för att få upp recall till 93% var jag tvungen att sätt lim-x till 2.13, och därmed sjönk precision till 0.003. 4.1 Diskussion Det verkar som om den föreslagna metoden är bra på att hitta grafotaktiskt avvikande ord, men detta räcker uppenbarligen inte till när man letar xenoglosser. Många ovanliga namn och akronymer återfinns i utdatan, men precisionen för att hitta äkta xenoglosser är helt enkelt för låg. Eventuellt skulle man vinna på att även räkna ord-unigram för att kunna filtrera bort allt för vanliga ord med ovanlig grafotax från xenogloss-listan. Någon form av heuristiska knep borde också kunna bidra till högre performans. Smoothningen verkar, även om det inte har blivit testat för statistisk signifikans, ha bidragit till en viss ökning i precision. Dessutom kom jag på att det inte är särskilt motiverat att använda en enda UNSEEN-tag till osedda bigram och trigram. Till unigrammen är det försvarbart, eftersom detta ska vara ett språkoberoende paket, och man inte på förhand kan veta vilka tecken som kommer att finnas med. Men när unigrammen parametriserats kan alla sedda unigram kombineras ihop till alla tänkbara bi- och trigram. Detta tror jag skulle vara värt besväret att ändra på. Den föreslagna träningsalgoritmen är helt unsupervised, det vill säga att den inte har någon hjälp från texten med att lära sig vilka teckensekvenser som faktiskt kommer från ett främmande språk. Det vore intressant att se hur en supervised parametriserare skulle prestera. Då skulle det gå att bestämma exakt vilka sorters ord som ingår i träningsdatan, man skulle slippa bekymra sig över att råka lära sig egennamn eller främmande ord. Det skulle också kunna lära in tecken-n-gram unika för xenoglosser. 4.2 Slutsats På grund av tidsbrist har jag inte kunnat testa algoritmen på fler språk än svenska, så mitt mål med att göra en språkoberoende metod är ännu inte bekräftat. Jag har heller inte kunnat kvalitetstesta alla konfigurationer till programmen, så jag är inte säker på om jag använt den mest optimala uppsättningen switchar i utvärderingen. De mycket låga siffrorna på precision och recall till trots vill jag ändå påstå att jag lyckats komma en bit på vägen. Med hjälp av algoritmen som beskrivits har jag lyckats identifiera väldigt många ord med hög grad av grafotaktisk avvikelse, dessutom med högre precision än båda mina baslinjer. Om sedan de ändringar som föreslagits i 4.1 genomförs kommer förhoppningsvis programmen bli mer användbara. References Robert Eklund and Anders Lindström. 1998. How to handle foreign sounds in swedish textto-speech conversion: Approaching the xenophone problem. In Proceedings of ICSLP 98, volume 7, pages 2831 2834. Christopher D. Manning and Hinrich Schütze. 1999. Foundations of Statistical Natural Language Processing. The MIT Press, Cambridge, MA. Stina Nylander. 2000. Statistics and graphotactical rules in finding OCR-errors, January. Jong-Hoon Oh and Key-Sun Choi. 1999. Automatic extraction of transliterated foreign words using hidden markov model for handling unknown words. In Proceedings of the 11th Korean and Processing of Korean Conference. B. Sigurd. 1965. Phonotactic Structures in Swedish. Lund University, Lund.