Kungl. Tekniska högskolan NADA Grundformer med Stava

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

Bootstrapping för substantivtaggning

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

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

Kapitel 12. Mer om program Att rapportera buggar och problem make

Taltaggning. Rapport av Daniel Hasselrot , 13 oktober 2003

Enkla datatyper minne

FOR BETTER UNDERSTANDING. Kom igång med. WordFinder Snabbguide

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

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

729G09 Språkvetenskaplig databehandling

ANDREAS ISSA SVENSKA SPRÅKET

Att använda Stava Rex i Word 2007

Ordlistor, filhantering och ut på webben. Linda Mannila

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Planering Programmering grundkurs HI1024 HT data

Korsordlösare Sara Hedbrandh Strömberg Programkonstruktion VT 10 Inlämninsguppgift

Tentamen i Introduktion till programmering

F4. programmeringsteknik och Matlab

Variabler och konstanter

Word- sense disambiguation

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

Lathund för Gustavas ordböcker

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

C konstruerades i början på sjuttiotalet av Dennis Ritchie vid Bell Laboratories.

Tenta i Grundläggande programmering DD klockan

Planering Programmering grundkurs HI1024 HT TIDAA

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Eva Ansell Ulrika Nilsson WORD 2008 MICROSOFT. för Mac

Rätt till välbefinnande. Organisationsrätt. Handel med barn är förbjuden. Rätt till hälsovård. Barn ska skyddas mot rusmedel

Hantering av textsträngar och talsträngar. William Sandqvist

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Innehåll. Grammatikkontroll i Granska. Problemställning. Datorstöd för skrivande. Vilka metoder finns? Granskas uppbyggnad

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Objektorienterad programmering i Java I

Hur man programmerar. Exempel på problemlösning i Python

Tentamen i Grundläggande Programvaruutveckling, TDA548

Kom igång med SpellRight

Använda Stava Rex i Word 2010

Strängar. Strängar (forts.)

1 Funktioner och procedurell abstraktion

FOR BETTER UNDERSTANDING. Snabbguide.

Exempelsamling Assemblerprogrammering

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

HI1024 Programmering, grundkurs TEN

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

Använd WordFinder från Mac App Store optimalt! Snabbguide med nyttiga tips och trix.

Programmering för språkteknologer II, HT2014. Rum

Klassdeklaration. Metoddeklaration. Parameteröverföring

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Datalogi för E Övning 3

TDIU01 - Programmering i C++, grundkurs

Övning 6. Komprimering, kryptering, dokumentering & testning

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

TUTORIAL: SAMLING & KONSOLL

Dreamweaver för nybörjare

Statistisk Maskinöversättning eller:

Tips & Trix - Teknik Jeeves World Copyright 2011 Jeeves Information Systems AB

C++ Slumptalsfunktioner + switch-satsen

Att använda pekare i. C-kod

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Lektion 2: Sökagenter. Robin Keskisärkkä

Lathund. C för inbyggda system

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Föreläsning 11 - Automater, textsökning, tillstånd

OOP Objekt-orienterad programmering

Identifiering av ordvitsar med Granska

TDDI16: Datastrukturer och algoritmer

Kom igång med TIS-Office

Använda SpellRight 2 i Word 2010

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

Uppgift 1 (grundläggande konstruktioner)

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Arduinokurs. Kurstillfälle 4

Övningar i JavaScript del 4

Övning 1 - Abstrakta datatyper

Grundläggande textanalys. Joakim Nivre

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Övning från förra gången: readword

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

CD-ORD 8 elevdata.se

Använd WordFinder Pro för Mac optimalt! Snabbguide med nyttiga tips och trix.

TDIU01 - Programmering i C++, grundkurs

Grundläggande stränghantering

Skapa en mall för inlämning av skriftliga uppgifter. med hjälp av Open Office Writer

SÅ HÄR SKRIVER VI PÅ HÖGSKOLAN I BORÅS. Skrivhandbok för begripliga texter

TDP Regler

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Ordbok arabiska - svenska. Denna ordboks webbadress är:

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

Introduktion till programmering SMD180. Föreläsning 7: Strängar

Kryptokorsordslösare Programmeringsmetodik DV (period 2) Inlämningsuppgift 1

Transkript:

Kungl. Tekniska högskolan NADA Grundformer med Stava Språkteknologi 2D1418 Höstterminen 2004 Författare: Andreas Pettersson az@kth.se

