Granskas regelspråk. Tentativ version, Ola Knutsson IPLab, Nada, KTH

Relevanta dokument
Granskas regelspråk. Ola Knutsson. Uppdaterad IPLab, Nada, KTH

3. Granskas regelspråk

Parsning i Granska. Föreläsningens innehåll. Granskas uppbyggnad. Inspiration och förebilder. Regelmatchning/parsning. Granskas regelspråk

Innehåll GRAMMATIKKONTROLL I GRANSKA. Datorstöd för skrivande. Problemställning. Ola Knutsson

Institutionen för Lingvistik. NP-detektion UTVÄRDERING OCH FÖRSLAG TILL FÖRBÄTTRINGAR AV GRANSKAS NP-REGLER

Grundläggande textanalys, VT2013

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

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

Identifiering av ordvitsar med Granska

Föreläsningens innehåll. Granska. 1. Granskas regelspråk 2. Parsning i Granska 3. Språkgranskning i Granska 4. Granska-laborationen

Grammatisk teori II Attributvärdesgrammatik

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

Kungliga Tekniska Högskolan Patrik Dallmann

Innehåll. Datorstöd för skrivande och grammatikkontroll Ola Knutsson DH2418 Språkteknologi. Datorstöd för skrivande. Vilka metoder finns?

Inkongruens och särskrivna sammansättningar en beskrivning av två typer av fel och möjligheten att granska dem automatiskt

Inkongruens och särskrivna sammansättningar

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Användarhandledning Version 1.2

PROV. 12 Egenskaper (provavsnitt)

TDIU01 - Programmering i C++, grundkurs

729G04 Programmering och diskret matematik. Python 3: Loopar

Gränssnitt för FakeGranska. Lars Mattsson

Grundläggande Textanalys VT Språkgranskning (2) Eva Pettersson

Beräkningsvetenskap föreläsning 2

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Övningsuppgifter kapitel 8

Grammatisk teori III Praktisk analys

Grundläggande Textanalys VT Språkgranskning (2) Eva Pettersson

729G09 Språkvetenskaplig databehandling

Programmering II (ID1019) :00-11:00

Behov av språklig granskning. Granska och automatisk språkgranskning av svensk text. Datorn som språkgranskare

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Klassdeklaration. Metoddeklaration. Parameteröverföring

MATEMATIKENS SPRÅK. Avsnitt 1

Kungl. Tekniska högskolan NADA Grundformer med Stava

Föreläsning 3-4 Innehåll

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

Anteckningar 1: Grundläggande saker

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

STRÄNGAR DATATYPEN. Om du vill baka in variabler eller escape-tecken måste du använda dubbla citattecken. strängar

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

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

Linjära ekvationer med tillämpningar

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Objektorienterad programmering Föreläsning 4

TDDD02 Föreläsning 2 HT Reguljära uttryck och reguljära språk Lars Ahrenberg

i LabVIEW. Några programmeringstekniska grundbegrepp

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Tekniker för storskalig parsning

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

TDIU01 - Programmering i C++, grundkurs

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Exempel: Exempel: Exempel: Exempel: $djur=array("ko","katt","älg"); foreach ($djur as $d) { echo $d. " "; } Resultat. ko katt älg

Föreläsning 7: Syntaxanalys

Definition. Mängden av reguljära uttryck på alfabetet Σ definieras av. om α och β är reguljära uttryck så är (α β) ett reguljärt uttryck

Dagens föreläsning Programmering i Lisp Fö 5

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

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Logik och kontrollstrukturer

Datorlingvistisk grammatik

Karp. Övningar Språkbankens höstworkshop oktober 2016

Lingvistiskt uppmärkt text

Icarus - Enkelt Skript. Manual revision 1.2, Keylogic AB.

Språket Python - Del 1 Grundkurs i programmering med Python

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Programmeringsteknik med C och Matlab

MicroPython Ett textbaserad programmeringsspråk för Micro:bit

KODNING AV MAXIMALA GRAMMATISKA ENHETER Manual

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Ordklasser och satsdelar

DD1361 Programmeringsparadigm. Carina Edlund

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

729G09 Språkvetenskaplig databehandling

Tentamen Grundläggande programmering

1. Inledning, som visar att man inte skall tro på allt man ser. Betrakta denna följd av tal, där varje tal är dubbelt så stort som närmast föregående

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

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

Tentamen, EDAA10 Programmering i Java

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

Mathematica. Utdata är Mathematicas svar på dina kommandon. Här ser vi svaret på kommandot från. , x

Uppgift 1 ( Betyg 3 uppgift )

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Obesvarade frågor från F1

TDDI14 Objektorienterad programmering

Visual Basic, en snabbgenomgång

Maskinöversättning och språkgranskning. F6: Grammatikkontroll

Hemtentamen HT13 Inlämning senast Lärare: Tora Hedin

Kontextfria grammatiker

Inlämningsuppgift MiniPlotter

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Inlämningsuppgift: Pronomenidentifierare

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Att förstå hur man konstruerar modulära program Att kunna skapa nya funktioner Att förstå hur data skickas mellan funktioner

Datalogi för E Övning 3

Obligatorisk uppgift: Numerisk kalkylator

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

DAB760: Språk och logik

Transkript:

Granskas regelspråk Tentativ version, 1999-10-14 Ola Knutsson

Innehållsförteckning 1 Ett nytt och generellare regelspråk... 1 1.1 Förbättrad och utökad funktionalitet... 1 2 Definitioner och förklaringar... 2 2.1 Förklaringar... 2 2.2 En regel består av ett vänsterled och ett högerled... 2 3 Operatorer, kvantifikatorer och konstanter i regelspråket... 2 3.1 Operatorer... 2 3.1.1 Operatorer i fallande ordning...3 3.2 Kvantifikatorer... 3 3.3 Konstanter... 3 4 Notationen i vänsterledet... 4 4.1 Matchning av reguljära uttryck på teckennivå särbehandlas... 4 4.1.1 Markering och korrigering i det reguljära uttrycket...4 4.2 Matchning på tokennivå... 5 4.3 Operatorer mellan matchningsvariabler och mellan regler... 6 4.4 Punktnotation... 7 4.4.1 Hur undviker man att göra punktnotation på objekt som saknar ett visst attribut?...7 4.5 Att jämföra värden på särdrag... 8 4.6 Vänsterledets syntax... 8 4.7 Finns det några andra tolkningar än den taggaren har gett?... 10 4.7.1 Stiltaggar...11 4.8 Definition av konstanter... 11 4.9 Sekvensvariabler...12 4.9.1 Att komma åt ett speciellt token i en sekvensvariabel...13 5 Notationen i högerledet... 14 5.1 Högerledets syntax... 14 5.2 Metoder för att manipulera objekten i högerledet... 14 5.3 Funktioner i regelspråket... 15 5.4 If then else... 15 5.5 Ett typfel tillåts i högerledet... 15 5.6 Reglernas syntax...17 5.6.1 Namngivning av regler...17 5.7 mark... 17 5.8 corr... 18 5.8.1 Olika sätt att förändra texten...18 5.8.2 Alternativa corr-fält...21 5.9 jump... 22 5.10 info... 22 5.10.1 Generering av kommentarer...23 5.11 link... 23 5.12 action... 25 6 Olika typer av regler... 26 6.1 Hjälpregler... 26 6.1.1 Optionella hjälpregler...29 6.2 Samarbete mellan taggaren och reglerna... 30 6.3 Regelprioritet och villkorliga hopp... 31 6.3.1 Exempel på användning av jump...31 6.3.2 Att kunna hoppa förbi token i indata...32 6.4 Accepterande regler... 33 6.5 Att kunna ange meningsbörjan/slut... 33 6.6 Att kunna ange frasers (speciellt NP) början och slut... 34 6.7 Union och subtraktion mellan regler... 34 6.8 Regelexekvering...36 7 Hjälp för regelkonstruktören... 36 i

