Introduksjon til føringsgrammatikk

From Apertium
Jump to navigation Jump to search

Føringsgrammatikk / Constraint Grammar, eller CG, blir brukt i flere språkpar i Apertium blant annet til «pre-tagging». Vi kan skrive ganske utførlige regler for hånd som fjerner feilaktige analyser før den statistiske taggeren kjører. En CG kan også brukes for å legge til tagger til en analyse (f.eks. syntaktiske tagger), om vi ønsker det.

Vi bruker bokmål→nynorsk som eksempel her. Last ned og installer apertium-nob og vislcg3 for å følge veiledningen nedenfor.

$ echo "Også jeg skriver" | lt-proc -w nob.automorf.bin
^Også/også<adv>$ ^jeg/jeg<n><nt><pl><ind>/jeg<n><nt><sg><ind>/jeg<prn><p1><mf><sg><nom>$ ^skriver/skrive<vblex><pres>/skriver<n><m><sg><ind>$

De to siste ordene er begge tvetydige. Det vi ønsker er ^jeg/jeg<prn><p1><mf><sg><nom>$ ^skriver/skrive<vblex><pres>$. Med en CG kan vi lett skrive regler som velger bare disse analysene.

En enkel CG

Nå har apertium-nob allerede en stor CG som takler denne tvetydigheten, men for eksempelets skyld lager vi vår egen CG her. Lag en fil som heter nob.rlx, og skriv inn det følgende:

DELIMITERS = "<$.>" "<$:>" "<$!>" "<$?>" ;

LIST NOUN = n ;
LIST PRENOUN = det adj ;
LIST PRON-PERS = (prn p1) (prn p2) (prn p3) ;

SECTION

SELECT:pron-ikke-subst PRON-PERS IF
	(0 NOUN)
	(NOT -1 PRENOUN)
;

delimiters brukes for å avgrense et setningsvindu (window), CG-regler har til vanlig bare lov til å kikke innenfor setningsvinduet. Så kommer noen lister. Disse likner på grove tagger i apertium-tagger, og det er mulig å ha så mange tagger man vil der, PRENOUN vil f.eks. både matche analyser som har <det> og de som har <adj> i taggene sine. I tillegg går det an å bruke parenteser i en list for å kreve flere tagger; PRON-PERS matcher bare analyser som har både prn og p1, p2 eller p3 i seg.

Merk: tag-rekkefølge spiller ingen rolle for CG, men heldigvis får vi ut taggene i samme rekkefølge som de kom inn.

Vi har én regel så langt. Den har navnet «pron-ikke-subst», men vi kan sløyfe :pron-ikke-subst om vi ikke vil gi regelen noen navn (navn kan være nyttig for debugging). Regelen sier at vi velger analysen som matcher PRON-PERS bare hvis dette ordet også har en substantiv-analyse, og det som kommer før ikke har en determinativ- eller adjektiv-analyse. select fjerner alle andre analyser enn den valgte (men en regel vil aldri fjerne den siste analysen). 0 er det ordet vi ser på, mens -1 er ordet som kommer før dette, til venstre. De to parentesene som følger if er krav, «context conditions», for at regelen skal anvendes.

Nå kan vi prøve regelen. Kompiler grammatikken med

$ cg-comp nob.rlx nob.rlx.bin

Da bør du få følgende resultat:

$ echo "Også jeg skriver" | lt-proc -w nob.automorf.bin | cg-proc -w nob.rlx.bin
^Også/også<adv>$ ^jeg/Jeg<prn><p1><mf><sg><nom>$ ^skriver/skrive<vblex><pres>/skriver<n><m><sg><ind>$

Vi har blitt kvitt substantiv-analysene av «jeg» :-) I tillegg passer regelen på å ikke fjerne substantiv-analysen i setningen «Freud snakker om et jeg». Men dette kunne vi gjort med bigramtagging…

Stjerner og barriærer

Nå utvider vi CG-en litt for å finne verbet vårt:

