Introduksjon til føringsgrammatikk

From Apertium
Revision as of 10:55, 24 March 2010 by Unhammer (talk | contribs)
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-nn-nb og vislcg3 for å følge veiledningen nedenfor.

$ echo "Jeg skriver" | lt-proc -w nb-nn.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.

Nå har apertium-nn-nb allerede en stor CG som takler denne tvetydigheten, men for eksempelets skyld lager vi vår egen CG her. Lag en fil som heter nb-nn.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.

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

$ cg-comp nb-nn.rlx nb-nn.rlx.bin

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

$ echo "Også jeg skriver" | lt-proc -w nb-nn.automorf.bin | cg-proc -w nb-nn.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 (forsiktigere regler)

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.

Se også