7.1 Kommentarer i reglerna... 36 7.2 SGML... 36 7.3 Spårning... 37 7.4 Syntax- och semantikkontroll... 37 Appendix. Särdragsklasser och särdragsvärden... 38 Särdragsvärden med förklaringar... 38 ii

1 Ett nytt och generellare regelspråk Granskas nya regelspråk kommer att skilja sig markant mot sin föregångare genom att vara generellare, mer väldefinierat och förhoppningsvis tydligare och roligare att använda. Enkelt uttryckt så kommer det att gå att göra mycket mer i det nya regelspråket. Ett av huvudsyftena med det nya regelspråket är att det skall kunna användas till olika lingvistiska operationer: Grammatikkontroll. Det skall finnas bättre och generellare sätt att ange vad som skall detekteras och hur det skall korrigeras. NP-detektion. Det skall vara möjligt att detektera språkliga fraser, t.ex. nominalfraser (NP). Det skall också gå att söka efter dessa för att förbättra detektionen av andra språkliga konstruktioner. Lingvistisk sökning och redigering. Det skall gå att utföra sökningar efter lingvistiska enheter, samt utföra redigering av dessa t.ex. förändra tempus hos verb eller att flytta konstituenter inom en mening. Förbättrad taggning. Vi vill kunna detektera vissa fall där vi vet att taggaren gör fel, ange en ny taggning på det detekterade området, samt be om en ny taggning som tar hänsyn till den angivna taggen (se 6.2). 1.1 Förbättrad och utökad funktionalitet I texten nedan följer en genomgång av vad vi i stora drag vill uppnå med regelspråket, längre ned i texten förklaras hur det skall gå till. Ett viktigt delmål är att reglerna skall få en tydlig notation och ökad uttryckskraft. Inspiration till reglernas notation hämtas från objektorienterade programmeringsspråk. Bra detektion och diagnos, det skall uppnås genom: statistisk kvantifiering (se 3.2). jämförelse av särdragens värden (se 4.5) sekvensvariabler (se 4.9) villkorliga hopp, för att åstadkomma regelprioritet (se 6.3), och accepterande regler (se 6.4). detektion av lingvistiska enheter, t.ex. nominalfraser (se 6.1). detektion och korrektion av felaktig taggning (se 6.2) Bra korrektion, det skall uppnås genom att: det som är fel skall kunna markeras med teckenprecision i texten (se 4.1.1 och 5.7) genererade ersättningsförslag skall kunna sättas in i texten (se 5.8) 1

2 Definitioner och förklaringar 2.1 Förklaringar Token En enhet som har ett språkligt innehåll, vanligtvis är ett token ett ord. Element Ett samlingsnamn för enskilda tecken, teckensekvenser och token, det vill säga något som går att matcha i indata. Regelmatcharen Regelmatcharen är det program som tolkar regelspråket och ser till att reglerna appliceras och tillämpas. 2.2 En regel består av ett vänsterled och ett högerled En regel består av ett vänster- och högerled. I vänsterledet skall det anges vad som skall matchas i indata. I högerledet anges vad som skall göras med det matchade i vänsterledet. För att det skall fungera väl är det viktigt att relationen mellan vänsterled och högerled är väl utarbetad. I beskrivningen av en regels uppbyggnad kommer vänsterledets beståndsdelar och funktionalitet att specificeras i kapitel 4. När detta är gjort kommer högerledet att specificeras i kapitel 5, i detta kapitel sätts också vänster- och högerled ihop för att bilda en regel. I kapitel 6 beskrivs andra typer av regler framförallt hjälpregler som påminner om regler i en frasstrukturgrammatik. Först av allt måste dock de operatorer, kvantifikatorer och konstanter som finns i regelspråket beskrivas, detta sker i nästa avsnitt. 3 Operatorer, kvantifikatorer och konstanter i regelspråket 3.1 Operatorer & Logiskt och mellan villkor Logiskt eller mellan villkor! Logisk negation av villkor = Lika med!= Inte lika med < Mindre än > Större än <= Mindre än eller lika med >= Större än eller lika med + binärt plus - binärt och unärt minus. Används också i intervall mellan matchningsvariabler i högerledet. := tilldelningsoperator, kommatecken används för att avskilja matchningsvariabler (se 4.3). ; semikolon innebär ett logiskt eller mellan regler (se 4.3), ~ tilde innebär subtraktion mellan två regler enligt mängdteorin (se 4.3), tilde används också vid matchning av reguljära uttryck på ordnivå. En konsekvenspil som skiljer vänsterled från högerled, vilket innebär att högerledet är en konsekvens av vänsterledets premisser. Regelbörjan, en regel inleds alltid med. Regelslut, en regel avslutas alltid med. Inleder en finite-state-grammar-regel (se 6.7). Avslutar en finite-state-grammar-regel (se 6.7). 2

3.1.1 Operatorer i fallande ordning Operatorer binder olika hårt och nedan följer en uppräkning av hur hårt de binder i fallande ordning. +- ~ =,!=, <, >, >=, <=! & := 3.2 Kvantifikatorer För att kunna hantera olika tolkningar av orden använder vi en statistisk kvantifierare som anger ett tröskelvärde för en viss given tolkning. P(Sannolikhet, Taggkombination) Statistisk kvantifierare som medför att en regel tillämpas endast om sannolikheten för att tolkningen Taggkombination, är lika med eller större än värdet för Sannolikhet. Sannolikheten anges som ett reellt tal X och det gäller att 0 <= X <= 1. A(Taggkombination) E(Taggkombination) Allkvantifierare, ett förkortat skrivsätt för P( 1, Taggkombination). Existenskvantifierare, ett förkortat skrivsätt för P(0.0001,Taggkombination). 3.3 Konstanter Det behövs konstanter i regelspråket, vi behöver följande: true false Numeriska konstanter, det vill säga alla heltal och reella tal. De reella talen skrivs med decimalpunkt, till exempel 0.34. 3