1. Bakgrund Om man automatiskt ska plocka ut de informationsbärande orden ur ett dokument för att senare kunna söka på dem vill man ofta återföra orden på grundform. I t.ex. sökmotorer där sidorna är lagrade med de väsentliga orden i grundform ger det en bättre sökning, eftersom alla tänkbara ändelser av ordet då tas med i sökningen utan att behövas specificeras. Sökningen går därmed fortare av den orsaken att man har färre index. Stava är ett verktyg för stavningskontroll som utvecklas av Kann och Hollman inom ett projekt vid Nada, KTH. Det är en forskningsprodukt och är inte tillgängligt för användning utanför KTH. Programmet Stava 1 innehåller en särskild modul, suffix.c. Om Stava inte kan hitta ett ord direkt i någon av ordlistorna kontrollerar modulen om ordet matchar någon suffixregel. Om så är fallet accepteras ordet som rättstavat. I Stava finns suffixregler för substantiv, verb och adjektiv. Substantiv och svaga verb matchas ofta av en suffixregel. Däremot vissa former av adjektiv och starka verb kan inte Stavas suffixregler användas. Dessa ord saknar regelbunden böjning och lagras därför i lexikonen i dess olika former. För att även kunna täcka in dessa oregelbundna ord i grundformer med stav krävs en annan lösning än att använda modulen suffix.c. 2. Problem Modifiera huvudmodulen stava.c så att den för varje inmatat ord anropar funktionen CheckSuffix i modulen suffix.c, samt ändra att CheckSuffix skriver ut ordets grundform. 1 Stava finns med på webben http://www.nada.kth.se/stava 1

3. Stavas suffixregler Grunden i Stava är Svenska Akademiens Ordlista (SAOL) ca 120 000 ord. I den finns ord som, n och dockor. Ordet ns står däremot inte. Stavas suffixregler beskriver hur nya böjningsformer kan bildas ur de få böjningsformer som finns i Stavas ordlista. Suffixreglerna ligger i en textfil SLlist 2 och den läses in av Stava när programmet startas. Ett exempel för ordet ns kan se ut på följande sätt: ans Den kommer att godkänna ordet ns om orden, n och dockor finns i SAOL. En regel består av ett ingångssuffix följt av en lista av uppslagssuffix. Det tomma suffixet tecknas i en suffixregel som @. Det finns tre sätt att utöka reglernas effektivitet: 3 1. Negation av uppslagssuffix I suffixlistan kan man ange negerade uppslagssuffix inledda med tecknet ~(tilde). samma sam, ~samen Den säger till exempel att varsamma ska godkännas eftersom varsam men inte varsamen finns i ordlistan. Här har man lagt till det negerade suffixet ~samen för att förhindra att ord som balsamma ska godkännas (för balsam finns ju). 2. Bokstav som föregår suffix Man kan ange att en regel bara ska användas för ord där suffixet (närmast) föregås av en viss bokstav (eller någon av en uppsättning bokstäver). Ingångssuffixet ska då föregås av dom tillåtna bokstäverna omgärdade av [ och ]. Notationen är alltså samma som i reguljära uttryck i Unix. [uå]rna @, n, r, ~dde, ~ra n godkänner suffixet -rna endast om det föregås av u eller å. Detta innebär till exempel att ordet basturna godkänns men inte vararna. 2 SLlist ligger under katalogen /misc/tcs/language/stava/ 3 Beskrivningarna är hämtade från http://www.nada.kth.se/stava/suffixregler.html 2

Kanske ännu mer användbart är möjligheten att förbjuda vissa bokstäver före suffixet. Ingångssuffixet ska då föregås av dom förbjudna bokstäverna omgärdade av [^ och ]. [^sxz]s @, en, er n godkänner genitivsuffixet -s när det inte föregås av s, x eller z. Detta innebär till exempel att ordet films godkänns men inte sfinxs. 3. Bokstavsföljder som föregår suffix Ibland vill man förbjuda att vissa bokstavssträngar föregår suffixet. Det gör man genom att ange strängarna inom parentes och avskilda med före suffixet (och före eventuellt [ ]-uttryck). (ar)ena e, et, en, ~ar, ~er godkänner suffixet -ena när det inte föregås av ar. Detta innebär till exempel att ordet samhällena godkänns men inte altarena. Om man vill förbjuda el, en och er före suffixet -aste så inleder man regeln med (el en er)aste Det första uppslagssuffixet i högerledet är alltid ordets grundform i alla suffixregler. 3

4. Utförande Stavas suffixregler används för att generera grundformen av de inmatade orden. Det innebär att t.ex. ordet ns kommer att matcha en regel med ans i vänsterledet. Byt enligt suffixregeln ans ut ans mot a. Det blir problem med ord som, n, dockor och alla andra ord som inte matchar (uppfyller) någon suffixregel. En iakttagelse är att man kan lägga till ett s på de flesta ord och därmed matcha en regel i suffixlistan. Men den lösningen är inte att rekommendera. Fel som kan uppstå är att ordet kan få andra betydelser och att ordet fortfarande inte matchar någon regel. Den generella lösningen är att lägga till fler regler som matchar de ord som finns i ordlistan. T.ex. kan följande uppsättning av suffixregler ge grundformen av. a an or Reglerna täcker in orden, n och dockor. För att se vilka ord som godkänds av regeln kan man använda verktyget generera 4. Den tar en suffixregel och returnerar en lista på de ord som Stava därmed kommer att acceptera. 4 Generera finns på webben http://www.nada.kth.se/stava/genstava.html 4

