Difference between revisions of "Introduksjon til føringsgrammatikk"

From Apertium
Jump to navigation Jump to search
m
(links)
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
'''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.
 
'''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.
+
Vi bruker bokmål→nynorsk som eksempel her. Last ned og installer [[apertium-nob]] og [[vislcg3]] for å følge veiledningen nedenfor.
   
 
<pre>
 
<pre>
$ echo "Jeg skriver" | lt-proc -w nb-nn.automorf.bin
+
$ 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>$
 
^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>$
 
</pre>
 
</pre>
Line 10: Line 10:
 
De to siste ordene er begge tvetydige. Det vi ønsker er <code>^jeg/jeg<prn><p1><mf><sg><nom>$ ^skriver/skrive<vblex><pres>$</code>. Med en CG kan vi lett skrive regler som velger bare disse analysene.
 
De to siste ordene er begge tvetydige. Det vi ønsker er <code>^jeg/jeg<prn><p1><mf><sg><nom>$ ^skriver/skrive<vblex><pres>$</code>. Med en CG kan vi lett skrive regler som velger bare disse analysene.
 
==En enkel CG==
 
==En enkel CG==
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 <code>nb-nn.rlx</code>, og skriv inn det følgende:
+
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 <code>nob.rlx</code>, og skriv inn det følgende:
   
 
<pre>
 
<pre>
Line 31: Line 31:
 
''Merk: tag-rekkefølge spiller ingen rolle for CG, men heldigvis får vi ut taggene i samme rekkefølge som de kom inn.''
 
''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 <code>:pron-ikke-subst</code> 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''. {{sc|select}} fjerner alle andre analyser enn den valgte (men en regel vil aldri fjerne den siste analysen). {{sc|0}} er det ordet vi ser på, mens {{sc|-1}} er ordet som kommer før dette, til venstre.
+
Vi har én regel så langt. Den har navnet «pron-ikke-subst», men vi kan sløyfe <code>:pron-ikke-subst</code> 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''. {{sc|select}} fjerner alle andre analyser enn den valgte (men en regel vil aldri fjerne den siste analysen). {{sc|0}} er det ordet vi ser på, mens {{sc|-1}} er ordet som kommer før dette, til venstre. De to parentesene som følger {{sc|if}} er ''krav'', «context conditions», for at regelen skal anvendes.
   
 
Nå kan vi prøve regelen. Kompiler grammatikken med
 
Nå kan vi prøve regelen. Kompiler grammatikken med
   
 
<pre>
 
<pre>
$ cg-comp nb-nn.rlx nb-nn.rlx.bin
+
$ cg-comp nob.rlx nob.rlx.bin
 
</pre>
 
</pre>
   
 
Da bør du få følgende resultat:
 
Da bør du få følgende resultat:
 
<pre>
 
<pre>
$ echo "Også jeg skriver" | lt-proc -w nb-nn.automorf.bin | cg-proc -w nb-nn.rlx.bin
+
$ 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>$
 
^Også/også<adv>$ ^jeg/Jeg<prn><p1><mf><sg><nom>$ ^skriver/skrive<vblex><pres>/skriver<n><m><sg><ind>$
 
</pre>
 
</pre>
Line 92: Line 92:
 
Neste linje har en stjerne: {{sc|*-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 {{sc|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 <code>>>></code>, så regelen anvendes og vi velger verb-analysen av «skriver».
 
Neste linje har en stjerne: {{sc|*-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 {{sc|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 <code>>>></code>, så regelen anvendes og vi velger verb-analysen av «skriver».
   
=={{sc|remove}} (forsiktigere regler)==
+
=={{sc|remove}} og {{sc|link}}==
 
Man kan også ha {{sc|remove}}-regler; disse ''fjerner'' den analysen som matcher, men lar resten av analysene bli stående. {{sc|select}} og {{sc|remove}} likner på {{sc|enforce}} og {{sc|forbid}} i [[TSX format|TSX-formatet]] til <code>apertium-tagger</code>, men som reglene over viser er de mye mer fleksible. En {{sc|remove}}-regel kan sees på som mer forsiktig enn en {{sc|select}}-regel, om det er mange analyser på et ord må man ha mange {{sc|remove}}-regler for å oppnå samme effekt som én {{sc|select}}-regel.
 
Man kan også ha {{sc|remove}}-regler; disse ''fjerner'' den analysen som matcher, men lar resten av analysene bli stående. {{sc|select}} og {{sc|remove}} likner på {{sc|enforce}} og {{sc|forbid}} i [[TSX format|TSX-formatet]] til <code>apertium-tagger</code>, men som reglene over viser er de mye mer fleksible. En {{sc|remove}}-regel kan sees på som mer forsiktig enn en {{sc|select}}-regel, om det er mange analyser på et ord må man ha mange {{sc|remove}}-regler for å oppnå samme effekt som én {{sc|select}}-regel.
  +
  +
Det siste vi bør se på er {{sc|link}}. Vi kan omskrive den siste regelen vår slik:
  +
  +
<pre>
  +
REMOVE:presens NOUN IF
  +
(0 (pres))
  +
(-1C PRON-PERS LINK *-1 SETN-GR BARRIER FV)
  +
;
  +
</pre>
  +
  +
Denne regelen fjerner en substantiv-analyse fra et ord som også har en presens-analyse – <code>(0 (pres))</code> oppretter igjen en ad-hoc-liste, derfor har vi en ekstra parentes rundt taggen <code>pres</code>. 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 {{sc|link}}, men det som gjør {{sc|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"<ref>Dette er en ad-hoc-liste som matcher ord hvor ''lemmaet'' er <code>hei</code>. Hvis du vil matche et ord hvor ''overflateformen'' er f.eks. <code>skriver</code> så bruker du <code>(*-1 SETN-GR LINK 1 (<"skriver">))</code>.</ref>:
  +
  +
<pre>
  +
(*-1 SETN-GR LINK 1 ("hei"))
  +
</pre>
   
 
==Se også==
 
==Se også==
 
* [[CG]]
 
* [[CG]]
 
* [[Apertium and Constraint Grammar]] -- installasjon og bruk
 
* [[Apertium and Constraint Grammar]] -- installasjon og bruk
  +
==Fotnoter==
 
  +
<references/>
[[Category:CG]]
+
[[Category:Constraint Grammar]]
 
[[Category:HOWTO]]
 
[[Category:HOWTO]]

Latest revision as of 11:47, 27 June 2014

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[edit]

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[edit]

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[edit]

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å[edit]

Fotnoter[edit]

  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">)).