« december 2005 | Main | februari 2006 »

januari 30, 2006

Svenska ordklasser samt gissning med hjälp av ordsuffix

Programmet Visa ordklasser visar ordklasser för svenska texter. Programmet bygger helt på uppslag i en ordlista och gör ingen grammatisk analys eller något sådant avancerat. Finns flera möjliga ordklasser för ett ord visas samtliga kända.

Som exempel visas hur den första av föregående meningar analyseras av programmet:


programmet<substantiv:bestämd form singularis> visa<verb:infinitiv|verb:imperativ|adjektiv:bestämd form|adjektiv:pluralis|substantiv:obestämd form singularis|substantiv:obestämd form pluralis|substantiv:bestämd form pluralis> ordklasser<substantiv:obestämd form pluralis> visar<verb:presens|substantiv:obestämd form pluralis> ordklasser<substantiv:obestämd form pluralis> för<verb:presens|verb:imperativ|substantiv:obestämd form singularis|preposition|konjunktion|adverb> svenska<adjektiv:bestämd form|adjektiv:pluralis|substantiv:obestämd form singularis|substantiv:obestämd form singularis> texter<substantiv:obestämd form pluralis>


Ord i fetstil är de ord som analyseras. Därefter kommer en lista av kända ordklasser för detta ord inom hakar (< ... >). Finns det flera varianter avskiljes de med tecknet "|" (som här ska läsas som "eller").

Programmet bygger helt på information från Den stora svenska ordlistan (sv.speling.org, som dock verkar onåbar för tillfället). Rätt mycket efterarbete (filtering och annan skyffling å data) har gjorts för snabb access av informationen.


Gissa ordklass med hjälp av suffix
Alla svenska ord finns inte med i ordlistan (och hur skulle det kunna göra det med alla fina nya konstruktioner som ständigt skapas av alla härliga nyordkonstruktionskreativa personer). Den använda ordlistan innehåller cirka 200000 ord, inklusive böjningar och andra varianter. Okända av ordlistan ord visas som OKÄNT, och listas även sist på sidan.

Det har skapats en experimentell funktion att gissa ordklass med hjälp av ordens suffix, som slås på via valet Gissa ordklass via suffix. Det finns även möjlighet att sätta en gräns för hur stort "stöd" en suffix måste ha, dvs hur många ord som har ett visst suffix i kombination med en viss ordklass. Ju lägre värde desto fler förslag kan komma att visas; låga värden kan ge (allt för) många alternativ. Standardvärdet är 1000 som suffixstöd, men ändra det gärna för att experimentera lite.

Det största suffixstödet är 19976: suffixet s för ordklassen substantiv:bestämd form singularis, genitiv. En lista över samtliga använda suffix med minst suffixstöd 2 finns i filen suffixes1-4.txt, sorterad på suffixstöd.


Exempel på ordklassgissning
Låt oss ta orden blogg, bloggare, bloggat (som alltså inte finns i ordlistan). De visas på följande sätt när valet Gissa ordklass via suffix är påslaget och 1000 som suffixstöd:


blogg<OKÄNT|g adjektiv:positiv utrum(4278)|g substantiv:obestämd form singularis(2577)> bloggare<OKÄNT|are substantiv:obestämd form pluralis(1106)|are substantiv:obestämd form singularis(1077)|re substantiv:obestämd form pluralis(1107)|re substantiv:obestämd form singularis(1104)|e verb:preteritum(5120)|e substantiv:obestämd form singularis(2288)|e adjektiv:komparativ(1320)|e substantiv:obestämd form pluralis(1124)|e verb:perfekt particip, plural(1121)> bloggat<OKÄNT|at verb:supinum(4425)|at verb:perfekt particip, neutrum(1112)|t adjektiv:positiv neutrum(10844)|t verb:supinum(5374)|t substantiv:bestämd form singularis(4404)|t substantiv:obestämd form singularis(2686)|t verb:perfekt particip, neutrum(1684)>