5. Resultat Ett hyfsat resultat uppnåddes. Grundformen för de ord som används i Stavas suffixregler plockades fram. Exempel på ord Inmatat n ns dockor dockorna dockornas avlade trevliga trevligare trevligast tittas tittat tittades besatt tillgiver tillgett tillgavs Utskrift avlägga trevlig trevlig trevlig titta titta titta besätta tillge tillge tillge Däremot klarade inte programmet av oregelbundet böjda verb och pronomen eftersom de inte ingår i de ursprungliga suffixreglerna. 5

6. Referenser Jurafsky & Martin. Speech and Language Processing. ISBN 0-13-095069-6, Prentice Hall. Kann & Hollman. Manualsida för Stava. <http://www.nada.kth.se/stava/manual.html>. 14 okt 2004. Kann & Hollman. Stavas Suffixregler. <http://www.nada.kth.se/stava/suffixregler.html>. 14 okt 2004. 6

7. Appendix CheckSuffix( ) kopierades för att behålla den tidigare funktionaliteten. Den nya funktionen döps till MyCheckSuffix( ) i modulen suffix.c. /* MyCheckSuffix kollar om word innehåller suffix i suffixtabellen. För varje rad i suffixtabellen som stämmer överens kollas att ordet finns i ordlistan om suffixet byts ut mot alla kollsuffix i så fall returneras 1 och grundformen av ordet skrivs ut. Annars returneras 0 och ordet skrivs ut samt att den inte hittade någon regel som matchade suffixet. */ int MyCheckSuffix(unsigned char *word) { unsigned char word2[langd], *word2end, word3[langd]; int len = strlen((char *)word), minprefixlen = 0, firstvowel, word2len; int i,j; suffixset *suf; suffixchecklist *p; if (len < PREFIXMIN) return 0; for (; isconsonant[word[minprefixlen]]; minprefixlen++); minprefixlen++; if (minprefixlen < PREFIXMIN) firstvowel = PREFIXMIN; else firstvowel = minprefixlen; CacheCheckWord(NULL, 0); if (len > PREFIXMIN) { for (suf = FindSuffix(word, len, firstvowel, word2, &word2len); suf; suf = FindNextSuffix(word, len, firstvowel, word2, &word2len)) { strcpy(word3,word2); word2end = word2 + word2len; for (p = suf->check; p; p = p->next) { strcpy(word2end, p->checksuffix); if (CacheCheckWord(word2, word2len + p->suffixlen)!= p->accept) goto nextsuffix; //Skriver ut grundformen om det finns en matchande regel. printf("grundform: "); WriteISO(word3); WriteISO(suf->check->checksuffix); printf("\n"); return suf->accept; /* Alla villkor OK */ nextsuffix: continue; for (i = SuffixStart[0]; i < SuffixStart[1]; i++) { suf = set[i]; if (CheckEmptySuffix(suf, word, len)) { strcpy(word2, word); word2end = word2 + len; for (p = suf->check; p; p = p->next) { strcpy(word2end, p->checksuffix); if (CacheCheckWord(word2, len + p->suffixlen)!= p->accept) goto nextsuffix2; printf("grundform: "); for(j=0;j<len-suf->len;j++) printf("%c",word2[j]); printf("%s\n",suf->check->checksuffix); return suf->accept; /* Alla villkor OK */ nextsuffix2: continue; printf("ordet: %s matchade ingen regel\n",word); return 0; 7

MyCheckSuffix( ) anropas från huvudmodulen stava.c från funktionen StavaWord( ). /* StavaWord checks if a word is correctly spelled. Returns 1 if the word is correctly spelled and 0 otherwise. */ int StavaWord( const unsigned char *word ) /* word to be checked */ { unsigned char buf[langd + 3], ord2[langd + 3]; int i, bindestreck = 0; for (i = 0; i < LANGD; i++) { if (!(buf[i] = bokstavstabell[word[i]])) break; if (buf[i] == '-') bindestreck++; if (i == LANGD) return 0; /* too long word */ if (i < ORDMIN) return 1; /* short words are always accepted */ if (KollaOrd(buf)) { // MyCheckSuffix anropas med det kontrollerade ordet word. MyCheckSuffix(word); return 1; if (bindestreck) { if (xsammansatta) if (KollaDelar(buf, ord2)) return 1; SuddaBindestreck(buf, ord2); if (KollaOrd(ord2)) return 1; return 0; Ett utdrag från listan (SLlist) med suffixregler. #Egna regler a an or #Egna regler slut. as ans ors orna ornas [^sxz]s @, en, ar ens @, en, ar ars @, en, ar arna @, en, ar arnas @, en, ar es ens ars arna arnas [^n]s [^n]ns [^n]ars [^n]arna [^n]arnas... 8