4 Notationen i vänsterledet En idé i regelspråkets notation är att införa variabler som anges i reglernas vänster- och högerled. I detta avsnitt och avsnitten som följer kommer notationen för reglernas vänsterled att presenteras. En matchningsvariabel, t.ex. X, som anges i vänsterledet, beskriver det område som skall matchas i indata när matchningen sker mot ett token, matchning på teckennivå särbehandlas, se nedan. Varje matchningsvariabel slår upp ett kontexthål i indata som kan fyllas med samma information igen, med ny information eller så tas informationen bort helt eller delvis (förändringar av kontexthålet sker i högerledet). 4.1 Matchning av reguljära uttryck på teckennivå särbehandlas Ej implementerat. Regler där vänsterledet består av reguljära uttryck särbehandlas i regelspråket eftersom dessa matchar över token- och meningsnivå. I vänsterledet anges endast det reguljära uttryck som skall matcha indata. Högerledet kommer dock att se likadant ut för regler som endast innehåller reguljära uttryck på teckennivå. I vänsterledet skrivs det reguljära uttrycket inom "...": /"regexp"/ där regexp utgörs av ett reguljärt uttryck på teckennivå med samma notation som i programmet grep under Unix. 4.1.1 Markering och korrigering i det reguljära uttrycket För att kunna göra markeringar och korrigeringar i regler med reguljära uttryck måste det finns sätt att uttrycka vad som skall markeras och vad som skall vara med i korrigeringen. Ett förslag är att använda den notation som finns i editeringsprogrammet sed. I sed finns det metatecken som anger vad som skall sparas i det reguljära uttrycket. Dessa är \( och \). För att ange vad som skall finnas med i den korrigerade strängen används referenserna \1 till \n. \1 refererar till den första parentesen som gjorts med \( och \) och så vidare. Exempel: I sed blir regeln för att ta bort dubbla mellanslag enligt följande: Indata: jag har en boll som är grön. (filen dubbla.mellanslag.txt) Utdata: jag har en boll som är grön. faun>sed 's/\([a-zåäö][a-zåäö]*\)[ ][ ]\([a-zåäö][a-zåäö]*\)/\1 \2/' dubbla.mellanslag.txt Eftersom reglerna i det nya regelspråket skall bestå av ett vänster- och högerled är det naturligt att metatecknen \( och \) anges i vänsterledet som matchar indata och \1 till \n anges i högerledet i fälten för att markera och korrigera, se avsnitten mark och korr. \1 till \n anges inom citattecken i mark- ock korrfältet. I det senare avsnittet kan du också se hur sed-uttrycket ovan kommer att formuleras i Granskas nya regelnotation. Där kan du även se hur det matchade området skall markeras i texten. 4

4.2 Matchning på tokennivå Varje token som skall matchas beskrivs med en matchningsvariabel som innehåller olika attribut för att ange vad som skall matchas. Det matchade ses som ett objekt med attribut och metoder för manipulation. Attributen kombineras med logiska operatorer. Attributen består av två grupper textattribut och särdragsattribut, dessa presenteras nedan. Objektens textattribut: text Detta attribut innehåller objektets textsträng. För att matcha ett objekts textsträng används dels textsträngar och dels reguljära uttryck på teckennivå. Textsträngar och reguljära uttryck anges inom "...". För att matcha ord används text = "ord" och för att matcha med reguljära uttryck används text ~ "regexp". lem Detta attribut innehåller objektets lemma, det vill säga ordets grundform. För matchning av detta attribut anges en textsträng. I vänsterledet skriver man lem = "lemma" för att matcha ett tokens lemma. Objektens särdragsattribut: Följande särdragsattribut används i denna text (komplett lista över samtliga särdragsklasser och särdragsvärden finns i Appendix). I regelspråket skiljer vi mellan särdragsklasser som utgör objektens attribut och särdragsvärden som utgör de värden som objektens attribut är satta till. Särdragsklasserna och särdragsvärdena som man vill använda i regelspråket definieras i en separat fil, för det är information som behövs redan vid taggningen. Särdragsklasser i detta dokument: wordcl ordklass gender genus num numerus spec species vbf verbform case kasus style stil sed meningsavgränsare phrase frastyp cap gemener eller versaler, olika kombinationer 5

Särdragsvärden i detta dokument: dt determinerare (artikel) jj adjektiv nn nomen (substantiv) def definit (bestämd) utr utrum vb verb pn pronomen vard vardagligt ord pc particip foal formella och ålderdomliga ord datm dataterm ie infinitivmärke nocapped ordet består av gemener firstcapped första bokstaven i ordet är en versal allcapped alla bokstäver i ordet är versaler mixedcapped ordet består av en blandning av versaler och gemener Alla matchningsvariabler består av två fält oavsett om det finns några matchningsvillkor. variabelnamn(matchningsvillkor) Exempel 1: En matchningsvariabel som matchar ett godtyckligt token i texten skrivs enligt: X() Exempel 2: En matchningsvariabel i vänsterledet som matchar ordet bilen kommer att se ut som nedan (med en viss redundans): X(text ="bilen" & lem="bil" & wordcl=nn & gender=utr & num=sin & spec=def & case=nom) 4.3 Operatorer mellan matchningsvariabler och mellan regler Vi vill kunna kombinera matchningsvariabler för att bilda fraser och andra konstruktioner. Vi vill också kunna kombinera regler för att konstruera mycket generella regler.vi har tre operatorer för detta ändamål. Dessa operatorer kan kombineras och vi kan konstruera ganska komplexa uttryck. A, B A ; B A ~ B Operatorn, skiljer matchningsvariabel A från matchningsvariabel B vilket innebär att A skall följas av B. B beskriver ett nytt ord som följer direkt efter A i indata. A och B måste gälla för att en regel skall tillämpas. Operatorn ; innebär ett logiskt eller mellan regler vilket innebär att regel A eller regel B måste gälla för att den sammansatta regeln skall tillämpas. Logiskt eller kan uttrycka mängdbegreppet A union B. Operatorn ~ innebär subtraktion mellan två regler, vilket innebär att villkoren i regel A skall gälla medan villkoren i B inte skall gälla för att regeln skall 6

matcha. Denna operator får endast i en speciell syntax se avsnittet Union och subtraktion mellan regler (6.7). En sekvens av matchningsvariabler blir med avskiljaren, mellan matchningsvariablerna enligt nedan: X1(text ="ordform" operator lem="lemma" operator matchningskrav), X2(text ="ordform" operator lem="lemma" operator matchningskrav),..., Xn(text ="ordform" operator lem="lemma" operator matchningskrav) Exempel på vad man kan uttrycka med dessa operatorer i samverkan finns i avsnittet Union och subtraktion mellan regler (6.7). 4.4 Punktnotation Om vi ser varje matchningsvariabel som ett objekt med attribut och metoder kommer vi att få en regelnotation som är mycket tydlig och kraftfull. Varje objekt kommer att motsvara ett element i texten, det vanligaste fallet blir att ett objekt motsvarar ett ord i texten. Från objektorienterade programmeringsspråk hämtar vi punktnotationen för att komma åt objektets attribut och metoder. En matchningsvariabel ser ut enligt följande: X(attribut1=värde1 & attribut2=värde2 &... & attribut_n =värde_n) En viktig sak är att man kan få fram objektens värden var som helst inom regeln och inte bara i den lokala matchningsvariabeln utan i andra matchningsvariabler samt i högerledet. 4.4.1 Hur undviker man att göra punktnotation på objekt som saknar ett visst attribut? Ett sätt att undvika att man gör punknotation på objekt som saknar ett attribut vore att man alltid måste matcha ordklassen först, men då förlorar man möjligheten att kunna söka direkt på morfosyntaktiska särdrag. Det smidigaste är om man endast behöver ange det enskilda särdrag som man är ute efter. I regelspråket löser vi detta genom att låta objektet returnera värdet undef när ett attribut saknas. Det är enkelt att uttrycka att det måste finnas ett språkligt värde på attributet genom att skriva att särdraget skall vara skilt från undef: X.särdragsattribut!=undef Detta är praktiskt när man söker efter något som inte skall ha ett visst värde men som skall ha ett värde på det angivna attributet: X.särdragsattribut!=undef & X.särdragsattribut!=värde Exempel: Matcha alla ord som inte är i utrum (utr) men som har ett nominalt innehåll. Regeln matchar: huset litet Regeln matchar inte: går till att Regel: 7