Här ser vi t.ex. att första förslaget för blogg är felaktigt, däremot är det andra alternativtet korrekt (substantiv:obestämd form singularis). Siffrorna efter förslaget är suffixstödet.

Not: Gissningarna sorteras först på suffixlängd (med längsta suffixet först) och därefter antal suffixstöd. Anledningen till att längden valts som första sorteringsordning är att ett längre suffix är gissningsvis mer korrekt än ett kortare. Så är i alla fall min nuvarande experimentella teori.


Se även
Tyvärr har jag inte hittat någon bra webbsida som förklarar alla ordklasser/böjningsformer som används av programmet. sv.speling.org hade en sådan (har jag för mig), men den koms alltså inte åt nu. Förslag på sådan sida emottages gärna.


Möjligen relaterat
Något om prefixträd sorterade på lite olika sätt samt komprimering

Posted by hakank at 06:56 EM Posted to Program | Språk

januari 25, 2006

Word Meld Simple - en etyd med Ajax-tekniken

Som några andra bloggare leker jag lite med Ajax-tekniken, vilket pratas mer om nedan.

Men först något om själva programmet.


Word Meld Simple
Word Meld är ett program som försöker att skapa "kreativa" ord (helst skulle det vara "roliga", men det är lite väl förmätet) utifrån ett grundord och ord från en ordlista, genom att leta upp gemensamma prefix och suffix.

En nyss utvecklad variant är Word Meld Simple som använder en enklare strategi: Utifrån två givna ord föresöker programmet att vara kreativ genom att lista ut gemensamma prefix/suffix samt n-gram (infix). Det är alltså detta program som använder Ajax-tekniken.


Exempel
Användningsområdet för slika program är inte speciellt klart, men en tanke är att om två företag skulle gå ihop kan programmet vara till hjälp för att skapa det nya företagsnamnet. T.ex. om google och Microsoft skulle slå ihop sina påsar (hädiska tanke!) föreslår programmet två kombinationer:

gooft
microsogle

varav det ena förslaget (det andra) ju inte låter dåligt.

Andra tankar är att man tycker att en kombination av två ord är för lång och man vill slå ihop dem till ett enda. T.ex. statistiskt och signifikant:

signifikatistiskt
signifikt
signifiskt
stant
statistikant
statistisignifikant
statistiskant

Nå, det kanske inte blir så mycket enklare, men det är i alla fall ett ord.

En ytterligare användning är - naturligtvis - att skapa "vitsordet" för en ordvits.


Här är några fler kombinationer, mer eller mindre slumpmässigt tagna ur luften. Visst urval har gjorts av de av programmet presenterade ordkombinationerna.

firefox + unix:
unirefox


doktor + ordinera (som Henrik Sundström har en skoj liten tävling kring):
doktordinera


socialdemokraterna + moderaterna:

mokraterna
modemokraterna
socialderaterna
socialdemoderaterna


randomisera + kjellerstrand
kjellerstrandomisera


Ajax
Programmet är alltså skrivet med Ajax-tekniken, så några ord om detta kanske kan vara på sin plats. Möjligen är det inte det bästa exemplet, men good enough är också bra.

Vanliga CGI-program (som jag ofta använder för mina privata program) laddar om sidan för varje gång man kör programmet och man måste skyffla en massa information varje gång. Ajax använder en annan metodik och hämtar data (t.ex. kör nödvändiga program) i bakgrunden, s.a.s sömlöst. Detta gör att man kan behålla information från sidan utan att skicka med en massa parametrar (vilket tenderar att bli ett härke och är helt enkelt trist). Bibehållandet av datan på samma sida symboliseras med räknaren av antalet sökningar, en JavaScript-variabel som uppdateras varje gång.

För att göra programmeringen lite enklare har här används Perls modul CGI::Ajax (f.d. perljax), men det är inte speciellt svårt att rulla en egen-variant för ett så simpelt program som detta (enkelt vad gäller data som ska skyfflas via webben, alltså) . Uppdatering: jag fixade ett av problemen genom att skriva en egen variant.

