Difference between revisions of "Hvordan lage et nytt språkpar i Apertium"
Line 266: | Line 266: | ||
<pre> |
<pre> |
||
<? |
<?xml version="1.0" encoding="UTF-8"?> |
||
<transfer> |
<transfer> |
||
</transfer> |
|||
</ Overføring> |
|||
</pre> |
</pre> |
||
For øyeblikket, fordi vi overser bokstavstørrelsen, trenger vi bare å lage en regel som tar de grammatiske symbolene-input og outputs dem igjen. |
For øyeblikket, fordi vi overser bokstavstørrelsen, trenger vi bare å lage en regel som tar de grammatiske symbolene-input og outputs dem igjen. |
||
Vi må først definere kategorier og attributter. Både kategorier og attributter lar oss sette grammatiske symboler i en gruppe. |
Vi må først definere kategorier og attributter. Både kategorier og attributter lar oss sette grammatiske symboler i en gruppe. For eksempel, ('sg' og 'pl', kan settes i en gruppe atributt 'mengde') |
||
La oss legge til de nødvendige seksjonene: |
|||
<pre> |
|||
<section-def-cats> |
|||
</section-def-cats> |
|||
<section-def-attrs> |
|||
</section-def-attrs> |
|||
</pre> |
|||
Vi bøyer bare substantiver i entall og flertall, da må vi legge til en kategori for substantiv med mengde-atributt. Dette er bra nok: |
|||
Legg denne til sekjonen seksjon-def-attrs: |
|||
<pre> |
|||
<def-cat n="nom"> |
|||
<cat-item tags="n.*"/> |
|||
</def-cat> |
|||
</pre> |
|||
og denne: |
|||
<pre> |
|||
<def-attr n="a_nom"> |
|||
<attr-item tags="n"/> |
|||
</def-attr> |
|||
</pre> |
|||
Den første definerer atributtet nbr (mengde), som kan være både entall (sg) og flertall (pl). |
|||
Den andre definerer atributtet a_nom (substantiv atributt). |
|||
Nå må vi legge til seksjonen for globale variabler: |
|||
<pre> |
|||
<section-def-vars> |
|||
</section-def-vars> |
|||
</pre> |
|||
Vi bruker disse variablene for å lagre eller overføre atributter mellom reglene. Nå trenger vi bare en. |
|||
<pre> |
|||
<def-var n="number"/> |
|||
</pre> |
|||
Endelig så må vi legge til en regel som tar en substantiv og outputter den i det riktige formet. Vi trenger en regler-seksjon... |
|||
<pre> |
|||
<section-rules> |
|||
</section-rules> |
|||
</pre> |
|||
Jeg skal limme inn reglen og så forklare. |
|||
<pre> |
|||
<rule> |
|||
<pattern> |
|||
<pattern-item n="nom"/> |
|||
</pattern> |
|||
<action> |
|||
<out> |
|||
<lu> |
|||
<clip pos="1" side="tl" part="lem"/> |
|||
<clip pos="1" side="tl" part="a_nom"/> |
|||
<clip pos="1" side="tl" part="nbr"/> |
|||
</lu> |
|||
</out> |
|||
</action> |
|||
</rule> |
|||
</pre> |
|||
Den første taggen er åpenbar, den definerer reglen. Den andre taggen sier "bruk den reglen om denne "pattern" (mønster) er funnet". I dette eksemplet mønstret inneholder bare en substantiv (definert av kategorien "item"). Legg merke til at mønstrer er tilpasset i den lengste treffet først. |
|||
Så om du har tre regler, den første catcher "<prn><vblex><n>", den andre catcher "<prn><vblex>" og den tredje catcher "<n>", mønstret passer, og reglen som er blitt utført er nummer en. |
|||
Hver mønster her sin egen oppgave, som produserer en output. Outputen er en leksiskalsk enhet (lu). |
|||
"clip" taggen gir brukeren muligheten å velge og manipulere atributter av kilde-språket (side="sl"), eller mål-språket (side="tl") leksikalsk objekt. |
|||
La iss kompilere og teste den. Overføringsregler er kompilert med: |
|||
<pre> |
|||
$ apertium-preprocess-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin |
|||
</pre> |
|||
Som skal produsere en sh-en.t1x.bin fil. |
|||
Nå er vi klare å teste maskinoversettelsessystemet vårt. Men det er bare en viktig del vi mangler, "the part-of-speech (PoS) tagger" men dette skal forklares i en stund. Vi kan teste den likevel. |
|||
Først la oss analysere ordet gramofoni: |
|||
<pre> |
|||
$ echo "gramofoni" | lt-proc sh-en.automorf.bin |
|||
^gramofon/gramofon<n><pl>$ |
|||
</pre> |
|||
Nå, skulle POS taggeren velge den riktige versjonen basert på den delen av talen, men vi har ikke en POS tagger ennå, så vi kan bruke denne gawk scripten som skal bare produsere den første objektet. |
|||
<pre> |
|||
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ |
|||
gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' |
|||
^gramofon<n><pl>$ |
|||
</pre> |
|||
La oss prosesse den med overføringsreglen: |
|||
<pre> |
|||
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ |
|||
gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ |
|||
apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin |
|||
</pre> |
|||
Outputten skulle bli: |
|||
<pre> |
|||
^gramophone<n><pl>$^@ |
|||
</pre> |
|||
* "gramophone" er mål-språket (side="tl") lemmaet (lem) i posisjonen 1 (pos="1") |
|||
* "<n>" er mål-språket a_nom i posisjonen 1. |
|||
* "<pl>" er mål-språket atributt av mengde (nbr) i posisjonen 1. |
|||
Prøv å fjerne en av de "clip" setninger, kompiler og se hva som skjer. |
|||
Nå har vi outputten fra overføringen, det eneste som må gjøres er å generere mål-språket-bøyet formene. Da skal vi bruke lt-proc, men i generasjon |
|||
(-g) ikke analysis modus. |
|||
<pre> |
|||
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ |
|||
gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ |
|||
apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ |
|||
lt-proc -g sh-en.autogen.bin |
|||
gramophones\@ |
|||
</pre> |
|||
Nå har du en maskinoversettelsesystem som oversetter en Serbo-Kroatisk substantiv i en Engelsk substantiv. Dette er ikke særrlig nyttig, men de mer kompliserte ting skal forklares senere. |
|||
Tenk på et par andre ord som bøyes på samme måte som gramofon. Legg dem til. Vi trenger ikke å legge til paradigmer, bare de delene i hovedseksjonen av ettspråklige og tospråklige ordlister. |
|||
[[Category:Documentation]] |
[[Category:Documentation]] |
||
[[Category:HOWTO]] |
[[Category:HOWTO]] |
Revision as of 16:12, 3 December 2010
Hvordan lage et nytt språkpar i Apertium. Dette dokumentet beskriver hvordan man starter et nytt språkpar for Apertium maskinoversettelse system.
Du bør ikke kunne lingvistikk eller maskin eversettelse for å skjønne følgende. Det holder å vite forskjellen mellom verb og substantiv.
Innledning
Aperitum er en maskinoversettelsesystem. Det er nok ikke helt sann. Den er en maskinoversettelseplatform. Den gir deg muligheten å lage sine egne maskinoversettelsesystemer. Det eneste du må gjøre er å skrive materiale. Materialen består av tre ordbøker og litt regler.
Om du vil lese en mer inngående innledning så er det mange flotte dokumenter her: Publications.
Det du trenger
- lttoolbox (>= 3.0.0)
- libxml utils (xmllint etc.)
- apertium (>= 3.0.0)
- en tekstredigerer
Dette dokumentet beskriver ikke hvordan man installerer disse pakker. For mer informasjon se dokumenterings-seksjonen av Aperitum sin nettside .
Hva består et språkpar av?
Aperitum er en "shallow-transfer" type maskinoversettelse system. Den virker på ordbøker og "shallow-transfer" regler. Forskjellen på virkningen av "shallow-transfer" og "deep-transfer" er at "shallow-transfer" fullfører ikke en full syntaktisk analyse. Reglene er vanligvis, operasjoner på grupper av leksikalske komponenter, ikke operasjoner på "parse trees". Det finnes tre hovedordbøker:
- Den morfologiske ordboka for språket xx: denne ordboka inneholder reglene på bøying av ordene i språket xx. I dette eksemplet så skal vi kalle den: apertium-sh-en.sh.dix
- Den morfologiske ordboka for språket yy: denne ordboka inneholder reglene på bøying av ordene i språket yy. I dette eksemplet så skal vi kalle den: apertium-sh-en.en.dix
- Den tospråklige ordboka: inneholder samsvar mellom ord og symboler i to forskjellige språk. I dette eksemplet så skal vi kalle den: apertium-sh-en.sh-en.dix
I et språkpar så er det begge språk som kan være en kilde eller et mål for en oversettelse.
Det er også to filer til overførings-reglene. Disse her er reglene som bestemmer hvordan er ordene ordnet i en setning. For eksempel, chat noir -> katt svart -> svart katt. Reglene kan også brukes for å sette inn eller slette leksikalske komponenter. Dette beskrives senere. Disse filene er:
- språket xx til språket yy overførings-reglene: denne filen inneholder reglene for hvordan språket xx skal endres til språket yy.I dette eksemplet så skal den være: apertium-sh-en.sh-en.t1x
- språket yy til språket xx overførings-reglene: denne filen inneholder reglene for hvordan språket yy skal endres til språket xx.I dette eksemplet så skal den være: apertium-sh-en.en-sh.t1x
Mange av tilgjengelige språkparene har andre filer men vi skal ikke snakke om dem her. Du trenger bare disse filene for å skape et funksjonell system.
Språkpar
Dette dekumentet bruker eksemplet på oversettelsen fra serbokroatisk til engelsk, for å forklare hvordan man skaper en grunnlegende system. Dette er ikke den ideale språkparet fordi systemet funkegere bedre på mer beslektede språk. Dette skaper sikkert ikke problemer for de enkle eksmplene vi skal bruke.
Kort om terminologi
Det er et par termer som må forstås før vi begynner.
Den første er et lemma. Lemmaet er en sitatform av et ord. Det er et ord som mangler alt grammatisk informasjon. For eksempel, lemmaet av katter er katt. I engelske substantiver så er det vangligvis et entall av ordet. Lemmaet av et verb er infitiv av ordet. Det vil si at lemmaet av "var", er "er".
Den andre er et symbol. Et symbol viser informasjon om et ord. Hvis ordet er katter ,som er et substantiv i flertall, da skal den ha et substantiv symbol og et flertall symbol. Symbolene er vanligvis plassert mellom hakeparentes:
- <n>; for substantiv.
- <pl>; for flertall.
Andre eksempler på symboler er <sg>; entall, <pl> første person, <pri> infitiv, etc. Hvis symbolene er skrevet i hakeparentes, så kan de også kalles for tags. Du bør huske at i mange av de tilgjengelige språkparene så står symbolene for acronymene og forkortelser av ordene i Catalan. For eksempel, vbhaver - fra vb (verb) og haver ("å ha" i Catalan). Symbolene er definert i <sdef>-taggene og brukes i taggen <s>.
Den tredje ordet er paradigme. Paradigmaet er et eksempel på hvordan en gruppe ord er bøyet. I den morfologiske ordboka, så er lemmaene, knyttet til paradigmene som gir oss muligheten å beskrive hvordan et lemma bøyes uten å måtte skrive alle suffikser.
Om vi ville, for eksempel, lagre to adjectiver dum og lat, i steden for å lagre begge sånn:
- dum, (ere, est)
- lat, (ere, est)
Så kan vi bare lagre en, å si at "lat, bøyes på samme måte som dum". I dette eksemplet, dum ville være et paradigme, en kilde på hvordan de andre skal bøyes. Paradigmer er definert i <pardef>-taggen og brukes i taggen <par>.
Hvordan å komme i gang
Ettspråklige ordlister
La oss starte med å lage vår første språkordliste. Ordboka er en XML-fil. Slå på en teksteditor og skriv følgende:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> </dictionary>
Filen definerer at vi ønsker å lage en ordbok. Nå må vi legge til alfabetet. Dette definerer et sett av bokstaver som skal brukes i ordboken. For Serbisk-Kroatisk så skal det se omtrent slik ut:
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>
Plasser alfabetet under <dictionary> taggen.
Nå må vi definere et par symboler. La oss begynne med det enkle, substantiv (n) i entall (sg) og i flertall (pl).
<sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs>
Symbolene må ikke å være så kort, de kan være så lang som du vil, men vi skal bruke dem mye, derfor er det fornuftig å forkorte.
Dessverre er det ikke så enkelt som det ser ut, substantiver i serbokroatisk bøyes ikke bare i entall og flertall, de bøyes også for kjønn og bokstavstørrelse. La oss anta at i forbindelse med dette eksemplet er substantiver i hankjønn og i nominativ bokstavstørrelse (et full eksempel finnes på slutten av dette dokumentet).
Det neste er å definere en seksjon for paradigmer,
<pardefs> </pardefs>
og en ordbok seksjon:
<section id="main" type="standard"> </section>
Det finnes to typer seksjoner, den første er en standard seksjon, som inneholder ord, enclitics, osv. Den andre typen er en ubetinget seksjon som vanligvis inneholder tegnsetting, og så videre. Vi buker ikke den ubetiget seksjonen her.
Nå skal filen vår se omtrent slik ut:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> <sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs> <pardefs> </pardefs> <section id="main" type="standard"> </section> </dictionary>
Nå har vi skjelettet på plass, da kan vi begynne med å legge til et substantiv. Den substantiv vi skal bruke er 'gramofon "(som betyr' grammofonen 'eller' platespiller ').
Det første vi må gjøre, er å definere et paradigme.
Husk, vi antar at substativet er i hankjønn og i nominative bokstavstørrelsen. Entall av substantivet er 'gramofon', og flertall er "gramofoni '.
<pardef n="gramofon__n"> <e><p><l/><r><s n="n"/><s n="sg"/></r></p></e> <e><p><l>i</l><r><s n="n"/><s n="pl"/></r></p></e> </pardef>
Legg merke til: '<l/>' (tilsvarer <l> </ l>) angir at det er ikke ekstra materiale som skal legges til stammen for entallet. Dette kan virke som en ganske utførlig måte å beskrive det, men du lærer det fort. Du lurer sikkert på hva <E>, <l> Og <R> står for. Vel,
- E, er for oppføringen.
- P, er for par.
- L, er for venstre.
- R, er for høyre.
Hvorfor venstre og høyre? De morfologiske ordbøkene skal bli kompilert inn i tilstandsautomater. Kompilering dem fra venstre til høyre produserer analyser fra ord, og fra høyre til venstre produserer ord fra analyser. For eksempel:
* gramofoni (left to right) gramofon<n><pl> (analysis) * gramofon<n><pl> (right to left) gramofoni (generation)
Nå har vi definert et paradigme, da må vi knytte den til lemma, gramofon. Vi setter dette i den delen vi har definert.
Oppføringen vi skal sette i </dictionary>
Nå må vi legge til en oppføring som skal oversette mellom de to ordene.
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>
På grunnen av at det er mange av disse oppføringene, er de vanligvis skrevet på samme for å gjøre lesing av filen enklere. Igjen med 'l' og 'r', ikke sant? Vi kompilerer den fra venstre til høyre for å produsere den serbisk-kroatisk → engelsk ordliste, og høyre til venstre for å produsere den engelsk → serbisk-kroatisk ordliste.
Da kjører du følgende kommandoer:
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin $ lt-comp rl apertium-sh-en.en.dix sh-en.autogen.bin $ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin $ lt-comp rl apertium-sh-en.sh.dix en-sh.autogen.bin $ lt-comp lr apertium-sh-en.sh-en.dix sh-en.autobil.bin $ lt-comp rl apertium-sh-en.sh-en.dix en-sh.autobil.bin
For å generere morfologiske analysatorene (automorf), morfologiske generatorer (autogen) og oppslag av ord (autobil), er "bil" for "tospråklige".
Overføringsregler
Nå har vi to morfologiske ordlister og en tospråklig ordliste. Alt vi trenger nå er et overføringsregel for substantiver. overføringsregel-filer har sin egen DTD (transfer.dtd) som er i Apertium pakken. Hvis du vil implimenter en regel er det ofte en god idé å se i regel-filene til andre språkpar først. Mange regler kan brukes om igjen i andre språk. For eksempel den som er beskrevet nedenfor kan være nyttig for alle "null-subject" språk.
Begynn med et grunnleggende skjelett:
<?xml version="1.0" encoding="UTF-8"?> <transfer> </transfer>
For øyeblikket, fordi vi overser bokstavstørrelsen, trenger vi bare å lage en regel som tar de grammatiske symbolene-input og outputs dem igjen.
Vi må først definere kategorier og attributter. Både kategorier og attributter lar oss sette grammatiske symboler i en gruppe. For eksempel, ('sg' og 'pl', kan settes i en gruppe atributt 'mengde')
La oss legge til de nødvendige seksjonene:
<section-def-cats> </section-def-cats> <section-def-attrs> </section-def-attrs>
Vi bøyer bare substantiver i entall og flertall, da må vi legge til en kategori for substantiv med mengde-atributt. Dette er bra nok:
Legg denne til sekjonen seksjon-def-attrs:
<def-cat n="nom"> <cat-item tags="n.*"/> </def-cat>
og denne:
<def-attr n="a_nom"> <attr-item tags="n"/> </def-attr>
Den første definerer atributtet nbr (mengde), som kan være både entall (sg) og flertall (pl).
Den andre definerer atributtet a_nom (substantiv atributt).
Nå må vi legge til seksjonen for globale variabler:
<section-def-vars> </section-def-vars>
Vi bruker disse variablene for å lagre eller overføre atributter mellom reglene. Nå trenger vi bare en.
<def-var n="number"/>
Endelig så må vi legge til en regel som tar en substantiv og outputter den i det riktige formet. Vi trenger en regler-seksjon...
<section-rules> </section-rules>
Jeg skal limme inn reglen og så forklare.
<rule> <pattern> <pattern-item n="nom"/> </pattern> <action> <out> <lu> <clip pos="1" side="tl" part="lem"/> <clip pos="1" side="tl" part="a_nom"/> <clip pos="1" side="tl" part="nbr"/> </lu> </out> </action> </rule>
Den første taggen er åpenbar, den definerer reglen. Den andre taggen sier "bruk den reglen om denne "pattern" (mønster) er funnet". I dette eksemplet mønstret inneholder bare en substantiv (definert av kategorien "item"). Legg merke til at mønstrer er tilpasset i den lengste treffet først. Så om du har tre regler, den første catcher "<prn><vblex><n>", den andre catcher "<prn><vblex>" og den tredje catcher "<n>", mønstret passer, og reglen som er blitt utført er nummer en.
Hver mønster her sin egen oppgave, som produserer en output. Outputen er en leksiskalsk enhet (lu).
"clip" taggen gir brukeren muligheten å velge og manipulere atributter av kilde-språket (side="sl"), eller mål-språket (side="tl") leksikalsk objekt.
La iss kompilere og teste den. Overføringsregler er kompilert med:
$ apertium-preprocess-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin
Som skal produsere en sh-en.t1x.bin fil.
Nå er vi klare å teste maskinoversettelsessystemet vårt. Men det er bare en viktig del vi mangler, "the part-of-speech (PoS) tagger" men dette skal forklares i en stund. Vi kan teste den likevel.
Først la oss analysere ordet gramofoni:
$ echo "gramofoni" | lt-proc sh-en.automorf.bin ^gramofon/gramofon<n><pl>$
Nå, skulle POS taggeren velge den riktige versjonen basert på den delen av talen, men vi har ikke en POS tagger ennå, så vi kan bruke denne gawk scripten som skal bare produsere den første objektet.
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' ^gramofon<n><pl>$
La oss prosesse den med overføringsreglen:
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin
Outputten skulle bli:
^gramophone<n><pl>$^@
- "gramophone" er mål-språket (side="tl") lemmaet (lem) i posisjonen 1 (pos="1")
- "<n>" er mål-språket a_nom i posisjonen 1.
- "<pl>" er mål-språket atributt av mengde (nbr) i posisjonen 1.
Prøv å fjerne en av de "clip" setninger, kompiler og se hva som skjer.
Nå har vi outputten fra overføringen, det eneste som må gjøres er å generere mål-språket-bøyet formene. Da skal vi bruke lt-proc, men i generasjon (-g) ikke analysis modus.
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin gramophones\@
Nå har du en maskinoversettelsesystem som oversetter en Serbo-Kroatisk substantiv i en Engelsk substantiv. Dette er ikke særrlig nyttig, men de mer kompliserte ting skal forklares senere.
Tenk på et par andre ord som bøyes på samme måte som gramofon. Legg dem til. Vi trenger ikke å legge til paradigmer, bare de delene i hovedseksjonen av ettspråklige og tospråklige ordlister.