X(gender!=undef & gender!=utr) 4.5 Att jämföra värden på särdrag För att man skall kunna jämföra värden på särdrag krävs det att den lexikala informationen ordnas upp och värden sätts på attribut. Det måste finnas en lexikonpost för varje token. Underspecifierade taggar måste kunna unifiera specifierade när det är möjligt, t.ex. utr/neu skall unifiera både utr och neu. För att kunna jämföra två eller flera matchningsvariabler behöver vi olika särdragsattribut f1, f2,..., fn som sätts till värden F1, F2,..., Fn. Uppordning av den lexikala informationen sker enligt följande: text=ord & lem=lemma & f1=f1 & f2=f2 &...& fn=fn Exempel: Ordet bilen får följande utseende: (text=bilen & lem=bil & wordcl=nn & gender=utr & num=sin & spec=def & case=nom) Med punktnotation på de olika objekten jämförs värdena, det är inte nödvändigt att göra punktnotation på det objekt man befinner sig i, det vill säga om vi gör en jämförelse i objektet X så gäller att särdrag=x.särdrag & särdrag=särdrag Vid jämförelser får endast kända variablers särdragsattribut jämföras. Det är inte tillåtet att göra punktnotation på variabler som inte är introducerade, det vill säga endast bakåtreferens är tillåten. Jämförelse av särdragsattribut i olika matchningsvariabler måste ske enligt: X1(särdragsattribut_1=värde), X2(särdragsattribut_1=X1.särdragsattribut_1),..., Xn-1(särdagsattribut_1), Xn(särdragsattribut_1=Xn-1.särdragsattribut_1) 4.6 Vänsterledets syntax Vänsterledet måste bestå av följande element för att tillhöra regelspråket. regelbörjan X_0(),, X_n() matchningsvariabeln X_0. Om det kommer fler matchningsvariabler efter X_0 följs X_0 av avskiljaren, ev. ytterligare matchningsvariabel. pilen avskiljer vänsterledet från högerledet 8

Exempel 1: Exemplet visar hur detektion av kongruenta nominalfraser går till. De tre matchningsvariablerna X1, X2 och X3 måste unifiera för att matchning skall ske. I det här fallet måste de olika särdragsattributen ha följande värden: gender=utr, num=sin och spec=ind. Regeln kommer dessutom att matcha fraser som det stora huset eller de snälla pojkarna, det vill säga alla korrekta nominalfraser som består av en artikel följt av ett adjektiv följt av ett substantiv. Felaktiga fraser som en litet bil, det stort huset och den snälla pojkarna kommer däremot inte att matchas. Indata: Jag ser den lilla bilen Jag ser ett stort hus. Regel: X1(wordcl=dt), X2(wordcl=jj & gender=x1.gender & num=x1.num & spec=x1.spec), X3(wordcl=nn & gender=x2.gender & num=x2.num & spec=x2.spec) Nedan visas samma regel men med bättre namn på variablerna så att det blir lättare att förstå vad de står för. Artikel(wordcl =dt), Adjektiv(wordcl =jj & gender=artikel.gender & num=artikel.num & spec =Artikel.spec), Substantiv(wordcl=nn & gender=adjektiv.gender & num=adjektiv.num & spec=adjektiv.spec) Exempel 2: Exemplet visar ett vänsterled för att detektera den inkongruenta nominalfrasen en litet bil. Notera att vänsterledet dessutom kommer att detektera nominalfraser som ett liten hus. X1(wordcl=dt), X2(wordcl=jj & num=x1.num & spec=x1.spec ), X3(wordcl=nn & gender!=x2.gender & gender=x1.gender & num=x2.num & spec=x2.spec) 9

4.7 Finns det några andra tolkningar än den taggaren har gett? Det kan vara intressant att veta om ett token har ytterligare tolkningar än den som taggaren gett, t.ex. vid omtaggning av en mening. Informationen om ett tokens tolkningar nås genom en pekare till objektets lexikala information, kallad lex. Informationen nås genom att skriva:.lex För att undersöka vilka tolkningar som existerar använder man tre kvantifikatorer med följande notation: Existenskvantifikatorn: X(E(lex.särdrag=värde)) Allkvantifikatorn: X(A(lex.särdrag=värde)) Statistisk kvantifierare: X(P(lex.särdrag=värde)) Exempel 1: Vi vill ange som krav att det måste finnas en adjektivtolkning förutom den substantivtolkning som taggaren gett för att en matchning skall ske. Matchar: svenska Matchar inte: bilen Regel: X1(wordcl=nn & E(lex.wordcl=jj)) Exempel 2: Vi vill ange som krav att det endast får finnas substantivtolkningar förutom den substantivtolkning som taggaren gett för att en matchning skall ske. Matchar: bilen Matchar inte: svenska Regel: X1(wordcl=nn & A(lex.wordcl=nn)) Exempel 3: Vi vill ange som krav att det måste finnas en tolkning som determinerare med lexikal sannolikhet som är lika med 0.6 förutom den pronomentolkning som taggaren gett för att en matchning skall ske. Matchar: den Matchar inte: det Regel: X1(wordcl=pn & P(0.6, lex.wordcl=dt)) 10

4.7.1 Stiltaggar En del ord i lexikon är uppmärkta med stiltaggar för att vi skall kunna detektera ord som avviker i stil. Stiltaggarna hos orden nås genom pekaren lex. Exempel: Indata: Jag såg dej på stan igår. Ordet dej matchas. Regel: X(lex.style=vard) 4.8 Definition av konstanter Ej implementerat. Det skall vara möjligt att definiera konstanter i regelspråket, detta måste göras överst i regelsamlingen. Det kan t.ex. handla om konstanten adj som står för att ordklassen är antingen jj eller pc. Vi använder tilldelningsoperatorn för att tilldela dem värden. Man inleder deklarationen med det reserverade ordet const och avslutar deklarationen med ; const konstantnamn:=värde; Exempel 1: Det behövs en konstant som betecknar adjektiv och participer med ett namn. const adj:=wordcl=jj wordcl=pc; Exempel 2: Vi vill ha en konstant för kommentaren för dubbelt supinum. const supkom:= Dubbelt supinum. Undvik s.k. dubbelt supinum, t.ex. >>kunnat gjort>>. Skriv istället >>kunnat göra>> som är grammatiskt korrekt. Myndigheternas skrivregler 4.2.8 ; 11

4.9 Sekvensvariabler En sekvensvariabel innebär att samma krav för matchning gäller över flera token. Hur beskrivs en variabel som gäller för flera token i en sekvens? Jo genom att sätta en asterisk(*) efter matchningsvariabeln så har man angett att denna variabel är en sekvensvariabel som sträcker sig över noll eller flera tokens. Sekvensvariabeln skall alltid matcha så många element som möjligt. Kraven på denna variabel anges på samma sätt som för en vanlig matchningsvariabel. Sekvensvariabler får användas i såväl vänsterled som högerled. Det går endast att använda sekvensvariabler för matchning mot token. En sekvensvariabel som matchar en sekvens av token, från 0 och uppåt: X(matchningskrav)* För att öka uttryckskraften vill vi ha en sekvensvariabel som matchar en sekvens av token, från 1 och uppåt: X(matchningskrav)+ Det skall också gå att uttrycka 0 eller 1 token: X(matchningskrav)? För en mer kontrollerad sekvens måste det gå att ange hur lång sekvensen maximalt får vara, det görs med ett heltal, n. Sekvensen kan vara 0 till n lång. X(matchningskrav)n Exempel 1: Detta vänsterled visar hur regeln kommer utan att kan formuleras i vänsterledet. Några fraser som regeln täcker in: kommer spela kommer inte spela kommer inte du spela Men regeln matchar inte: kommer inte att spela kommer och spelade X1(text ="kommer"), X2(wordcl!=ie)*, X3(wordcl=vb & vbf=inf) vbf betyder verbform 12