Notera att något är lurt i vissa webbläsare vad gäller den nationella tecknena (t.ex. "å", "'ä" och "ö").


Se även
Andra "useless" program av liknande slag.

Ajax Patterns, med Ajax-ramverk i olika programspråk
googlering på "ajax programming vilket ger en massa träffar.


Uppdatering
Förutom problemet med de nationella tecknen har det rapporterats om att för vissa webbläsare "hänger det sig" när man skrivit in första ordet. Kollar på detta och återkommer...

Uppdatering 2 - återkomsten
Nu får i alla fall inte jag några problem med de nationella tecknen. Åtgärden var att i stället för att använda CGI::Ajax så skrev en egen variant av JavaScriptet istället för det färdiggenererade av Perl-modulen. Programmet nås nu på en något annorlunda adress än tidigare: Word Meld Simple.

Posted by hakank at 09:05 EM Posted to Program | Språk | Systemutveckling

januari 23, 2006

Något om prefixträd sorterade på lite olika sätt samt komprimering

Av en privat (och personlig) orsak behövdes ett program för att skapa unika prefix av ord i en lista, och sedan att presentera dessa prefix som ett träd. Anledningen var ungefär att korta ner en lista av ord till kortare ord (dess prefix).

Ett exempel på ett sådant prefixträd är för de svenska månadsnamnen:

a:
  ap: april
  au: augusti
d: december
f: februari
j:
  ja: januari
  ju:
    jul: juli
    jun: juni
m:
  ma:
    maj: maj (!!!)
    mar: mars
n: november
o: oktober
s: september

Här ser vi t.ex. att månadsnamnen december, februari och november kan komprimeras till en enda bokstav, medan april och augusti båda börjar på bokstaven a så vi måste här ta till en extra bokstav för att skilja dem åt. Man kan också notera att maj inte blev något prefix alls, utan här behövs hela ordet eftersom mars, den rackaren, ligger och stör. Sådana fall markeras med !!!!


Program Prefix Trees
Det har naturligtvis skapats ett program för att kunna leka vidare med sådana här ord-listor, och som - möjligen något missledande - kallas för Prefix trees.


Programkörningen för ovanstående svenska månadsnamen finns ungefär här.


Komprimering och annat skoj
Även om det primära syftet med programmet var att skapa unika prefix och prefixträd så var det svårt att låta bli att studera vissa saker i mer detalj.

Om man kör programmet för de svenska månadsnamnet kommer det, förutom det fina prefixträdet, även lite statistik (längst ner på sidan):

...
Original total length of words: 74
Total length of prefixes: 23
Mean prefix length: 1.92
Compression factor (original length/prefix length): 3.217

Man kan bl.a. se att det medellängden av de skapade prefixen är 1.92, vilket ska jämföras med medellängden av de ursprungliga orden på 6.17. Komprimeringsfaktorn är 3.217, vilket räknas ut med formeln

(sammanlagda längden av original orden) / (sammanlagda längden av prefixerna)

Dvs: genom att använda de unika prefixen istället för de hela orden sparar man en hel del, t.ex. träd (sic!) om man skulle använda papper för att skriva dem. Det kanske blir svårt att läsa det, men man skulle kunna spara både tid och pengar på detta. Nedan kommer vi att studera hur man kan spara något mer tid/papper/pengar men i gengäld blir det i stort sett oläsbart...


Frekvenssortering av bokstäver
En finess med programmet är att man kan studera lite olika varianter av representation av orden innan det skapas prefix. T.ex.

