Difference between revisions of "Hvordan lage et nytt språkpar i Apertium"
(15 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{TOCD}} |
{{TOCD}} |
||
Hvordan lage et nytt språkpar i Apertium. |
Hvordan lage et nytt språkpar i Apertium. |
||
Dette dokumentet beskriver hvordan man starter et nytt språkpar for Apertium maskinoversettelse system. |
|||
Dette dokumentet beskriver hvordan man starter et nytt språkpar fra bunnen av med maskinoversettelsesplattformen Apertium. |
|||
Du bør ikke kunne lingvistikk eller maskin eversettelse for å skjønne følgende. Det holder å vite forskjellen mellom verb og substantiv. |
|||
Du trenger ikke kunne noe om lingvistikk eller maskinoversettelse for å forstå denne teksten. Det holder å vite forskjellen mellom verb og substantiv. |
|||
==Innledning== |
==Innledning== |
||
Apertium er et maskinoversettelsesystem. Det er nok ikke helt sant. Det er en maskinoversettelseplattform. Det gir deg muligheten å lage dine egne maskinoversettelsessystemer. Det eneste du må gjøre er å skrive materialet. Materialet består av tre ordlister og litt regler. |
|||
Om du vil lese en mer inngående innledning så er det mange flotte |
Om du vil lese en mer inngående innledning så er det mange flotte artikler her: [[Publications]]. |
||
==Det du trenger== |
==Det du trenger== |
||
Line 18: | Line 19: | ||
* en tekstredigerer |
* en tekstredigerer |
||
Dette dokumentet beskriver ikke hvordan man installerer disse pakker. For mer informasjon se dokumenterings-seksjonen av |
Dette dokumentet beskriver ikke hvordan man installerer disse pakker. For mer informasjon se dokumenterings-seksjonen av Apertium sin nettside |
||
. |
. |
||
==Hva består et språkpar av?== |
==Hva består et språkpar av?== |
||
Apertium 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 hovedordlister: |
|||
# Den morfologiske |
# Den morfologiske ordlisten for språket xx: denne ordlisten 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 |
# Den morfologiske ordlisten for språket yy: denne ordlisten 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 |
# Den tospråklige ordlisten: 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. |
I et språkpar så er det begge språk som kan være en kilde eller et mål for en oversettelse. |
||
Line 35: | Line 36: | ||
* 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 |
* 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 |
Mange av tilgjengelige språkparene har andre filer men vi skal ikke snakke om dem her. Du trenger bare disse filene for å skape et funksjonelt system. |
||
==Språkpar== |
==Språkpar== |
||
Dette |
Dette dokumentet 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 eksemplene vi skal bruke. |
||
==Kort om terminologi== |
==Kort om terminologi== |
||
Line 57: | Line 58: | ||
vb (verb) og haver ("å ha" i Catalan). Symbolene er definert i <sdef>-taggene og brukes i taggen <nowiki><s></nowiki>. |
vb (verb) og haver ("å ha" i Catalan). Symbolene er definert i <sdef>-taggene og brukes i taggen <nowiki><s></nowiki>. |
||
Den tredje ordet er paradigme. |
Den tredje ordet er paradigme. Paradigmet er et eksempel på hvordan en gruppe ord er bøyet. I den morfologiske ordlisten, 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 |
Om vi ville, for eksempel, lagre to adjektiver dum og lat, i steden for å lagre begge sånn: |
||
* dum, (ere, est) |
* dum, (ere, est) |
||
Line 67: | Line 68: | ||
==Hvordan å komme i gang== |
==Hvordan å komme i gang== |
||
===Ettspråklige ordlister=== |
===Ettspråklige ordlister=== |
||
Line 80: | Line 82: | ||
</pre> |
</pre> |
||
Filen definerer at vi ønsker å lage en |
Filen definerer at vi ønsker å lage en ordlisten. Nå må vi legge til alfabetet. Dette definerer et sett av bokstaver som skal brukes i ordlisten. For Serbisk-Kroatisk så skal det se omtrent slik ut: |
||
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet> |
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet> |
||
Line 98: | Line 100: | ||
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. |
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 |
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 kasus. La oss anta at i forbindelse med dette eksemplet er substantiver i hankjønn og i nominativ kasus (et full eksempel finnes på slutten av dette dokumentet). |
||
Det neste er å definere en seksjon for paradigmer, |
Det neste er å definere en seksjon for paradigmer, |
||
Line 108: | Line 110: | ||
</pre> |
</pre> |
||
og en |
og en ordliste-seksjon: |
||
<pre> |
<pre> |
||
Line 116: | Line 118: | ||
</pre> |
</pre> |
||
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 |
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 ubetinget seksjonen her. |
||
Nå skal filen vår se omtrent slik ut: |
Nå skal filen vår se omtrent slik ut: |
||
Line 141: | Line 143: | ||
Det første vi må gjøre, er å definere et paradigme. |
Det første vi må gjøre, er å definere et paradigme. |
||
Husk, vi antar at |
Husk, vi antar at substantivet er i hankjønn og i nominative kasus. Entall av substantivet er 'gramofon', og flertall er "gramofoni '. |
||
<pre> |
<pre> |
||
Line 151: | Line 153: | ||
Legg merke til: '<l/>' (tilsvarer <l> </ l>) angir at det er ikke ekstra materiale som skal legges til stammen for entallet. |
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 < |
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: |
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: |
||
Line 193: | Line 195: | ||
</pre> |
</pre> |
||
På grunnen av at vi kompilerer den fra venstre til høyre, produserer |
På grunnen av at vi kompilerer den fra venstre til høyre, produserer vi en analysator. La oss også lage en generator. |
||
$ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin |
$ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin |
||
Line 211: | Line 213: | ||
Du bør ha to filer i katalogen: |
Du bør ha to filer i katalogen: |
||
* apertium-sh-en.sh.dix som inneholder en (veldig) grunnleggende |
* apertium-sh-en.sh.dix som inneholder en (veldig) grunnleggende serbokroatisk, morfologisk ordliste, og |
||
* apertium-sh-en.en.dix som inneholder en (veldig) grunnleggende engelsk morfologisk |
* apertium-sh-en.en.dix som inneholder en (veldig) grunnleggende engelsk morfologisk ordliste. |
||
===Tospråklig ordliste=== |
===Tospråklig ordliste=== |
||
Line 221: | Line 223: | ||
<pre> |
<pre> |
||
<? |
<?xml version="1.0" encoding="UTF-8"?> |
||
<dictionary> |
<dictionary> |
||
<alphabet/> |
<alphabet/> |
||
Line 228: | Line 230: | ||
<sdef n="sg"/> |
<sdef n="sg"/> |
||
<sdef n="pl"/> |
<sdef n="pl"/> |
||
</ |
</sdefs> |
||
< |
<section id="main" type="standard"> |
||
</ |
</section> |
||
</ |
</dictionary> |
||
</pre> |
</pre> |
||
Line 239: | Line 241: | ||
<pre> |
<pre> |
||
< |
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e> |
||
</pre> |
</pre> |
||
Line 247: | Line 249: | ||
<pre> |
<pre> |
||
$ |
$ 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 |
||
</pre> |
</pre> |
||
Line 266: | Line 268: | ||
<pre> |
<pre> |
||
<? |
<?xml version="1.0" encoding="UTF-8"?> |
||
<transfer> |
<transfer> |
||
</transfer> |
|||
</ Overføring> |
|||
</pre> |
</pre> |
||
For øyeblikket, fordi vi overser |
For øyeblikket, fordi vi overser kasus, 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: |
|||
<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 seksjonen 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 lime 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 leksikalsk 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 oss 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ærlig 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. |
|||
==Verb== |
|||
Ok, vi har et system som oversetter substantiver, men dette er ganske ubrukelig, vi vil også oversette verb, og til og med hele setninger! La oss starte med verbet "å se". I serbisk-kroatisk så er det videti. Serbokroatisk er en null-objekt språket, dette betyr at den bruker vanligvis ikke personlig pronomen før konjugert formet av verbet. Engelsk er ikke det. For eksempel: "Jeg ser" er vidim i serbo-kroatisk. |
|||
* Vidim |
|||
* Se <p1><sg> |
|||
* Jeg ser |
|||
Legg merke til: <p1> betyr første person. |
|||
Dette skal være viktig når vi kommer til å skrive overførings-regelen for verb. Andre eksempler på null-objekt språk er: spansk, rumensk og polsk. Vi trenger bare å legge til verbet i serbokroatisk morfologisk ordliste, men vi må også legge til både verb, og de personlige pronomen i den engelske morfologiske ordlista. Vi skal gå gjennom begge. |
|||
De andre former av verbet videti er: vidiš, Vidi, vidimo, vidite, og vide, som tilsvarer: du ser (entall), han ser, vi ser, dere ser (flertall), og de ser. |
|||
Det finnes to former av du ser, en er i flertall (vidite) og den andre er entall (vidiš). |
|||
Vi skal prøve og oversette setningen: "Vidim gramofoni" i "Jeg ser grammofoner". Å spare plass, så skal vi bare legge til nok informasjon for å gjøre oversettelsen og skal ikke fylle ut paradigmer, som en oppgave til leseren. |
|||
Vi kan ikke bare oversette "vidim gramofoni" fordi det er ikke en riktig setning i serbokroatisk. Den riktige setningen ville være "vidim gramofone". Vi må legge til den formen også, vi trenger ikke legge til kasus info, vi kan bare legge til det som er et annet alternativ for flertall. Så, bare kopier 'e' delen for 'i' og endre 'i' delen til 'e' der. |
|||
Dn første ting vi må gjøre er å legge til noen flere symboler. Vi må først legge til et symbol for 'verb', som vi kaller "vblex" (dette betyr leksikalsk verb, i motsetning til modal verb og andre typer). Verb har 'person', og "tid" sammen med "mengde", så kan vi legge til et par av dem også. Vi trenger å oversette "jeg ser", så for personen skal vi putte "p1", eller "første person", og for tid "pri", eller "presens". |
|||
<pre> |
|||
<sdef n="vblex"/> |
|||
<sdef n="p1"/> |
|||
<sdef n="pri"/> |
|||
</pre> |
|||
Så må vi gjøre det samme med substantiv. Den første linjen skal bli: |
|||
<pre> |
|||
<pardef n="vid/eti__vblex"> |
|||
</pre> |
|||
'/' brukes for å markere hvor stammer (delene mellom <l> </ l> tagger) er lagt til. |
|||
Deretter bøyning for første person entall: |
|||
<pre> |
|||
<e><p><l>im</l><r>eti<s n="vblex"/><s n="pri"/><s n="p1"/><s n="sg"/></r></p></e> |
|||
</pre> |
|||
"im" betegner slutting (som i "vidim '), det er nødvendig å legge til "eti" til <R> delen, fordi dette blir hakket ut av definisjonen. Resten er ganske lett, "vblex" er leksikalske verb, "pri" er presens,"p1" er første person og "sg" er entall. Vi kan også legge til flertall som er samme, bortsett fra "imo" istedenfor "im" og "pl" istedenfor 'sg'. |
|||
Etter dette må vi legge til en lemma: |
|||
<pre> |
|||
<e lm="videti"><i>vid</i><par n="vid/eti__vblex"/></e> |
|||
</pre> |
|||
Legg merke til: innholdet av <nowiki><i> </i></nowiki> er roten, ikke lemmaet. |
|||
Da er vi ferdig med serbokroatisk ordliste. La oss kompilere og teste den. |
|||
<pre> |
|||
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin |
|||
main@standard 23 25 |
|||
$ echo "vidim" | lt-proc sh-en.automorf.bin |
|||
^vidim/videti<vblex><pri><p1><sg>$ |
|||
$ echo "vidimo" | lt-proc sh-en.automorf.bin |
|||
^vidimo/videti<vblex><pri><p1><pl>$ |
|||
</pre> |
|||
Nå gjør vi det samme for den engelske ordlisten (husk å legge til de samme symbol-definisjonene her som du la til den serbokroatisk ordlisten). |
|||
Paradigmet er |
|||
<pre> |
|||
<pardef n="s/ee__vblex"> |
|||
</pre> |
|||
fordi fortiden er "så". Nå kan vi enten legge til både første og andre person, men de er i det samme formet. Faktisk, alle former (unntatt tredje person entall) av verbet 'å se' er 'se'. Vi skal lage en oppføring for 'se' og gi den "pri" symbolen istedenfor. |
|||
<pre> |
|||
<e><p><l>ee</l><r>ee<s n="vblex"/><s n="pri"/></r></p></e> |
|||
</pre> |
|||
og, som vanlig, en oppføring i hovedseksjonen: |
|||
<pre> |
|||
<e lm="see"><i>s</i><par n="s/ee__vblex"/></e> |
|||
</pre> |
|||
La oss lagre, kompilere og teste: |
|||
<pre> |
|||
$ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin |
|||
main@standard 18 19 |
|||
$ echo "see" | lt-proc en-sh.automorf.bin |
|||
^see/see<vblex><pri>$ |
|||
</pre> |
|||
Nå for den nødvendige delen i den tospråklige ordlisten: |
|||
<pre> |
|||
<e><p><l>videti<s n="vblex"/></l><r>see<s n="vblex"/></r></p></e> |
|||
</pre> |
|||
(ikke glem å legge til "sdef" fra før) |
|||
Og kompilere igjen: |
|||
<pre> |
|||
$ lt-comp lr apertium-sh-en.sh-en.dix sh-en.autobil.bin |
|||
main@standard 18 18 |
|||
$ lt-comp rl apertium-sh-en.sh-en.dix en-sh.autobil.bin |
|||
main@standard 18 18 |
|||
</pre> |
|||
Nå skal vi teste: |
|||
<pre> |
|||
$ echo "vidim" | 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 |
|||
^see<vblex><pri><p1><sg>$^@ |
|||
</pre> |
|||
Vi får den riktige analysen, men når vi prøver og generere en grunnskjemaet, får vi en "#", som nedenfor: |
|||
<pre> |
|||
$ echo "vidim" | 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 |
|||
#see\@ |
|||
</pre> |
|||
Denne "#" betyr at generatoren klarer ikke å generere den riktige leksikalske formen fordi den inneholder ikke den. Hvorfor det? |
|||
I utgangspunktet, analysene stemmer ikke, "se" i ordlisten er "å se<vblex><pri>", men "ser" levert av overføringen er "å se<vblex><pri><p1><sg>. Den serbokroatisk delen har mer informasjon enn den engelske delen krever. Du kan teste dette ved å legge til de manglende symbolene til den engelske ordlisten, og deretter rekompilere, og teste igjen. |
|||
Men, det finnes en mer paradigmatisk måte å ta vare på dette ved å skrive en regel. Så åpner vi opp regel-filen (apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin om du glemte det). |
|||
Vi må legge til en ny kategori for 'verb'. |
|||
<pre> |
|||
<def-cat n="vrb"> |
|||
<cat-item tags="vblex.*"/> |
|||
</def-cat> |
|||
</pre> |
|||
Vi må også legge til atributtene for tid og person. Vi gjør det veldig enkelt, du kan legge til p2 og p3, men det gjør ikke jeg for å spare plass. |
|||
<pre> |
|||
<def-attr n="temps"> |
|||
<attr-item tags="pri"/> |
|||
</def-attr> |
|||
<def-attr n="pers"> |
|||
<attr-item tags="p1"/> |
|||
</def-attr> |
|||
</pre> |
|||
Vi bør også legge til en atributt for verb. |
|||
<pre> |
|||
<def-attr n="a_verb"> |
|||
<attr-item tags="vblex"/> |
|||
</def-attr> |
|||
</pre> |
|||
Nå med reglen: |
|||
<pre> |
|||
<rule> |
|||
<pattern> |
|||
<pattern-item n="vrb"/> |
|||
</pattern> |
|||
<action> |
|||
<out> |
|||
<lu> |
|||
<clip pos="1" side="tl" part="lem"/> |
|||
<clip pos="1" side="tl" part="a_verb"/> |
|||
<clip pos="1" side="tl" part="temps"/> |
|||
</lu> |
|||
</out> |
|||
</action> |
|||
</rule> |
|||
</pre> |
|||
Husk, når du prøvde å fjerne "clip" taggene i den forrige regel eksemplet, og de forsvunnet fra overføringen, det gjør vi nå. Vi tar et verb med en full analyse, men generer en del av analysen(lemmaet + verb tag + tid tag) |
|||
Om vi rekompilerer den så får vi: |
|||
<pre> |
|||
$ echo "vidim" | 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 |
|||
^see<vblex><pri>$^@ |
|||
</pre> |
|||
og: |
|||
<pre> |
|||
$ echo "vidim" | 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 |
|||
see\@ |
|||
</pre> |
|||
Prøv dette med "vidimo" (vi ser) å skjekke om du får den riktige output. |
|||
Nå prøv den med "vidimo gramofone": |
|||
<pre> |
|||
$ echo "vidim 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 |
|||
see gramophones\@ |
|||
</pre> |
|||
==Men hva med personlige pronomen?== |
|||
Vel, dette er bra men vi mangler fortsatt den personlige pronomen som er nødvendig i engelsken. For å legge den til, må vi først redigere den engelske morfologiske ordlisten. |
|||
Som før, den første ting å gjøre er å legge til de nødvendige symbolene: |
|||
<pre> |
|||
<sdef n="prn"/> |
|||
<sdef n="subj"/> |
|||
</pre> |
|||
Av de to symbolene, er "prn" pronomen, og "subj" er subjekt. |
|||
Fordi det er ikke rot, eller 'lemma' for personlige subjektspronomen, vi bare legger til pardef som følger: |
|||
<pre> |
|||
<pardef n="prsubj__prn"> |
|||
<e><p><l>I</l><r>prpers<s n="prn"/><s n="subj"/><s n="p1"/><s n="sg"/></r></p></e> |
|||
</pardef> |
|||
</pre> |
|||
Med "prsubj" som "personlige subjekt". De andre (du, vi osv.) er en oppgave til leseren. |
|||
Vi kan legge til en oppføring i hovedseksjonen som her: |
|||
<pre> |
|||
<e lm="personal subject pronouns"><i/><par n="prsubj__prn"/></e> |
|||
</pre> |
|||
Nå kan du lagre, rekompilere og teste og vi får: |
|||
<pre> |
|||
$ echo "I" | lt-proc en-sh.automorf.bin |
|||
^I/PRPERS<prn><subj><p1><sg>$ |
|||
</pre> |
|||
(Legg merke til: den er i store bokstaver fordi "I" er en stor bokstav) |
|||
Nå må vi endre 'verb' reglen å produsere subjekt personlige pronomen og den riktige verbformen. |
|||
Først, legg til en kategori (dette er sikkert ganske lett nå): |
|||
<pre> |
|||
<def-cat n="prpers"> |
|||
<cat-item lemma="prpers" tags="prn.*"/> |
|||
</def-cat> |
|||
</pre> |
|||
Nå legger du til typene av pronomen som attributter, vi kan også legge til "obj" type , selv om vi ikke trenger den nå: |
|||
<pre> |
|||
<def-attr n="tipus_prn"> |
|||
<attr-item tags="prn.subj"/> |
|||
<attr-item tags="prn.obj"/> |
|||
</def-attr> |
|||
</pre> |
|||
Og nå legger du til reglen: |
|||
<pre> |
|||
<rule> |
|||
<pattern> |
|||
<pattern-item n="vrb"/> |
|||
</pattern> |
|||
<action> |
|||
<out> |
|||
<lu> |
|||
<lit v="prpers"/> |
|||
<lit-tag v="prn"/> |
|||
<lit-tag v="subj"/> |
|||
<clip pos="1" side="tl" part="pers"/> |
|||
<clip pos="1" side="tl" part="nbr"/> |
|||
</lu> |
|||
<b/> |
|||
<lu> |
|||
<clip pos="1" side="tl" part="lem"/> |
|||
<clip pos="1" side="tl" part="a_verb"/> |
|||
<clip pos="1" side="tl" part="temps"/> |
|||
</lu> |
|||
</out> |
|||
</action> |
|||
</rule> |
|||
</pre> |
|||
Dette er den samme reglen som før, men vi endra den litt. |
|||
Vi skulle få en output: |
|||
<pre> |
|||
^prpers<prn><subj><p1><sg>$ ^see<vblex><pri>$ |
|||
</pre> |
|||
Sånn at generatoren skulle velge den riktige pronomen og den riktige formen av verbet. |
|||
* <lit>, produserer "prpers" |
|||
* <lit-tag>, produserer en tag, vi kan ikke få taggene fra verbet, da legger vi dem til selv, "prn" for pronomen, og "subj" for subjekt. |
|||
* <b/>, produserer en mellomrom. |
|||
Legg merke til at vi fikk info for mengde og tid direkte fra verbet. |
|||
Så nå om vi rekompilerer og tester den igjen: |
|||
<pre> |
|||
$ echo "vidim gramofone" | 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 |
|||
I see gramophones |
|||
</pre> |
|||
Detter er en ganske riktig oversettelse. |
|||
==Fortell meg om platespilleren (Flere ord)== |
|||
Mens "gramophone" er et englesk ord, er det ikke den beste oversettelsen. "Gramophone" brukes vanligvis for veldig gamle typen, med nålen istedenfor grammofonstift. En bedre oversettelse ville være "record player". Selv om dette er mer enn ett ord, kan vi behandle den som om den var ett ord ved å bruke "multiword" (multipalabra) konstruksjoner. |
|||
Vi trenger ikke å endre serbokroatisk ordlisten, bare den engelske og den tospråklige en. |
|||
Flertall av "record playe" er "record players", den har samme paradigmet som "gramophone" (gramophone__n) - vi må bare legge til 's'. Alt vi trenger å gjøre er å legge til et nytt element til hovedselsjonen. |
|||
<pre> |
|||
<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e> |
|||
</pre> |
|||
Det eneste ting som er annerledes er <b/> taggen, men dette er ikke så nytt forsi vi brukte den i stad, i regelfilene. |
|||
Rekompiler og test: |
|||
<pre> |
|||
$ echo "vidim gramofone" | 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 |
|||
I see record players |
|||
</pre> |
|||
Perfekt. En stor fordel med å bruke multiwords er at du kan oversette idiomatiske uttrykk verbatim, uten å måtte oversette hver eneste ord. For eksempel den engelske uttrykket, "at a moment" ville bli oversatt til serbokroatisk som "trenutno" (trenutak = "moment", trenutno er adverb) - det er ikke mulig å oversette denne engelske uttrykket ved å oversette hver ord, i serbokroatisk. |
|||
==Mindre variasjoner== |
|||
Serbokroatisk har vanligvis et par måter å skrive hvert ord på grunnen av dialektal variasjon. Den har en kul fonetisk skriftsystem, slik at du skriver som du snakker. For eksempel, folk som snakker i Ijekavian ville si "rječnik", mens de som snakker Ekavian ville si "rečnik", som reflekterer forskjeller i uttalelsen av proto-slaviske vokal ''yat''. |
|||
===Analyse=== |
|||
Det bør være en enkelt måte å handle med dette, og det er det, å bruke paradigmer igjen. Paradigmer brukes ikke bare for å addere grammatiske symboler, men de kan også brukes for å erstatte hvilken som helst symbol/bokstav med en andre. For eksempel, her er en paradigme som aksepterer både "e" og "je" i analysen. Pradigmen bør gå gjennom den ettspråklige ordlisten for serbokrotatisk. |
|||
<pre> |
|||
<pardef n="e_je__yat"> |
|||
<e> |
|||
<p> |
|||
<l>e</l> |
|||
<r>e</r> |
|||
</p> |
|||
</e> |
|||
<e> |
|||
<p> |
|||
<l>je</l> |
|||
<r>e</r> |
|||
</p> |
|||
</e> |
|||
</pardef> |
|||
</pre> |
|||
Og i "hovedseksjonen": |
|||
<pre> |
|||
<e lm="rečnik"><i>r</i><par n="e_je__yat"/><i>čni</i><par n="rečni/k__n"/></e> |
|||
</pre> |
|||
Dette gir oss muligheten å analysere begge former for alltid... |
|||
===Generering=== |
|||
==Se også== |
|||
*[[Building dictionaries]] |
|||
*[[Finding_errors_in_dictionaries]] |
|||
*[[Cookbook]] |
|||
*[[Chunking]] |
|||
*[[Contributing to an existing pair]] |
|||
Vi må først definere kategorier og attributter. Både kategorier og attributter lar oss sette grammatiske symboler i en gruppe. |
|||
[[Category:Documentation]] |
[[Category:Documentation]] |
||
[[Category:HOWTO]] |
[[Category:HOWTO]] |
||
[[Category:Writing dictionaries]] |
[[Category:Writing dictionaries]] |
||
[[Category:Quickstart]] |
Latest revision as of 07:09, 16 February 2015
Hvordan lage et nytt språkpar i Apertium.
Dette dokumentet beskriver hvordan man starter et nytt språkpar fra bunnen av med maskinoversettelsesplattformen Apertium.
Du trenger ikke kunne noe om lingvistikk eller maskinoversettelse for å forstå denne teksten. Det holder å vite forskjellen mellom verb og substantiv.
Innledning[edit]
Apertium er et maskinoversettelsesystem. Det er nok ikke helt sant. Det er en maskinoversettelseplattform. Det gir deg muligheten å lage dine egne maskinoversettelsessystemer. Det eneste du må gjøre er å skrive materialet. Materialet består av tre ordlister og litt regler.
Om du vil lese en mer inngående innledning så er det mange flotte artikler her: Publications.
Det du trenger[edit]
- 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 Apertium sin nettside .
Hva består et språkpar av?[edit]
Apertium 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 hovedordlister:
- Den morfologiske ordlisten for språket xx: denne ordlisten 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 ordlisten for språket yy: denne ordlisten 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 ordlisten: 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 funksjonelt system.
Språkpar[edit]
Dette dokumentet 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 eksemplene vi skal bruke.
Kort om terminologi[edit]
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. Paradigmet er et eksempel på hvordan en gruppe ord er bøyet. I den morfologiske ordlisten, 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 adjektiver 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[edit]
Ettspråklige ordlister[edit]
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 ordlisten. Nå må vi legge til alfabetet. Dette definerer et sett av bokstaver som skal brukes i ordlisten. 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 kasus. La oss anta at i forbindelse med dette eksemplet er substantiver i hankjønn og i nominativ kasus (et full eksempel finnes på slutten av dette dokumentet).
Det neste er å definere en seksjon for paradigmer,
<pardefs> </pardefs>
og en ordliste-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 ubetinget 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 substantivet er i hankjønn og i nominative kasus. 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[edit]
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 kasus, 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 seksjonen 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 lime 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 leksikalsk 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 oss 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ærlig 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.
Verb[edit]
Ok, vi har et system som oversetter substantiver, men dette er ganske ubrukelig, vi vil også oversette verb, og til og med hele setninger! La oss starte med verbet "å se". I serbisk-kroatisk så er det videti. Serbokroatisk er en null-objekt språket, dette betyr at den bruker vanligvis ikke personlig pronomen før konjugert formet av verbet. Engelsk er ikke det. For eksempel: "Jeg ser" er vidim i serbo-kroatisk.
- Vidim
- Se <p1><sg>
- Jeg ser
Legg merke til: <p1> betyr første person.
Dette skal være viktig når vi kommer til å skrive overførings-regelen for verb. Andre eksempler på null-objekt språk er: spansk, rumensk og polsk. Vi trenger bare å legge til verbet i serbokroatisk morfologisk ordliste, men vi må også legge til både verb, og de personlige pronomen i den engelske morfologiske ordlista. Vi skal gå gjennom begge.
De andre former av verbet videti er: vidiš, Vidi, vidimo, vidite, og vide, som tilsvarer: du ser (entall), han ser, vi ser, dere ser (flertall), og de ser.
Det finnes to former av du ser, en er i flertall (vidite) og den andre er entall (vidiš).
Vi skal prøve og oversette setningen: "Vidim gramofoni" i "Jeg ser grammofoner". Å spare plass, så skal vi bare legge til nok informasjon for å gjøre oversettelsen og skal ikke fylle ut paradigmer, som en oppgave til leseren.
Vi kan ikke bare oversette "vidim gramofoni" fordi det er ikke en riktig setning i serbokroatisk. Den riktige setningen ville være "vidim gramofone". Vi må legge til den formen også, vi trenger ikke legge til kasus info, vi kan bare legge til det som er et annet alternativ for flertall. Så, bare kopier 'e' delen for 'i' og endre 'i' delen til 'e' der.
Dn første ting vi må gjøre er å legge til noen flere symboler. Vi må først legge til et symbol for 'verb', som vi kaller "vblex" (dette betyr leksikalsk verb, i motsetning til modal verb og andre typer). Verb har 'person', og "tid" sammen med "mengde", så kan vi legge til et par av dem også. Vi trenger å oversette "jeg ser", så for personen skal vi putte "p1", eller "første person", og for tid "pri", eller "presens".
<sdef n="vblex"/> <sdef n="p1"/> <sdef n="pri"/>
Så må vi gjøre det samme med substantiv. Den første linjen skal bli:
<pardef n="vid/eti__vblex">
'/' brukes for å markere hvor stammer (delene mellom <l> </ l> tagger) er lagt til.
Deretter bøyning for første person entall:
<e><p><l>im</l><r>eti<s n="vblex"/><s n="pri"/><s n="p1"/><s n="sg"/></r></p></e>
"im" betegner slutting (som i "vidim '), det er nødvendig å legge til "eti" til <R> delen, fordi dette blir hakket ut av definisjonen. Resten er ganske lett, "vblex" er leksikalske verb, "pri" er presens,"p1" er første person og "sg" er entall. Vi kan også legge til flertall som er samme, bortsett fra "imo" istedenfor "im" og "pl" istedenfor 'sg'.
Etter dette må vi legge til en lemma:
<e lm="videti"><i>vid</i><par n="vid/eti__vblex"/></e>
Legg merke til: innholdet av <i> </i> er roten, ikke lemmaet.
Da er vi ferdig med serbokroatisk ordliste. La oss kompilere og teste den.
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin main@standard 23 25 $ echo "vidim" | lt-proc sh-en.automorf.bin ^vidim/videti<vblex><pri><p1><sg>$ $ echo "vidimo" | lt-proc sh-en.automorf.bin ^vidimo/videti<vblex><pri><p1><pl>$
Nå gjør vi det samme for den engelske ordlisten (husk å legge til de samme symbol-definisjonene her som du la til den serbokroatisk ordlisten).
Paradigmet er
<pardef n="s/ee__vblex">
fordi fortiden er "så". Nå kan vi enten legge til både første og andre person, men de er i det samme formet. Faktisk, alle former (unntatt tredje person entall) av verbet 'å se' er 'se'. Vi skal lage en oppføring for 'se' og gi den "pri" symbolen istedenfor.
<e><p><l>ee</l><r>ee<s n="vblex"/><s n="pri"/></r></p></e>
og, som vanlig, en oppføring i hovedseksjonen:
<e lm="see"><i>s</i><par n="s/ee__vblex"/></e>
La oss lagre, kompilere og teste:
$ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin main@standard 18 19 $ echo "see" | lt-proc en-sh.automorf.bin ^see/see<vblex><pri>$
Nå for den nødvendige delen i den tospråklige ordlisten:
<e><p><l>videti<s n="vblex"/></l><r>see<s n="vblex"/></r></p></e>
(ikke glem å legge til "sdef" fra før)
Og kompilere igjen:
$ lt-comp lr apertium-sh-en.sh-en.dix sh-en.autobil.bin main@standard 18 18 $ lt-comp rl apertium-sh-en.sh-en.dix en-sh.autobil.bin main@standard 18 18
Nå skal vi teste:
$ echo "vidim" | 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 ^see<vblex><pri><p1><sg>$^@
Vi får den riktige analysen, men når vi prøver og generere en grunnskjemaet, får vi en "#", som nedenfor:
$ echo "vidim" | 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 #see\@
Denne "#" betyr at generatoren klarer ikke å generere den riktige leksikalske formen fordi den inneholder ikke den. Hvorfor det?
I utgangspunktet, analysene stemmer ikke, "se" i ordlisten er "å se<vblex><pri>", men "ser" levert av overføringen er "å se<vblex><pri><p1><sg>. Den serbokroatisk delen har mer informasjon enn den engelske delen krever. Du kan teste dette ved å legge til de manglende symbolene til den engelske ordlisten, og deretter rekompilere, og teste igjen.
Men, det finnes en mer paradigmatisk måte å ta vare på dette ved å skrive en regel. Så åpner vi opp regel-filen (apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin om du glemte det).
Vi må legge til en ny kategori for 'verb'.
<def-cat n="vrb"> <cat-item tags="vblex.*"/> </def-cat>
Vi må også legge til atributtene for tid og person. Vi gjør det veldig enkelt, du kan legge til p2 og p3, men det gjør ikke jeg for å spare plass.
<def-attr n="temps"> <attr-item tags="pri"/> </def-attr> <def-attr n="pers"> <attr-item tags="p1"/> </def-attr>
Vi bør også legge til en atributt for verb.
<def-attr n="a_verb"> <attr-item tags="vblex"/> </def-attr>
Nå med reglen:
<rule> <pattern> <pattern-item n="vrb"/> </pattern> <action> <out> <lu> <clip pos="1" side="tl" part="lem"/> <clip pos="1" side="tl" part="a_verb"/> <clip pos="1" side="tl" part="temps"/> </lu> </out> </action> </rule>
Husk, når du prøvde å fjerne "clip" taggene i den forrige regel eksemplet, og de forsvunnet fra overføringen, det gjør vi nå. Vi tar et verb med en full analyse, men generer en del av analysen(lemmaet + verb tag + tid tag)
Om vi rekompilerer den så får vi:
$ echo "vidim" | 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 ^see<vblex><pri>$^@
og:
$ echo "vidim" | 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 see\@
Prøv dette med "vidimo" (vi ser) å skjekke om du får den riktige output.
Nå prøv den med "vidimo gramofone":
$ echo "vidim 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 see gramophones\@
Men hva med personlige pronomen?[edit]
Vel, dette er bra men vi mangler fortsatt den personlige pronomen som er nødvendig i engelsken. For å legge den til, må vi først redigere den engelske morfologiske ordlisten.
Som før, den første ting å gjøre er å legge til de nødvendige symbolene:
<sdef n="prn"/> <sdef n="subj"/>
Av de to symbolene, er "prn" pronomen, og "subj" er subjekt.
Fordi det er ikke rot, eller 'lemma' for personlige subjektspronomen, vi bare legger til pardef som følger:
<pardef n="prsubj__prn"> <e><p><l>I</l><r>prpers<s n="prn"/><s n="subj"/><s n="p1"/><s n="sg"/></r></p></e> </pardef>
Med "prsubj" som "personlige subjekt". De andre (du, vi osv.) er en oppgave til leseren.
Vi kan legge til en oppføring i hovedseksjonen som her:
<e lm="personal subject pronouns"><i/><par n="prsubj__prn"/></e>
Nå kan du lagre, rekompilere og teste og vi får:
$ echo "I" | lt-proc en-sh.automorf.bin ^I/PRPERS<prn><subj><p1><sg>$
(Legg merke til: den er i store bokstaver fordi "I" er en stor bokstav)
Nå må vi endre 'verb' reglen å produsere subjekt personlige pronomen og den riktige verbformen.
Først, legg til en kategori (dette er sikkert ganske lett nå):
<def-cat n="prpers"> <cat-item lemma="prpers" tags="prn.*"/> </def-cat>
Nå legger du til typene av pronomen som attributter, vi kan også legge til "obj" type , selv om vi ikke trenger den nå:
<def-attr n="tipus_prn"> <attr-item tags="prn.subj"/> <attr-item tags="prn.obj"/> </def-attr>
Og nå legger du til reglen:
<rule> <pattern> <pattern-item n="vrb"/> </pattern> <action> <out> <lu> <lit v="prpers"/> <lit-tag v="prn"/> <lit-tag v="subj"/> <clip pos="1" side="tl" part="pers"/> <clip pos="1" side="tl" part="nbr"/> </lu> <b/> <lu> <clip pos="1" side="tl" part="lem"/> <clip pos="1" side="tl" part="a_verb"/> <clip pos="1" side="tl" part="temps"/> </lu> </out> </action> </rule>
Dette er den samme reglen som før, men vi endra den litt.
Vi skulle få en output:
^prpers<prn><subj><p1><sg>$ ^see<vblex><pri>$
Sånn at generatoren skulle velge den riktige pronomen og den riktige formen av verbet.
- <lit>, produserer "prpers"
- <lit-tag>, produserer en tag, vi kan ikke få taggene fra verbet, da legger vi dem til selv, "prn" for pronomen, og "subj" for subjekt.
- , produserer en mellomrom.
Legg merke til at vi fikk info for mengde og tid direkte fra verbet.
Så nå om vi rekompilerer og tester den igjen:
$ echo "vidim gramofone" | 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 I see gramophones
Detter er en ganske riktig oversettelse.
Fortell meg om platespilleren (Flere ord)[edit]
Mens "gramophone" er et englesk ord, er det ikke den beste oversettelsen. "Gramophone" brukes vanligvis for veldig gamle typen, med nålen istedenfor grammofonstift. En bedre oversettelse ville være "record player". Selv om dette er mer enn ett ord, kan vi behandle den som om den var ett ord ved å bruke "multiword" (multipalabra) konstruksjoner.
Vi trenger ikke å endre serbokroatisk ordlisten, bare den engelske og den tospråklige en.
Flertall av "record playe" er "record players", den har samme paradigmet som "gramophone" (gramophone__n) - vi må bare legge til 's'. Alt vi trenger å gjøre er å legge til et nytt element til hovedselsjonen.
<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e>
Det eneste ting som er annerledes er taggen, men dette er ikke så nytt forsi vi brukte den i stad, i regelfilene.
Rekompiler og test:
$ echo "vidim gramofone" | 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 I see record players
Perfekt. En stor fordel med å bruke multiwords er at du kan oversette idiomatiske uttrykk verbatim, uten å måtte oversette hver eneste ord. For eksempel den engelske uttrykket, "at a moment" ville bli oversatt til serbokroatisk som "trenutno" (trenutak = "moment", trenutno er adverb) - det er ikke mulig å oversette denne engelske uttrykket ved å oversette hver ord, i serbokroatisk.
Mindre variasjoner[edit]
Serbokroatisk har vanligvis et par måter å skrive hvert ord på grunnen av dialektal variasjon. Den har en kul fonetisk skriftsystem, slik at du skriver som du snakker. For eksempel, folk som snakker i Ijekavian ville si "rječnik", mens de som snakker Ekavian ville si "rečnik", som reflekterer forskjeller i uttalelsen av proto-slaviske vokal yat.
Analyse[edit]
Det bør være en enkelt måte å handle med dette, og det er det, å bruke paradigmer igjen. Paradigmer brukes ikke bare for å addere grammatiske symboler, men de kan også brukes for å erstatte hvilken som helst symbol/bokstav med en andre. For eksempel, her er en paradigme som aksepterer både "e" og "je" i analysen. Pradigmen bør gå gjennom den ettspråklige ordlisten for serbokrotatisk.
<pardef n="e_je__yat"> <e> <p> <l>e</l> <r>e</r> </p> </e> <e> <p> <l>je</l> <r>e</r> </p> </e> </pardef>
Og i "hovedseksjonen":
<e lm="rečnik"><i>r</i><par n="e_je__yat"/><i>čni</i><par n="rečni/k__n"/></e>
Dette gir oss muligheten å analysere begge former for alltid...