Exempel 2: Detta exempel beskriver hur en nominalfras med maximalt 3 adjektiv matchas. Några fraser som den matchar: den bilen en liten bil den röda stora bilen de modiga röda starka riddarna X1(wordcl=dt), X2(wordcl=jj & gender=x1.gender & num=x1.num & spec=x1.spec)3, X3(wordcl=nn & gender=x1.gender & num=x1.num & spec=x1.spec) 4.9.1 Att komma åt ett speciellt token i en sekvensvariabel För att komma åt ett speciellt token i en sekvensvariabel eller hjälpregel används en vektornotation. X[nth token] vilket token i ordningen man är ute efter anges med en variabel i, det blir: X[i]. Det första elementet i vektorn är X[0]. Exempel på hur denna notation används, presenteras när högerledet är specificerat. Samma notation gäller för att komma åt ett speciellt token i hjälpregler (se avsnittet Hjälpregler). 13

5 Notationen i högerledet I högerledet behövs det möjligheter att utföra konsekvenser av matchningen. Högerledet består av olika fält, i dessa fält anges vad man vill göra med de matchningsvariabler som finns i vänsterledet. Alla fält utom action är optionella i högerledets syntax. Följande fält behövs för att ange vad som skall utföras: mark corr jump info action link Detta fält fylls i med det som skall markeras i texten för just denna matchning. Se vidare i avsnittet mark. Här anges det som skall fylla kontexthålet som slagits upp av matchningsvariabeln. Se vidare i avsnittet corr. I detta fält anropas procedurer för hoppsatser som innebär att regelmatcharen skall fortsätta från ett specifikt avsnitt i regelsamlingen eller i indata. Se vidare i avsnittet jump. I detta fält skall den kommentar som skall presenteras vid utförd granskning anges. Se vidare i avsnittet info. I detta fält anges vilken typ av regel det är, det vill säga om det är en granskningsregel, sök- eller redigeringsregel, omtaggningsregel, accepterande regel eller hjälpregel. Se vidare i avsnittet action. I detta fält anges en länk till ett dokument som beskriver feltypen ytterligare. Se vidare i avsnittet link. 5.1 Högerledets syntax Högerledet, som börjar efter avskiljaren, måste innehålla följande element för att godkännas i regelspråket: avskiljaren mellan vänster- och högerledet action() action anger vilken regeltypen är, övriga fält är optionella. regelslut 5.2 Metoder för att manipulera objekten i högerledet no_of_tokens substr (X, Y) length no_of_tokens är en metod som räknar antalet token i en sekvensvariabel eller hjälpregel. Metoden returnerar ett heltal mellan 0 och n. substr är en metod som returnerar delsträngar. Delsträngen anges med en startposition (X) och en längd (Y) i strängen. En sträng i regelspråket börjar i position 0. length returnerar längden i antal tecken för objektets textsträng. 14

get_form(l) get_replacement get_comment color (C) get_form, tar en lista med lemma- och särdragsattribut satta till värden som det genererade ordet skall ha. Man behöver endast ange de särdrag som skall sättas om. Det genererade ordet returneras. Om listan är: lem:=bil, wordcl:=nn, gender:=utr, num:=sin, spec:=def, case:=nom så returneras ordet bilen. get_replacement är en metod som slår upp ett ersättningsord till objektet i lexikonet. Ersättningsordets textattribut returneras. (Ej implementerat) get_comment returnerar en hyperlänk för en källa för en ordunik kommentar eller själva kommentaren som returneras som en sträng. (Ej implementerat) color är en metod som sätter färgen (C) på det element som skall markeras. Röd färg är förvalt värde när orden markeras och color behöver alltså inte användas. (Ej implementerat) 5.3 Funktioner i regelspråket concat (X, Y) Stava_OK (str) Funktionen concat tar två matchningsvariabler som argument och sätter ihop deras textsträngar (X följt av Y) till en textsträng som returneras. Funktionen tar en sträng (ett ord) som argument och returnerar true om ordet är rättstavat och false om ordet är felstavat. first_spelling_correction (str) Funktionen tar en sträng (ett felstavat ord) som argument och returnerar ett ersättningsförslag. Om det saknas ersättningsförslag returneras tomma strängen. toupper (str) tolower (str) italics (w) bold (w) Funktionen tar en sträng som argument och returnerar alla bokstäver i strängen som versaler. Funktionen tar en sträng som argument och returnerar alla bokstäver i strängen som gemener. italics returnerar ordet kursivervat. bold returnerar ordet i fet stil. 5.4 If then else För att kunna undersöka objekten ytterligare i högerledet vill man kunna skriva if-then-elseuttryck. If-then-else skrivs enligt nedan: if expression then expression else expression end Exempel på hur if-then-else används presenteras längre ned i texten. 5.5 Ett typfel tillåts i högerledet För att underlätta regelskrivandet kommer vi att tillåta ett typfel, det skall räcka att endast ange matchningsvariabeln i fälten, egentligen skall den textsträng som objektet innehåller anges med punktnotation. Det korrekta vore: X.text 15

men vi förenklar, eftersom objekten alltid innehåller text, till att endast ange namnet på objektet för att få fram texten i högerledet: X Observera att detta gäller endast på den yttersta nivån, i metoder och funktioner måste textattributet anges som brukligt är, det vill säga X.text. 16

5.6 Reglernas syntax En viktig skillnad mot Granskas tidigare regelspråk är att i detta nya regelspråk så skall det finnas en relation mellan vänster- och högerled. Variablerna i vänster- och högerledet refererar till samma objekt, vilket innebär att de binder samma kontexthål i texten. Variabeln X i vänsterledet anger samma kontexthål som X i högerledet. Görs det ingen förändring av kontexthålet som anges av X i vänsterledet och X i högerledet beskriver dessa exakt samma element. För att exemplen för högerledet skall bli relevanta kommer de att exemplifieras med både vänster- och högerled. En regel måste innehålla följande element för att accepteras i regelspråket: regelbörjan X() minst en matchningsvariabel, om flera matchningsvariabler skall användas måste dessa avskiljas med, avskiljare mellan vänster- och högerled action(regeltyp) action måste anges, övriga fält är optionella regelslut 5.6.1 Namngivning av regler En regel måste kunna referera till andra regler, därför behöver vi kunna namnge regler. Regelmatcharen måste också kunna hålla reda på vilken regelkategori som en regel tillhör så att användaren kan plocka bort och lägga till regelkategorier efter sina önskemål. Regelkategori är optionellt vid namngivning. Vi anger regelnamn och regelkategori enligt följande notation: regelnamn@regelkategori X() 5.7 mark Detta fält är till för att kunna markera ord eller tecken som är fel i den matchade sekvensen. Vi vill kunna göra flera saker i detta fält: a) Markera alla element som har matchats i regeln man skriver all i fältet. b) Markera ett eller flera ord de matchningsvariabler som skall markeras anges. Det är också möjligt att ange ett intervall av matchningsvariabler med -, till exempel X2-X4. c) Markera endast en del av ett token, metoden för detta är sub, se ovan. d) Markera en delsträng av det reguljära uttryck som matchats. Det görs genom att ange vilken del av det reguljära uttrycket som skall markeras med hjälp av parenteser i det matchande uttrycket i vänsterledet. Dessa kan man sedan referera till i högerledet genom att de numreras från vänster till höger (se 4.1.1). Ej implementerat. e) Om man vill avstå från att markera det som har matchats utelämnar man mark. 17