DELIMITERS = "<$.>" "<$:>" "<$!>" "<$?>" ;

LIST NOUN = n ;
LIST PRENOUN = det adj ;
LIST PRON-PERS = (prn p1) (prn p2) (prn p3) ;
LIST FV = (vblex pres) (vblex pret) (vblex imp) ;
LIST SETN-GR = >>> <<< cnjsub ;

SECTION

SELECT:pron-ikke-subst PRON-PERS IF
	(0 NOUN)
	(NOT -1 PRENOUN)
;

SELECT:presens (pres) IF
	(-1C PRON-PERS)
	(*-2 SETN-GR BARRIER FV)
;

Vi har fått to nye lister. FV er alle finitte verb (nåtid, fortid, imperativ), mens SETN-GR er setningsgrenser. >>> og <<< er spesielle CG-tagger som blir lagt til setningsvinduet til venstre og høyre. Siden den nye regelen står nedenfor pronomen-reglen vil den anvendes etter pronomen-regelen.

Den nye regelen har litt mer komplisert syntaks. For det første har vi opprettet en ad-hoc-liste. Dette ville vært det samme som å skrive

LIST PRESENS = pres ;
[…]
SELECT:presens PRESENS IF […]

eller

LIST PRESENS = (pres) ;
[…]
SELECT:presens PRESENS IF […]

Vi er nødt til å ha med parentesene rundt taggen i regelen for å ha en ad-hoc-liste der (ellers blir det tolket som en referanse til en tidligere opprettet liste).

Så har vi -1c. C-en (careful) vil si at ordet til venstre er nødt til å være disambiguert til en PRON-PERS-analyse. Og det er det pga. forrige regel.

Neste linje har en stjerne: *-2. Dette vil si at vi ser på det som er minst 2 steg til venstre, og det må ha en analyse som matcher SETN-GR for at regelen skal anvendes. I tillegg står det barrier FV, det vil si at det ikke kan komme noen ord som matcher FV før vi har funnet en SETN-GR. I eksempelsetningen vår ser vi først på «også», som er 2 steg til venstre; dette ordet har ingen SETN-GR-analyse, men heller ingen FV-analyse, så da kan vi gå enda et steg til venstre. Da kommer vi til begynnelsen av setningen, setningsvinduet, og dette har taggen >>>, så regelen anvendes og vi velger verb-analysen av «skriver».

remove og link

Man kan også ha remove-regler; disse fjerner den analysen som matcher, men lar resten av analysene bli stående. select og remove likner på enforce og forbid i TSX-formatet til apertium-tagger, men som reglene over viser er de mye mer fleksible. En remove-regel kan sees på som mer forsiktig enn en select-regel, om det er mange analyser på et ord må man ha mange remove-regler for å oppnå samme effekt som én select-regel.

Det siste vi bør se på er link. Vi kan omskrive den siste regelen vår slik:

REMOVE:presens NOUN IF
	(0 (pres))
	(-1C PRON-PERS LINK *-1 SETN-GR BARRIER FV)
;

Denne regelen fjerner en substantiv-analyse fra et ord som også har en presens-analyse – (0 (pres)) oppretter igjen en ad-hoc-liste, derfor har vi en ekstra parentes rundt taggen pres. I tillegg må det være et disambiguert personlig pronomen rett til venstre, og minst ett ord til venstre for det personlige pronomenet må vi finne en setningsgrense (før vi finner et finitt verb).

Denne regelen kunne vi selvsagt skrevet uten link, men det som gjør link nyttig er at vi kan lenke fra ord som er vilkårlig langt unna. Det følgende kravet oppfylles hvis setningen begynner med ordet "hei"[1]:

	(*-1 SETN-GR LINK 1 ("hei"))

Se også

Fotnoter

  1. Dette er en ad-hoc-liste som matcher ord hvor lemmaet er hei. Hvis du vil matche et ord hvor overflateformen er f.eks. skriver så bruker du (*-1 SETN-GR LINK 1 (<"skriver">)).