Sedan den mest intressanta varianten: bokstavsfrekvenssortering (valet Sort by letter frequency, som innebär att innan man skapar prefixen sorterar man ordets bokstäver i ordning av hur vanliga/sällsynta bokstäverna är bland samtliga ords bokstäver. T.ex. så är det troligt att bokstaven "z" är sällsynt vilket gör att ett ord med "z" kommer att prefixas som z + eventuellt någon annan bokstav.

Om vi fortsätter med månadsnamnsexemplet får man med bokstavsfrekvenssortering följande prefixträd:

d: december
f: februari
g: augusti
j: maj
k: oktober
l: juli
n:
  nj:
    nju:
      njui: juni
        njuia: januari
p:
  pl: april
  ps: september
s: mars
v: november
....
Original total length of words: 74
Total length of prefixes: 21
Mean original length: 6.17
Mean prefix length: 1.75
Compression factor (original length/prefix length): 3.524

Om man jämför med det "vanliga" prefixträdet så är komprimeringsfaktorn något lägre för bokstavsfrekvenssorteringsvarianten (3.524 jämfört med 3.217).

Denna skillnad tenderar att vara beständigt: Detta innebär att om man använder bokstavsfrekvenser istället blir det något bättre komprimering. Nackdelen är naturligtvis att "förkortningen" (prefixet) är fullständigt obegriplig. Se även en mer systematisk genomgång nedan.

Några noter kring detta
Möjligen skulle man här kunna göra en analogi med Huffman-kodning (ref till en.wikiedia) som skapar binära koder efter bokstävernas frekvens, där den kortaste koden tilldeleas den vanligaste bokstaven etc.

En mer avancerad variant av prefixträd skulle vara att analysera prefixträdet för att komprimera det ännu mer.

Det går naturligtvis också att göra det väldigt enkelt för sig och koda varje ord till ett eller flera fullständigt slumpmässiga tecken alltefter ordens/bokstävernas frekvens i texten. Men det är en övning som lämnas åt vidare öden (eller övning åt läsaren/skribenten).

Den ursprungliga poängen med prefixträden var att de skulle vara lätta att skapa och (relativt) lätt att uttyda när man ser dem. När man använder sorteringar av olika slag förloras detta syfte bort i skymningen varvid endast nästa dags solstrålar är glada att se det.


Liten undersökning
Det gjordes också en undersökning hur antalet olika ord i listan påverkar komprimeringsfaktorn respektive medelprefixlängden. Detta gjordes för ett olika antal slupmässiga svenska ord (ur en ordlista på nästan 400000 ord).

Det visar sig - inte speciellt förvånande - att ju fler slumpmässiga ord listan innehåller, desto sämre blir komprimeringsfaktorn och desto längre blir medellängden på prefixen. Som variansen visar är det relativt stabila värden förutom för den första körningen (10 ord i listan). Av tidsskäl kördes endast 10 gånger med samma liststorlek.

Prefix utan någon bokstavssortering

Antal ordKomprimeringsgradKomprimeringsgrad variansPrefix medellängdPrefix medellängd, varians
107.807304.675261.470000.12456
1004.140800.028742.637000.00842
2003.548600.035303.115000.01812
5003.042600.002013.608000.00775
10002.705900.001994.102000.00368
20002.399400.000784.602000.00717
30002.236200.000634.960000.00207
50002.068100.000305.364000.00158
100001.845000.000095.998000.00057
200001.654000.000026.688000.00040
500001.440400.000017.680000.00031
1000001.315200.000008.413000.00020

Prefix med frekvensbokstavssortering

Antal ordKomprimeringsgradKomprimeringsgrad variansPrefix medellängdPrefix medellängd, varians
109.688304.153061.150000.02500
1004.244700.026752.568000.01280
2003.819100.021282.948000.00544
5003.265200.001933.409000.00283
10002.893400.003513.835000.00372
20002.618100.000324.242000.00044
30002.471300.000824.489000.00159
50002.287800.000184.821000.00054
100002.064800.000095.362000.00042
200001.873100.000035.910000.00018
500001.650100.000016.708000.00008
1000001.507100.000007.344000.00014


Andra exempel
Jag har även kört programmet på några andra exempel, t.ex. 1000 vanligaste svenska orden, svenska förnamnen samt svenska efternamnen (plus "Kjellerstrand") från Språkbanken:


Se även
En möjlig variant att göra en komprimering eller på annat sätt förkorta saker och ting är att använda reguljära uttryck, t.ex. som i programmet MakeRegex,.

Posted by hakank at 10:51 EM Posted to Program | Språk | Statistik/data-analys | Comments (2)

januari 17, 2006

En liten undersökning om kuluriga ord

Henrik Sundström skriver i sin blogganteckning Kuluriga ord om ett ord han har hittat på: Kulurigheter. Ett annat exempel är "kulurig", som är byggt på de tre orden:

kul + klurig + lurig = kulurig

Thebe frågar i en kommentar följande fråga:


Och man undrar ju hur bildens kulurighet, den matematiska serien som måttstocken bildar, fortsätter ...

Den uppkastade handsken tages härmed upp!

Här har dock inte brytts så mycket om den matematiska serien (även om det ska bli spännande att se resultatet av detta), så den frågan är fortfarande obesvarad och handsken ska snarare ses som en tummetott.

Däremot - och genom en sedvanlig omdefinition av problemet - har gjorts en undersökning av ord som följer exakt samma struktur som "kuluriga", nämligen:

1. Ett grundord: här klurig 2. Ett delord som består av grundordet minus första bokstaven: här lurig
3. Ett tredje ord som består av de första tre bokstäverna från grundordet men är permuterat enligt formen 132: här kul (dvs "u" och "l" är omkastade).

Det visar sig att det finns flera sådana ord, nämligen hela 3870 stycken; myckenheten i detta antal upplevs som förvånade.

T.ex. finns

bracka + racka + bar = baracka

som möjligen kunna sägas om en bracka som sitter på en bar och rackar ner på sina medbargäster.

Eller kanske

vårliga + årliga + vrå = vrårliga

Som är något vi gör i vår vrå under våren. (En kanke inte helt optimalt konstruktion...)


Några andra varianter med potentialer:

trådgivare + rådgivare + tår = tårådgivare


trimmade + rimmade + tir = tirimmade

(En "tir" är enligt NE: det spiralformade mellanrum som uppstår mellan parterna (trådsträngarna) när repslagare slår samman klenare tågvirke till linor, trossar eller kablar.)


Dock måste sägas att:

1. Alla konstrukter är alltså inte alls lika kuluriga som kuluriga. T.ex. är följande

oanvänd + använd + ona = onanvänd

inte speciellt kulurig. Men eftersom NE tycker att ona betyder t.ex. hål eller (båt)ränna kanske någon kan hitta på något av detta. Här ställs man dock inför den fascinerande utmaningen att något ska vara både använd och oanvänd.


2. Det inkorporeras även böjningar av samma ord, vilka ha tagits med av fullständighetsskäl.

3. De där trebokstavsorden används ofta i många olika kombinationer, vilket gör att det hela eventuellt kan kännas lite ... programmatiskt.


Den fullständiga listan över dessa ordkombinationer finns att bestudera i kuluriga_ord.txt (en alldeles ren ASCII-fil).


Se även
Några andra sätt att konstruera konstruerade konstruktioner är bl.a.:

Isomorphics words som anger vilka andra ord som har samma ordstruktur som ett givet. T.ex. har "kulurig" 176 svenska isomorfiska ord, däribland "vetekli", "tabasco" och "bajadär".

Word Meld som försöker att slå ihop två ord till ett nytt (som möjligen inte tidigare fanns i sinnevärlden). T.ex. ger en word meld på klurig sådana ord som "klurendrejeri" och "klurigorös".

Chiasmus words som är ett annat program som givet två ord (t.ex. personnamn) skapar "korsningar" (chiasmus) mellan dessa ord. T.ex. ger henrik sundström chiasmusen "senrik hundström".

Posted by hakank at 08:38 EM Posted to Språk