Introduksjon til føringsgrammatikk
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 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».
Nå utvider vi CG-en litt:
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».
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.