Difference between revisions of "Oprettelse af et nyt sprogpar i Apertium"
m (typos) |
|||
Line 11: | Line 11: | ||
Hvis du vil læse en mere indgående indledning, så er der mange flotte artikler her: [[Publications]]. |
Hvis du vil læse en mere indgående indledning, så er der mange flotte artikler her: [[Publications]]. |
||
Du kan også med fordel læse [[en dansk introduktion med eksempler fra det svensk-danske sprogpar|Dansk_introduktion]] for at få en bedre forståelse. |
|||
==Hvad du behøver== |
==Hvad du behøver== |
Revision as of 13:09, 10 March 2013
Hvordan oprettes et nyt sprogpar i Apertium?
Dette dokument beskriver, hvordan man påbegynder et nyt sprogpar helt forfra med maskinoversættelsesplatformen Apertium.
Du behøver ikke at kunne noget om lingvistik eller maskinoversættelse for at forstå denne tekst. Det er tilstrækkeligt at kunne kende forskel på verbum og substantiv.
Indledning
Apertium er et maskinoversættelsessystem. Det er nok ikke helt sandt. Det er en maskinoversættelsesplatform. Det giver dig mulighed for at lave dine egne maskinoversættelsessystemer. Det eneste, du skal gøre, er at skrive materialet. Materialet består af tre ordbøger og lidt regler.
Hvis du vil læse en mere indgående indledning, så er der mange flotte artikler her: Publications.
Du kan også med fordel læse Dansk_introduktion for at få en bedre forståelse.
Hvad du behøver
- lttoolbox (>= 3.0.0)
- libxml utils (xmllint etc.)
- apertium (>= 3.0.0)
- en teksteditor
Dette dokument beskriver ikke, hvordan man installerer disse pakker. For mere information se dokumentationssektionen på Apertiums hjemmeside. .
Hvad består et sprogpar af?
Apertium er et maskinoversættelsessystem af "shallow-transfer"-typen. Det virker på ordbøger og "shallow-transfer"-regler. Forskellen på virkningen af "shallow-transfer" og "deep-transfer" er, at "shallow-transfer" ikke gennemfører en fuld syntaktisk analyse. Reglerne er sædvanligvis operationer på grupper af leksikalske komponenter, ikke operationer på "parser trees". Der findes tre hovedordbøger:
- Den morfologiske ordbog for sproget xx: Denne ordbog indeholder reglerne for bøjning af ordene i sproget xx. I dette eksempel vil vi kalde den: apertium-sh-en.sh.dix
- Den morfologiske ordbog for sproget yy: Denne ordbog indeholder reglerne for bøjning af ordene i sproget yy. I dette eksempel vil vi kalde den: apertium-sh-en.en.dix
- Den tosprogede ordbog: Indeholder sammenhængen mellem ord og symboler i de to forskellige sprog. I dette eksempel vil vi kalde den: apertium-sh-en.sh-en.dix
I et sprogpar kan begge sprog være en kilde til eller et mål for en oversættelse.
Der er også to filer til overførselsreglerne. Det er de regler, som bestemmer, hvordan ordene er ordnet i en sætning. Eksempelvis: Chat noir -> kat sort -> sort kat. Reglerne kan også bruges til at indsætte eller slette leksikalske komponenter. Dette beskrives senere. Disse filer er:
- overførselsreglerne for sproget xx til sproget yy: Denne fil indeholder reglerne for, hvordan sproget xx skal ændres til sproget yy.I dette eksempel skal den hedde: apertium-sh-en.sh-en.t1x
- overførselsreglerne for sproget yy til sproget xx: Denne fil indeholder reglerne for, hvordan sproget yy skal ændres til sproget xx.I dette eksempel skal den hedde: apertium-sh-en.en-sh.t1x
Mange af de tilgængelige sprogpar har andre filer, men vi skal ikke omtale dem her. Du behøver kun disse filer for at skabe et funktionelt system.
Sprogpar
Dette dokument bruger oversættelse fra serbokroatisk til engelsk som eksempel for at forklare, hvordan man skaber et grundlæggende system. Det er ikke et ideelt sprogpar, fordi systemet fungerer bedre på mere beslægtede sprog, men det giver sikkert ikke problemer for de enkle eksempler, vi skal bruge.
Kort om terminologi
Der er et par termer, som må forstås, før vi begynder.
Det første er et lemma. Lemmaet er en citatform af et ord. Det er et ord, som mangler al grammatisk information. For eksempel er "kat" lemmaet af katte. I engelske substantiver er lemmaet normalt ental af ordet. Lemmaet af et verbum er infinitiv af ordet uden det tilhørende "to". Det vil sige, at lemmaet af "was" er "be".
Det andet er et symbol. Et symbol viser information om et ord. Hvis ordet er katte, som er et substantiv i flertal, skal det have et symbol for substantiv og et symbol for flertal. Symbolerne er normalt placeret mellem tegnene < og > ("større-end og mindre-end")
- <n>; for substantiv.
- <pl>; for flertal.
Andre eksempler på symboler er <sg>; ental, <pl> første person, <pri>nutid indikativ, etc. Når symbolerne er skrevet mellem < >, kan de også kaldes for tags. Du bør huske, at i mange af de tilgængelige sprogpar står symbolerne for akronymer og forkortelser af ordene på catalansk. For eksempel "vbhaver" - fra vb (verbum) og haver ("at have" på catalansk). Symbolerne er defineret i <sdef>-taggene og bruges i taggen <s>.
Det tredje ord er paradigme. Paradigmet er et eksempel på, hvordan en gruppe ord er bøjet. I den morfologiske ordbog er det lemmaerne, knyttet til paradigmerne, som giver os mulighed for at beskrive, hvordan et lemma bøjes, uden at måtte skrive alle suffikser.
Hvis vi for eksempel vil gemme de to adjektiver dum og grim, så kan vi i stedet for at gemme begge sådan:
- dum, (mere, mest)
- grim, (mere, mest)
nøjes med at gemme det ene og sige, at "grim bøjes på samme måde som dum". I dette eksempel vil dum være et paradigme, altså en kilde til hvordan andre ord skal bøjes. Paradigmer er defineret i <pardef>-taggen og bruges i taggen <par>.
Hvordan kommer du i gang
Etsprogede ordbøger
Lad os starte med at lave vores første sprogordbog. Ordbogen er en XML-fil. Start en teksteditor og skriv følgende:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> </dictionary>
Filen definerer, at vi ønsker at lave en ordbog. Nu må vi lægge alfabetet ind. Det definerer et sæt bogstaver, som skal bruges i ordbogen. For serbokroatisk skal det se omtrent således ud med alle bogstaverne i det serbokroatiske alfabet:
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>
Placer alfabetet under <dictionary> taggen.
Nu må vi definere et par symboler. Lad os begynde med det enkle, et substantiv (n) i ental (sg) og i flertal (pl).
<sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs>
Symbolerne behøver ikke at være så korte, De kan være så lange, som du ønsker, men vi skal bruge dem meget, så derfor er det fornuftigt at forkorte dem.
Desværre er det ikke så enkelt, som det ser ud, fordi substantiver i serbokroatisk ikke bare bøjes i ental og flertal, men de bøjes også i køn og kasus. Lad os i forbindelse med dette eksempel antage, at alle substantiver er af hankøn og i nominativ kasus (et fuldt eksempel findes i slutningen af dette dokument).
Det næste er at definere en sektion til paradigmer:
<pardefs> </pardefs>
og en ordbogssektion:
<section id="main" type="standard"> </section>
Der findes to typer sektioner: Den første er en standardsektion, som indeholder ord, enclitics, osv. Den anden type er en ubetinget sektion, som normalt indeholder tegnsætning og så videre. Vi bruger ikke den ubetingede sektion her.
Nu skal filen se omtrent sådan ud:
<?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>
Nu har vi skelettet på plads og kan begynde med at tilføje et substantiv. Det substantiv, vi skal bruge, er det serbokroatiske 'gramofon "(som betyder' grammofon 'eller' pladespiller ').
Det første, vi må gøre, er at definere et paradigme.
Husk, at vi antager, at substantivet er hankøn og i nominativ kasus. Ental af substantivet er 'gramofon', og flertal 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>
Læg mærke til: '<l/>' (svarer til <l> </ l>) angiver, at der ikke er ekstra materiale, som skal føjes til stammen for entallet.
Dette kan virke som en ganske udførlig måde at beskrive det på, men der er grunde til det, og du lærer det hurtigt. Du spekulerer sikkert på, hvad <e>, <l> Og <r> står for. Vel,
- e, er for indsættelsen.
- p, er for par.
- l, er for venstre.
- r, er for højre.
Hvorfor venstre og højre? De morfologiske ordbøger vil senere blive kompileret ind i tilstandsautomater. At kompilere dem fra venstre til højre producerer analyser fra ord, og fra højre til venstre producerer ord fra analyser. For eksempel:
* gramofoni (venstre til højre) gramofon<n><pl> (analyse) * gramofon<n><pl> (højre til venstre) gramofoni (generering)
Nu har vi defineret et paradigme, og så må vi knytte det til sit lemma, gramofon. Vi sætter dette ind i den sektion, vi har defineret.
Tilføjelsen, vi skal indsætte i </dictionary>
Nu må vi lave en tilføjelse, som kan oversætte mellem de to ord.
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>
Fordi der er mange af disse tilføjelser, er de normalt skrevet på en linje for at gøre læsning af filen lettere. Igen med 'l' og 'r', ikke sandt? Vi kompilerer den fra venstre til højre for at producere den serbokroatiske → engelske ordbog, og højre til venstre for at producere den engelske → serbokroatiske ordbog.
Derefter kø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 at generere de morfologiske analysatorer (automorf), morfologiske generatorer (autogen) og opslag af ord (autobil), hvor "bil" står for bilingual - "tosproget".
Overførselsregler
Nu har vi to morfologiske ordbøger og en tosproget ordbog. Alt, hvad vi nu behøver, er en overførselsregel for substantiver. Overførselsregel-filer har deres egen DTD (transfer.dtd), som er i Apertium pakken. Hvis du vil implementere en regel, er det ofte en god idé at se i regelfilerne for andre sprogpar først. Mange regler kan genbruges i andre sprog. For eksempel kan den, som er beskrevet nedenfor, være nyttig for alle "null-subject"-sprog.
Begynd med et grundlæggende skelet:
<?xml version="1.0" encoding="UTF-8"?> <transfer> </transfer>
For øjeblikket, hvor vi ser bort fra kasus, behøver vi kun at lave en regel, som tager de grammatiske symboler som input og afleverer dem som output igen.
Vi må først definere kategorier og attributter. Både kategorier og attributter tillader os at gruppere grammatiske symboler. For eksempel kan 'sg' og 'pl' sættes i attribut-gruppen 'tal')
Lad os tilføje de nødvendige sektioner:
<section-def-cats> </section-def-cats> <section-def-attrs> </section-def-attrs>
Vi bøjer kun substantiver i ental og flertal, så vi må tilføje en kategori for substantiver med tal-attribut. Det følgende er tilstrækkeligt:
Tilføj dette til section-def-cats:
<def-cat n="nom"> <cat-item tags="n.*"/> </def-cat>
Dette fanger alle navneord (lemmaer efterfulgt af <n> efterfulgt af en blank) og henviser til dem som "nom" (vi vil senere se, hvordan det bruges).
Tilføj dette til section-def-attrs:
<def-attr n="nbr"> <attr-item tags="sg"/> <attr-item tags="pl"/> </def-attr>
og derpå
<def-attr n="a_nom"> <attr-item tags="n"/> </def-attr>
Den første definerer attributten nbr (tal), som kan være både ental (sg) og flertal (pl).
Den anden definerer attributten a_nom (substantiv-attribut).
Nu må vi tilføje en sektion til globale variabler:
<section-def-vars> </section-def-vars>
Vi bruger disse variabler til at gemme eller overføre attributter mellem reglerne. Lige nu behøver vi kun en.
<def-var n="number"/>
Til sidst må vi så tilføje en regel, som tager et substantiv ind og giver det som output i den rigtige form. Vi har behov for en regel-sektion:
<section-rules> </section-rules>
Jeg vil blot anføre hele reglen og forklare den bagefter.
<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 tag er indlysende, den definerer reglen. Den anden tag siger "brug denne regel, hvis dette "pattern" (mønster) er fundet". I dette eksempel indeholder mønstret kun et substantiv (defineret af kategorien "item"). vil Læg mærke til at mønstre vælges, så den længste match vælges først. Så hvis du har tre regler, hvor den første fanger "<prn><vblex><n>", den anden fanger"<prn><vblex>" og den tredje fanger "<n>", så vil det mønster, der vil blive matchet, og dermed første regel, som bliver udført, være regel nummer et.
Til hvert mønster er der en tilhørende handling, som producerer et tilhørende output, out. Output er en leksikalsk enhed (lu).
"clip" taggen giver brugeren mulighed for at vælge og manipulere attributter for kilde-sprogets (side="sl"), eller mål-sprogets (side="tl") leksikalske enheder.
Lad os kompilere og teste den. Overførselsregler kompileres med:
$ apertium-preprocess-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin
Som vil producere en sh-en.t1x.bin fil.
Nu er vi klar til at teste vores maskinoversættelsessystem. Der er bare en vigtig del, vi mangler, nemlig "part-of-speech (PoS) tagger" men dette vil blive forklaret om lidt. Vi kan teste det alligevel.
Lad os først analysere ordet gramofoni:
$ echo "gramofoni" | lt-proc sh-en.automorf.bin ^gramofoni/gramofon<n><pl>$
Her ville POS-taggeren normalt vælge den rigtige version baseret på part-of-speech, men vi har ikke en POS-tagger endnu, så vi kan bruge dette lille gawk-script, der kun vil producere det første objekt, som hentes.
$ 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>$
Lad os processe det med overførselssreglen:
$ 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
Det vil give følgende output:
^gramophone<n><pl>$^@
- "gramophone" er mål-sprogets (side="tl") lemma (lem) i position 1 (pos="1")
- "<n>" er mål-sprogets a_nom i position 1.
- "<pl>" er mål-sprogets attribut for tal (nbr) i position 1.
Prøv at udkommentere (fjerne) en af "clip" sætningerne, kompiler igen og se, hvad der sker.
Nu har vi outputten fra overførslen, så det eneste, som mangler, er at generere mål-sprogets-bøjningsformer. Dertil bruger vi lt-proc, men i generation-mode (-g) og ikke i analyse-mode.
$ 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\@
Nu har du et maskinoversættelsesystem, som oversætter et serbokroatisk substantiv til et engelsk substantiv. Dette er ikke særlig nyttigt, men de mere komplicerede ting vil vi komme til om lidt. Og spekuler ikke på @-symbolet, det vil også blive forklaret.
Tænk på et par andre ord som bøjes på samme måte som gramofon. Tilføj dem. Vi behøver ikke tilføje nogen paradigmer, men kun tilføjelserne til hovedsektionen i de etsprogede og tosprogede ordbøger.
Verber
Ok, vi har et system, som oversætter substantiver, men det er ret ubrugeligt, for vi vil også oversætte verber og til og med hele sætninger! Lad os starte med verbet "at se". På serbokroatisk er det "videti". Serbokroatisk er en null-objekt-sprog, hvilket betyder, at det normalt ikke bruger et personlig pronomen før den konjugerede form af verbet. Det er engelsk ikke. For eksempel ovesættes "jeg ser" til "vidim" på serbokroatisk. Andre eksempler på null-objekt-sprog er: spansk, rumænsk og polsk.
- Vidim
- se <p1><sg>
- jeg ser
Læg mærke til, at <p1> betyder første person.
Det vil være vigtigt, når vi kommer til at skrive overførselsreglen for verber. Som null-objekt-sprog behøver vi kun at tilføje verbet i de serbokroatiske morfologiske ordbog, mens vi må tilføje både verbet og det personlige pronomen i den engelske morfologiske ordbog. Vi vil gennemgå begge.
De andre former af verbet videti er: vidiš, Vidi, vidimo, vidite, og vide, som svarer til: Du ser, han ser, vi ser, I ser, og de ser.
Der findes to former af "du ser" (you see) på engelsk, hvoraf den ene er i flertal (vidite) og den anden er ental (vidiš).
Vi vil prøve at oversætte sætningen: "Vidim gramofoni" til "Jeg ser grammofoner". For at spare plads vil vi kun tilføje tilstrækkelig information til at kunne foretage oversættelsen og vil lade udfyldelsen af paradigmerne (verbets andre bøjninger), være en øvelse for læseren.
Vi kan i virkeligheden ikke bare oversætte "vidim gramofoni", fordi det ikke er en grammatisk korrekt sætning på serbokroatisk. Den rigtige sætning ville være "vidim gramofone", fordi substantivet er i akkusativ kasus. Vi må tilføje den form også, men behøver ikke tilføje kasus-information nu, vi kan bare tilføje det som er et andet alternativ for flertal. Så, kopier bare 'e'-blokken for 'i' og gør 'i' delen til 'e' der.
Den første ting vi må gøre er at tilføje nogle flere symboler. Vi må først tilføje et symbol for 'verbum', som vi kalder "vblex" (dette betyder leksikalt verbum, i modsætning til modalt verbum og andre typer). Verber har 'person', og "tid" sammen med "tal", så lad os tilføje et par af dem også. Vi skal oversætte "jeg ser", så for person skal vi indsætte "p1" eller "første person", og for tid "pri", eller "præsens" (indikativ).
<sdef n="vblex"/> <sdef n="p1"/> <sdef n="pri"/>
Vi må nu gøre det samme som med substantiver og tilføjer et paradigme for bøjningen af verbet. Den første linje skal være:
<pardef n="vid/eti__vblex">
'/' bruges til at markere, hvor der er føjet til ordenes stamme (delene mellem <l> </ l> taggerne).
Derefter tilføjer vi bøjningen i første person ental:
<e><p><l>im</l><r>eti<s n="vblex"/><s n="pri"/><s n="p1"/><s n="sg"/></r></p></e>
"im" betegner endelsen (som i "vidim '), og det er nødvendigt at tilføje "eti" til <r>-sektionen, fordi dette bliver skåret væk fra definitionen af lemmaet. Resten er ganske let: "vblex" er leksikalt verbum, "pri" er præsens,"p1" er første person og "sg" er ental. Vi kan også tilføje flertal, som er det samme, bortset fra "imo" i stedet for "im" og "pl" i stedet for 'sg'.
Etter dette må vi tilføje et lemma:
<e lm="videti"><i>vid</i><par n="vid/eti__vblex"/></e>
Læg mærke til: Indholdet af <i> </i> er roden, ikke lemmaet.
Nu er vi færdige med den serbokroatiske ordbog. Lad os 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>$
Nu gør vi det samme for den engelske ordbog (husk at tilføje de samme symbol-definitioner her, som du føjede til den serbokroatiske ordbog).
Paradigmet er
<pardef n="s/ee__vblex">
fordi datiden er "så" (saw). Nu kunne vi tilføje både første og andre person, men de er i samme form. Faktisk vil alle former (undtagen tredje person ental) af verbet 'at se' være 'se'. Derfor vil vi i stedet lave en tilføjelse for 'se' og kun give den "pri" symbolet.
<e><p><l>ee</l><r>ee<s n="vblex"/><s n="pri"/></r></p></e>
og, som sædvanlig, en tilføjelse i hovedsektionen:
<e lm="see"><i>s</i><par n="s/ee__vblex"/></e>
Lad os gemme, 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>$
Nu føjer vi den nødvendige del til den tosprogede ordbog:
<e><p><l>videti<s n="vblex"/></l><r>see<s n="vblex"/></r></p></e>
(glem ikke at tilføje "sdef" fra før)
Og kompilerer igen:
$ 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
Nu vil 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 rigtige analyse, men når vi prøver at generere et grundskema, 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\@
Dette "#" betyder, at generatoren ikke er i stand til at generere den rigtige leksikalske form, fordi den ikke er indeholdt i den. Hvorfor det?
Grundlæggende er problemet, at analyserne ikke stemmer overens. "se" i ordbogen er "at se<vblex><pri>", men "ser" leveret af overførslen er "at se<vblex><pri><p1><sg>. Den serbokroatiske del har mere information end den engelske del behøver. Du kan teste dette ved at føje de manglende symboler til den engelske ordbog og derefter rekompilere og teste igen.
Men en mere paradigmatisk måde at klare dette på er at skrive en regel. Så vi åbner regel-filen (apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin, hvis du har glemt det).
Vi må tilføje en ny kategori for 'verbum'.
<def-cat n="vrb"> <cat-item tags="vblex.*"/> </def-cat>
Vi må også tilføje attributterne for tid og person. Vi gør det meget simpelt lige nu, så du kan tilføje p2 og p3, men for at spare plads undlader jeg det.
<def-attr n="temps"> <attr-item tags="pri"/> </def-attr> <def-attr n="pers"> <attr-item tags="p1"/> </def-attr>
Vi bør også tilføje en attribut for verber:
<def-attr n="a_verb"> <attr-item tags="vblex"/> </def-attr>
Nu til 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, at da du prøvede at fjerne "clip"-taggene i det forrige regel-eksempel, forsvandt de fra overførslen, og det er egentlig noget lignende, vi gør her. Vi henter et verbum ind med en fuld analyse, men generer kun en delvis analyse (lemma + verbum tag + tid tag)
Så hvis vi nu rekompilerer den, 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) for at tjekke, om du får det rigtige output.
Prøv den nu med "vidim 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 hvad med personlige pronomener?
Vel, dette er godt, men vi mangler fortsat det personlige pronomen, som er nødvendigt i engelsk. For at tilføje det, må vi først redigere den engelske morfologiske ordbog.
Som før er den første ting at gøre at tilføje de nødvendige symboler:
<sdef n="prn"/> <sdef n="subj"/>
Af de to symboler betyder "prn" pronomen, og "subj" står for subjekt.
Fordi der ikke er rod eller 'lemma' for personlige subjektspronomener, tilføjer vi bare 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>
hvor "prsubj" er "personligt subjekt". resten (du, vi osv.) er en opgave for læseren.
Vi kan lave en tilføjelse i hovedsektionen som denne:
<e lm="personal subject pronouns"><i/><par n="prsubj__prn"/></e>
Nu kan du gemme, rekompilere og teste, og vi får:
$ echo "I" | lt-proc en-sh.automorf.bin ^I/PRPERS<prn><subj><p1><sg>$
(Læg mærke til, at det er med store bogstaver, fordi det engelske "I" er et stort bogstav)
Nu må vi ændre 'verbum'-reglen til at producere et subjektivt personligt pronomen og den rigtige verbumsform.
Tilføj først en kategori (det er sikkert ganske let nu):
<def-cat n="prpers"> <cat-item lemma="prpers" tags="prn.*"/> </def-cat>
Nu tilføjer du pronomen-typerne som attributter. Vi kan tilføje "obj"-typen samtidig , selv om vi ikke behøver den nu:
<def-attr n="tipus_prn"> <attr-item tags="prn.subj"/> <attr-item tags="prn.obj"/> </def-attr>
Og nu indsætter du 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>
Det er samme regel som før, men vi lavede bare et par små ændringer.
Vi ville have outputtet:
^prpers<prn><subj><p1><sg>$ ^see<vblex><pri>$
så generatoren kunne vælge det rigtige pronomen og den rigtige form af verbet.
En hurtig gennemgang:
- <lit>, producerer "prpers"
- <lit-tag>, skriver en tag, for da vi ikke kan få taggene fra verbet, tilføjer vi dem selv, "prn" for pronomen, og "subj" for subjekt.
- , skriver en blank, et mellemrum.
Læg mærke til, at vi fik information om tal og tid direkte fra verbet.
Så hvis vi nu rekompilerer og tester det igen:
$ 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
Hvilket er en ganske korrekt oversættelse.
Fortæl mig om pladespilleren (Flere ord)
Selv om "gramophone" er et engelsk ord, er det ikke den bedste oversættelse. "Gramophone" bruges normalt om meget gamle typer afspiller. En bedre oversættelse ville være "record player". Selv om dette er mere end et ord, kan vi behandle det, som om det er et ord, ved at bruge "multiword" (multipalabra)-konstruktioner.
Vi behøver ikke ændre den serbokroatiske ordbog, men kun den engelske og den tosprogede.
Flertalsformen af "record player" er "record players", der har samme paradigme som "gramophone" (gramophone__n) - vi må bare tilføje 's'. Alt hvad vi behøver, er at føje et nyt element til hovedsektionen.
<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e>
Det eneste, som er anderledes, er taggen, men denne er ikke ny, fordi vi brugte den tidligere, i regelfilerne.
Rekompiler og test på den sædvanlige måde:
$ 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 I see record players
Perfekt. En stor fordel ved at bruge multiwords er, at du kan oversætte idiomatiske udtryk verbatim, uden at måtte oversætte hvert eneste ord. For eksempel vil det engelske udtryk: "At a moment" blive oversat til serbokroatisk som "trenutno" (trenutak = "moment", trenutno er adverbium) - det vil ikke være muligt at oversætte det engelske udtryk ved at oversætte ordene til serbokroatisk enkeltvis.
Mindre variationer
Serbokroatisk har normalt et par måder at skrive hvert ord på som følge af dialektisk variation. Det har et godt fonetisk skriftsystem, så du skriver, som du taler. For eksempel vil folk, som taler ijekavian, sige "rječnik", mens de, som taler ekavian vil sige "rečnik", hvilket afspejler forskelle i udtale af den proto-slaviske vokal yat.
Analyse
Der bør være en simpel måde at håndtere dette på, og det er der, ved igen at bruge paradigmer. Paradigmer bruges ikke kun til at tilføje grammatiske symboler, men de kan også bruges til at erstatte et hvilket som helst symbol/bogstav med et andet. Som eksempel er her et paradigme, der accepterer både "e" og "je" i analysen. Paradigmet bør som de øvrige føjes ind i den etsprogede ordbog for serbokroatisk.
<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 "hovedsektionen":
<e lm="rečnik"><i>r</i><par n="e_je__yat"/><i>čni</i><par n="rečni/k__n"/></e>
Dette giver os mulighed for at analysere begge former, men der kræves mere arbejde, hvis vi også ønsker at generere begge former.