5.8 corr Om man vill ändra något i det som har matchats i vänsterledet så anges det här genom att matchningsvariabeln anges som den är eller att den anges förändrad med hjälp av de metoder och funktioner som specificerats ovan. Det går också att sätta in textsträngar direkt i detta fält. Om texten skall lämnas oförändrad anges matchningsvariablerna i fältet i den ordning som de skall stå eller så kan man skriva all i fältet. Det skall gå att ange ett spann av variabler med -, det vill säga X1-Xn. I reglerna skall det se ut enligt följande: X1(matchningskrav), X2(matchningskrav),..., Xn(matchningskrav) mark() corr(x-xn) action() 5.8.1 Olika sätt att förändra texten Det finns flera olika sätt att förändra det som har matchats i texten. Varje matchningsvariabel slår upp ett kontexthål som kan förändras genom den relation som finns mellan regelleden. Det som matchas i vänsterledet kan förändras genom att: ta bort matchningsvariabeln i högerledet, det vill säga X Y Z X Z byta plats på variablerna i högerledet, det vill säga X Y Z X Z Y sätta in textsträngar, det vill säga X Y Z X Y "ny sträng" Z sätta in ersättningsförslag, det vill säga X Y Z X "ersättningsförslag" Z Nedan följer åtta exempel som beskriver hur detta går till. Exempel 1: Ej implementerat En regel för att förända något som matchat och endast det som är fel markeras. Exemplet visar hur felet dubbla mellanslag detekteras och korrigeras. Indata: Jag har vunnit på tipset. Utdata 1 (felet markeras): Jag har vunnit på tipset Utdata 2 (felet åtgärdas): Jag har vunnit på tipset Regel: ("\([a-zåäöa-zåäö]\)\([ ][ ]\)\([a-zåäöa-zåäö]\)"/ mark( \2 ) corr( \1 \3 ) action(scrutinizing) 18

Exempel 2: Regeln lämnar elementet oförändrat men markerat. Exemplet visar hur man som pronomen markeras: Indata: Vad gör man när man inte vet hur man skall göra? Utdata: Vad gör man när man inte vet hur man skall göra? Regel: X1(wordcl!=dt & wordcl!=jj), X2(text ="man" & wordcl=pn) mark(x2) corr(x1 X2) action(scrutinizing) Exempel 3: Regeln skall ta bort element. Exemplet visar hur två och i rad tas bort: Indata: Jag kan inte spela och och det kan inte hon heller. Utdata 1 (felet markeras): Jag kan inte spela och och det kan inte hon heller. Utdata 2 (felet åtgärdas): Jag kan inte spela och det kan inte hon heller. Regel: X1(), X2(text=X1.text) mark(all) corr(x1) action(scrutinizing) Exempel 4: Vi vill byta plats på element. Artikeln och adjektiv har bytt plats: Indata: Vi bor i litet ett hus. Utdata 1 (felet markeras): Vi bor i litet ett hus Utdata 2 (felet åtgärdas): Vi bor i ett litet hus. Regel: X1(wordcl=jj), X2(wordcl=dt & gender=x1.gender & num=x1.num & spec=x1.spec), X3(wordcl=nn & gender=x2.gender & num=x2.num & spec=x2.spec) mark(x1 X2) corr(x2 X1 X3) action(scrutinizing) 19

Exempel 5: Sätta in ett nytt element. Artikeln saknas i nominalfrasen. Indata: Vi bor i litet hus. Utdata 1 (felet markeras): Vi bor i litet hus. Utdata 2 (felet åtgärdas): Vi bor i ett litet hus. Regel: X1(wordcl=jj), X2(wordcl=nn & gender=x1.gender & num=x1.num & spec=x1.spec) mark(all) corr("ett" X1 X2) action(editing) Exempel 6: Ett exempel som visar hur två element sätts ihop till ett. Indata: Skolan har köpt ett cykel ställ. Utdata 1: Skolan har köpt ett cykel ställ. % Felet markeras Utdata 2: Skolan har köpt ett cykelställ. X1(wordcl=dt), X2(wordcl=nn & gender!=x1.gender), X3(wordcl=nn & gender=x1.gender) mark(x2 X3) corr(x1 concat(x2.text, X3.text)) action(scrutinizing) Exempel 7 En regel som detekterar ett kongruensfel och genererar ett ersättningsförslag som sätts in i texten. Indata: Vi bor i den stora huset. Utdata 1: Vi bor i den stora huset. (* fet stil=blått och understykning=rött *) Utdata 2: Vi bor i det stora huset. X1(wordcl=dt), X2(wordcl=jj), X3(wordcl=nn & gender!=x1.gender & gender=x2.gender & num=x2.num & spec=x2.spec) mark(x1 X2.color(blue) X3.color(blue)) corr(x1.get_form(gender:=x3.gender) X2 X3) action(scrutinizing) 20

Exempel 8 Exempel på en regel som ger förslag på ett lämpligare ord och sätter in det i texten. Indata: Felet måste finnas nånstans. Utdata 1: Felet måste finnas nånstans. Utdata 2: Felet måste finnas någonstans. Regel: X1(style=vard) mark(x1) corr(x1.get_replacement) action(scrutinizing) 5.8.2 Alternativa corr-fält Ibland vill man kunna ge flera olika ersättningsförslag från en regel. Det går därför att ange flera alternativa corr-fält i högerledet. Exempel: Ofta är det svårt att avgöra om det är artikeln eller substantivet som skall ersättas vid en feldetektion. Följande regel ger två olika förslag när artikeln och substantivet inte stämmer överens vad det gäller numerus. Indata: Jag såg en män som gick mot rött. Utdata från det första corr-fältet: Jag såg några män som gick mot rött. Utdata från det andra corr-fältet: Jag såg en man som gick mot rött Regel: X(wordcl=dt), Y(wordcl=nn & num!=x.num) corr(x.get_form(num:=y.num) Y) corr(x Y.get_form(num:=X.num)) action(scrutinizing) % byter ut artikeln % byter ut substantivet 21

5.9 jump I detta fält skall man ange till vilket läge (label i C) som man vill att regelmatcharen skall hoppa till (1). Det skall också gå att hoppa förbi alla regler till slutet av regelsamlingen (2). Det går också att hoppa framåt i regelsamlingen samtidigt som regelmatcharen hoppar förbi ord i indata (3). Alla hopp måste ske framåt i regelsamlingen för att undvika oändliga loopar. Ett läge skrivs i regelkoden enligt: namn: Vi kan använda jump på minst tre olika sätt: 1. Hopp till en regel i regelsamlingen. Det sker genom att ange ett läge som föregår den regel som står på tur för applicering. X1(matchningskrav) jump(läge) action() 2. Vi vill att inga fler regler skall exekveras på den aktuella sekvensen. Genom att skriva jump(endlabel) appliceras inga fler regler i regelsamlingen och matchningen flyttas fram ett token. Läget endlabel är fördefinierat och skall alltså inte anges i regelsamlingen. Det finns också ett fördefinierat läget som heter beginlabel som betecknar regelsamlingens början. X1(matchningskrav) jump(endlabel) action() 3. Om vi vill att regelmatcharen skall hoppa förbi flera token i indata anger vi dels ett läge och dels hur många token framåt vi vill hoppa i indata. Argumentet läge fungerar som i 1 och 2. Argumentet antal_token anger antalet token som regelmatcharen skall hoppa framåt i meningen. Man räknar från vänster till höger, där det första ordet anges med 0, det handlar egentligen om positioner här, regelmatcharen går förbi position 0 och börjar nästa matchning på det token som finns i position 1. Detta medför att jump(läge) och jump(läge, 0) betyder samma sak. X1(matchningkrav) jump(läge, antal_token) action() 5.10 info En ytterligare förändring från tidigare versioner av Granskas regelspråk är att vi vill kunna ange kommentarer till användaren direkt i reglerna. Kommentaren som skall presenteras för användaren utgör också en utmärkt kommentar till själva regeln. Notationen är: info( kommentar ) 22

5.10.1 Generering av kommentarer Man vill kunna generera olika kommentarer till de regler som är generella genom att sätta in olika ersättningsförslag i kommentarerna. Kommentaren byggs upp av strängar och matchningsvariabler som tillsammans bildar kommentartexten. Exempel 1: Utdata (i dialogruta): Stela och ålderdomliga ord. Ordet x är ålderdomligt, byt ut det mot y. Svarta listan, 1988. Regel: info( Stela och ålderdomliga ord. Ordet X.text är ålderdomligt byt ut det mot X.get_replacement. Källa: Svarta listan, 1988 ) action(scrutinizing) Det finns också ett behov att få fram ordunika kommentarer till exempel för datatermer. Vi använder metoden get_comment för detta, se 5.11, ej implementerat. 5.11 link Mer omfattande kommentarer eller hänvisningar till böcker i hypertext, till exempel Svenska skrivregler, sker med hyperlänkar i fältet link. En skrivregellänk anges som en hyperlänk inom.... Exempel 1: Programmet visar en länk till den aktuella skrivregeln. link( /granska/skrivregler/regel_120.html ) 23

Exempel 2: Vi vill ge en ordspecifik kommentar som anges med en hyperlänk till datatermgruppens ordlista. Länken finns i lexikonet och hämtas med get_comment. Indata: Av systemgruppen får du ett user name. Utdata: Av systemgruppen får du ett användarnamn. Utdata (kommentar): Använd användarnamn i stället för eng. user name. Kommentar En datoranvändare identifierar sig för datorn eller ett program med ett användarnamn, som kan vara ett personnamn (t.ex. Karin) eller en mer abstrakt beteckning (t.ex. xed324). När identifieringen inte görs med namn, kan det kännas naturligare att använda termen användarbeteckning, alternativt användaridentitet eller användar-id (motsvarande eng. user ID). Konto (av eng. account) används också för detta begrepp, men det är mindre lämpligt. Vi definierar först en konstant för den generella kommentaren i regeln: const datakomm:= Dataterm. Det finns ord på svenska som fungerar lika bra. Källa: Svenska datatermgruppen ; Regel: X(style=datm) mark(x) corr(x.get_replacement) info(datakomm) link(x.get_comment) action(scrutinizing) 24

5.12 action Vi vill använda regelspråket till att lösa flera olika uppgifter och vi delar därför in reglerna i olika regeltyper. I fältet action skall man ange vilken regeltyp det är. Vi har följande typer: scrutinizing tagging searching editing help accepting Granskningsregler för stavnings- och grammatikkontroll. Regler för att göra om taggningen av en mening. I detta fält kan man sätta värden på attribut som skall gälla vid omtaggningen. Se vidare i avsnittet Samarbete mellan taggaren och reglerna (6.2). Regler för att söka efter lingvistiska enheter. Regler för att förändra, flytta eller ta bort lingvistiska enheter. Hjälpregler som kan anropas av andra regler för att förbättra träffsäkerheten hos dessa. I detta fält sätts hela hjälpregelns attribut. Notationen blir: action(help, särdragsattribut_1 :=värde_1 & särdragsattribut :=värde_2 &... & särdragsattribut_n :=värde_n). Se vidare i avsnittet Hjälpregler (6.1). Regler som används för att godkänna en struktur och som sedan gör ett hopp förbi ett antal felregler. 25

6 Olika typer av regler I fältet action som beskrivits ovan skall man ange vilken typ av regel som skall appliceras. Nedan följer en genomgång av några av de regeltyper som finns förutom de granskningsregler som vi är vana vid. Ett avsnitt kommer också att visa hur Finite State Grammars (Ref) kan implementeras i Granska (6.7). Sist i kapitlet beskrivs också något om hur reglerna skall exekveras. 6.1 Hjälpregler Med hjälpregler menas regler som endast är till för att öka den generella lingvistiska analysen. Hjälpreglerna anger en sekvens i indata, vilka gemensamma attribut denna sekvens skall ha sätts i fältet action i högerledet, t.ex. om en nominalfras skall ha bestämd form eller obestämd form. Hjälpreglerna skall kunna anges i andra regler. Det är dock inte tillåtet att använda operatorerna + och * tillsammans med en hjälpregel när de anges i andra regler,? går däremot bra. En hjälpregel skall kunna hanteras som ett objekt i övriga regler, det vill säga de metoder och funktioner som finns för objekten skall fungera även för hjälpreglerna. För att namnge regler används snabel-a @ efter regelnamnet: Regelnamn@ X1(),..., Xn() action(help) När en hjälpregel anges i en annan regel anges den inom en parentes, enligt: (Hjälpregel)(), X(), Y() För att ytterligare öka möjligheterna att använda hjälpregler går det att ge dessa ett lokalt namn inom en regel enligt syntaxen: (Hjälpregel/Lokalt_namn)() Med denna lokala namngivning kan man använda flera hjälpregler med samma namn men med olika innehåll i en regel. Hjälpregeln matchar till exempel kongruenta nominalfraser, vilket innebär att till exempel X skulle kunna matcha den lilla hunden och Z skulle kunna mactha det stora huset i regeln nedan: (Hjälpregel, X)(), Y(), (Hjälpregel, Z)(Z.attribut!=X.attribut) För att ange ett speciellt token i en hjälpregel gör man på samma sätt som i sekvensvariablerna och använder en vektornotation, Hjälpregel[n]. Först dock ett exempel på hur man gör i sekvensvariabler. 26

Exempel 1: Vi vill komma åt ett specifikt element i en sekvensvariabel: Indata: Jag har sålt den lilla röda stugan i skogen Utdata: Jag har sålt den röda stugan i skogen Regel: X1(wordcl=jj)+ mark(all) corr(if X1.no_of_tokens =2 then X1[1] else end) action(editing) Exempel: Vi vill komma åt ett specifikt element i en hjälpregel som anropas i en sökregel: Indata: Jag har sålt den röda stugan i skogen. Utdata: Jag har sålt stugan i skogen. (NP)() mark(all) corr(if NP.no_of_tokens =3 then NP[2] else end) action(searching) Exempel 1: Sök efter alla prepositionsfraser Indata: Vi har köpt bensin till vår vita bil. Utdata: Vi har köpt bensin till vår vita bil. Vi använder hjälpregeln som beskriver en nominalfras: I åtgärdsfältet sätter vi värden för hela nominalfrasen. NP@ X1(wordcl=ps), X2(wordcl=jj & gender=x1.gender & num=x1.num & spec=x1.spec), X3(wordcl=nn & gender=x2.gender & num =X2.num) action(help, gender :=X1.gender, num :=X1.num, spec :=X1.spec) Sökregeln blir: X1(wordcl=pp), (NP)() mark(all) corr(x1 NP) action(searching) 27

Exempel 2: Icke-symmetriska nominalfraser. Nominalfraser som samordnas med konjunktion skall vanligen vara symmetriska. Vi skriver en regel som letar upp nominalfraser som inte är symmetriska. Indata: Sportaffären säljer dyra drag och billigt spö. Utdata 1 (orden markeras): Sportaffären säljer dyra drag och billigt spö. Utdata 2 (efter korrektion): Sportaffären säljer dyra drag och billiga spön. Först en hjälpregel: NP@ X(wordcl=jj), Y(wordcl=nn & gender=x.gender num=x.num & spec=x.spec) action(help, gender:=y.gender, num:=y.num, spec:=x.spec) Granskningsregeln blir: (NP, X)(), Y(wordcl=kn), (NP, Z)(num!=X.num spec!=x.spec) mark(all) corr(x Y Z[0].get_form(gender:=X.gender, num:=x.num, spec:=x.spec) Z[1].get_form(gender:=X.gender, num:=x.num, spec=x.spec) action(scrutinizing) 28

6.1.1 Optionella hjälpregler Optionella hjälpregler är mycket användbart om man vill skriva generella regler. Det handlar ofta om fraser som ibland finns med en i sekvens men inte alltid, som till exempel adjektiven i en nominalfras (se exempel nedan). En optionella hjälpregel anges med?, enligt: (Hjälpregel)()? Exempel: Vi vill skriva en granskningsregel som detekterar fraser där artikeln och substantivet är inkongruenta, vi vill också att det skall kunna förekomma adjektiv mellan artikeln och substantivet. Vi skall detektera fraser med adjektiv och fraser utan adjektiv. Om fraserna innehåller adjektiv skall dessa kongruera med substantivet. Detektion av kongruensfel med adjektiv: Indata : Jag såg en litet hus i skogen. Utdata: Jag såg ett litet hus i skogen. Detektion av kongruensfel utan adjektiv: Indata : Jag såg en hus i skogen. Utdata: Jag såg ett hus i skogen. Först anger vi hur hjälpregeln för adjektivfrasen skall se ut. Adjektivfrasen skall innehålla ett eller flera kongruenta adjektiv: JJ@ X(wordcl=jj), Y(wordcl=jj & (gender=x.gender & num=x.num & spec=x.spec))*, action(help, gender:=x.gender, num:=x.num, spec:=x.spec) Därefter skriver vi granskningsregeln: kong22@inkongruens X(wordcl=dt), (JJ/Y)()?, Z(wordcl=nn & (gender!=x.gender num!=x.num spec!=x.spec) & (Y.no_of_tokens=0 (gender=y.gender & num=y.num & spec=y.spec)) mark(all) corr(x.get_form(gender:=z.gender, num:=z.num, spec:=z.spec) Y Z) action(scrutinizing) 29

6.2 Samarbete mellan taggaren och reglerna Vi har upptäckt att den probabilistiska taggaren taggar fel enligt återkommande mönster. Dessa mönster vill vi fånga upp och tagga om. Vi vill åstadkomma följande: 1. En regel hittar en sekvens som vi vet att taggaren ofta taggar fel. 2. Vi vill kunna ange att det skall finnas andra tolkningar än den taggaren har kommit fram till för att regeln skall tillämpas. 3. Vi väljer en tolkning som vi vet är mer riktig och vi anger den och den skall gälla vid omtaggningen. 4. Meningen taggas om. 5. Ny regelexekvering. Vi uppnår det genom: 1. Vi matchar den taggning som vi vet är fel i vänsterledet. 2. Vi undersöker det felaktigt taggade objektet ytterligare genom att ange att den förhoppningsvis korrekta tolkningen skall existera i strukturen lex. 3. Genom att ange i fältet action att regeln är en taggningsregel så kan vi sätta värden på det feltaggade objektets attribut, för att kunna utgå ifrån denna vid nästa taggning. Med notationen X.särdragsklass :=särdragsvärde sätts den tagg som skall gälla vid omtaggningen. 4. Vi väljer tagging i fältet action i regeln, så tolkas det som att meningen skall taggas om. 5. När taggningen är färdig appliceras de resterande reglerna på den omtaggade meningen och resten av texten. Vi vill också kunna förändra en mening genom att ta bort, lägga till eller byta plats på ord för att sedan tagga om den förändrade meningen. Den förändrade delen av meningen anges i fältet corr och meningen taggas om utifrån denna förändring. Notationen för fältet action vid taggning blir: action(tagging, särdrag_1:=värde_1,, särdrag_n:=värde_n) Exempel 1: Felaktig taggning av artikeln i en nominalfras. Indata: Taggaren har taggat den i den lilla pojken som pronomen. Utdata: Taggaren taggar den i den lilla pojken som determinerare. X1(wordcl=pn & E(lex.wordcl=dt)), X2(wordcl=jj & gender=x1.gender & num=x1.num & spec=x1.spec), X3(wordcl=nn & gender=x2.gender & num=x2.num & spec=x2.spec ) corr(all) action(tagging, X1.wordcl:=dt) 30

Exempel 2: Särskrivningen skrivs ihop och vi vill tagga om meningen. Indata: Skolan har köpt ett cykel ställ Utdata: Taggaren taggar meningen Skolan har köpt ett cykelställ. X1(wordcl=dt), X2(wordcl=nn & gender!=x1.gender), X3(wordcl=nn & gender=x1.gender) corr(x1 concat(x2, X3)) action(tagging) 6.3 Regelprioritet och villkorliga hopp Vi har tidigare saknat möjlighet att kunna gruppera regler och ordna dem inbördes. Nu skall det gå att ordna reglerna genom att reglerna exekveras i den ordning som de står i regelsamlingen. Vi har också saknat möjlighet att kunna hoppa över regler som beskrivit en mindre trolig tolkning av felet. Vi har heller inte kunnat använda oss av så kallade accepterande regler som anger en sekvens som är helt korrekt och därför inte behöver undersökas mer. Allt detta blir möjligt i det nya regelspråket med hjälp av jump-satserna jump, samt möjligheten att kunna sätta lägen (labels) i regelsamlingen. Vänsterledet utgör det villkor som skall uppfyllas för att hopp skall ske till den regel eller till regelsamlingens slut som anges i högerledet eller till ett token i indata. 6.3.1 Exempel på användning av jump Exempel 1: Regelprioritet, när en regel är viktigare än en annan. Regelmatcharen tillämpar regeln för felaktig särskrivning, hoppar förbi alla inkongruensregler och fortsätter att exekvera regler. Indata: Skolan har köpt ett cykel ställ Utdata: Skolan har köpt ett cykelställ. Utdrag ur regelsamlingen: X1(wordcl=dt), X2(wordcl=nn & gender!=x1.gender), X3(wordcl=nn & gender=x1.gender) mark(x2 X3) corr(x1 concat(x2, X3)) jump(inkongruens_slut) action(scrutinizing)... Kongruensregler... inkongruens_slut:... andra regler 31

6.3.2 Att kunna hoppa förbi token i indata Om man har en regel som matchat en följd av token är det ofta användbart att kunna hoppa förbi dessa vid nästa regelapplicering. För att kunna ange till vilket läge och hur många token fram i indata vi vill hoppa till, använder vi jump med två argument jump(läge, antal_token) läge anger läget i regelsamlingen och antal_token anger hur många token vi vill hoppa förbi i indata. Exempel 1: Indata: Vi har en ny bil som heter Volvo. Utdata: "en ny bil" matchas och nästa regel appliceras på "som heter Volvo". Nästa regel som skall appliceras finns efter läget "inkongruens_slut". X0(wordcl=dt), X1(wordcl=jj), X2(wordcl=nn) jump(inkongruens_slut, 2) action(accepting) Exempel 2: Med hjälp av metoden no_of_tokens kan vi skriva regler som kan hoppa över ett flexibelt antal token. X0(wordcl=dt), X1(wordcl=jj)*, X2(wordcl=nn) jump(endlabel, 1 + X1.no_of_tokens()) action(accepting) 32