Uputstvo za novi jezički par za Apertium
alccodro
Uputstvo za novi jeziÄki par za Apertium
Ovo uputstvo Äe objasniti kako zapoÄeti novi jeziÄki par za Apertium maÅ¡inski prevod. Ne podrazumevamo poznavanje lingvistike ili maÅ¡inskog prevoÄenja - dovoÇno je da znate da razlikujete razliÄite vrste reÄi (imenice, glagole, prideve itd.)
ReÄ-dve o srpskohrvatskom prevodu
Ovaj prevod koristi Unicode prikaz slova Ç, Ç i Ç umesto Lj, Nj i Dž. Ukoliko ne vidite ta slova, instalirajte set slobodnih fontova koji podržavaju Unicode, kao Å¡to su DejaVu fontovi i postarajte se da gledate ovu stranicu u UTF8 kodnom rasporedu.
U prevodu takoÄe koristimo neke neologizme koji su se ustalili u upotrebi na srpskohrvatskom govornom podruÄju. Npr. file âprevodimoâ kao fajl umesto uobiÄajenog datoteka.
Uvod
Kao Å¡to ste možda primetili iz uvoda, Apertium je sistema maÅ¡inskog prevoÄeÇa. Preciznije, u pitaÇu je platforma za prevod koja obuhvata pokretaÄki motor i alatke koje dozvoÇavaju pravÇeÇe liÄnog sistema maÅ¡inskog prevoÄeÇa. Vi samo treba da unesete podatke. U osnovi, podaci se sastoje iz tri reÄnika i nekoliko pravila koji se staraju za taÄan red reÄi u reÄenici i druge gramatiÄke zavrzlame.
Za detaÇnije uputstvo o tome kako ovo sve radi, proÄitajte dokumentaciju na sajtu projekta na apertium.sourceforge.net.
TrebaÄe Vam
- lttoolbox (>= 3.0.0)
- libxml utils (xmllint itd.)
- apertium (>= 3.0.0)
- editor teksta (ili specijalizovani ureÄivaÄ za XML, ako Vam tako viÅ¡e odgovara)
Za instrukcije kako da instalirate ove programe pogledajte dokumentaciju na sajtu Apertiuma.
Od Äega se sastoji jeziÄki par?
Apertium koristi âplitkiâ maÅ¡inski prevod, Å¡to znaÄi da se koristi reÄnicima i plitkim pravilima prenosa.
âPlitki prevodâ se razlikuje od âdubokog prevodaâ utoliko Å¡to se ne bavi punom sintatiÄkom obradom. Pravila se obiÄno primeÇuju na grupe leksiÄkih jedinica, umesto na razgranatu obradu. U osnovi postoje tri glavna reÄnika.
- MorfoloÅ¡ki reÄnik za jezik xx: on sadrži pravila o tome kako se meÇaju reÄi u jeziku xx. U naÅ¡em primeru ovo Äemo zvati: apertium-sh-en.sh.dix.
- MorfoloÅ¡ki reÄnik za jezik yy: on sadrži pravila o tome kako se meÇaju reÄi u jeziku yy. U naÅ¡em primeru ovo Äemo zvati: apertium-sh-en.en.dix.
- DvojeziÄki reÄnik: on sadrži odnos izmeÄu reÄi i simbola dva jezika. U naÅ¡em primeru ovo Äemo zvati: apertium-sh-en.sh-en.dix.
U paru za prevod, oba jezika mogu biti i izvor i cilj prevoda, te su ovi izrazi relativni.
Postoje i dva fajla za pravila prevoda i to su pravila o redu reÄi u reÄenici, npr. chat noir â cat black â black cat. TakoÄe se staraju i o slaganju roda i broja i sl. Pravila se mogu koristiti i za ubacivanje i prisaÇe leksiÄkih stavki, a o tome Äemo kasnije. Fajlovi u pitaÇu su:
- pravila prevoda jezika xx u jezik yy: ovaj fajl sadrži pravila po kojim Äe se jezik xx meÇati u jezik yy. U naÅ¡em primeru ovo Äemo zvati: apertium-sh-en.trules-sh-en.xml
- pravila prevoda jezika yy u jezik xx: ovaj fajl sadrži pravila po kojim Äe se jezik yy meÇati u jezik xx. U naÅ¡em primeru ovo Äemo zvati: apertium-sh-en.trules-sh-en.xml
Iako u postojeÄim jeziÄkim parovima postoje i neki drugi fajlovi, ovi koje smo naveli su neophodni i dovoljni za funkcionalni sistem.
JeziÄki par
Možda ste veÄ skapirali iz imena fajlova, ali ovo uputstvo Äe se koristiti prevod srpskohrvatskog u engleski radi objaÅ¡ÇeÇa kako da napravite osnovni sistem. Primer nije idealan, jer sistem boÇe funkcioniÅ¡e na srodnijim jezicima.
O terminologiji
Pre nego Å¡to nastavimo, bitno je da pojasnimo neke izraze:
Prvi izraz je lema. U pitaÇu je izvorni oblik reÄi, kakav se nalazi u reÄniku. Recimo, nominativ jednine za imenice, te infinitiv za glagole. Glagol âraditiâ je lema, dok je âradimâ ili âradiÅ¡â Çegova inflikcija. ReÄ âmaÄkeâ je inflikcija leme âmaÄkaâ
Drugi izraz je simbol. U naÅ¡em kontekstvu, simbol je gramatiÄka oznaka. ReÄ âmaÄkeâ je množina imenice, te Äe imati simbole imenice i množine. Ova informacija se obiÄno stavlja u kose zagrade, recimo:
- <n>; za imenicu (od Å¡panskog nom)
- <pl>; za množinu (od španskog plural).
Neki drugi simboli su <sg> jednina, <p1> prvo lice itd. VaÇa napomenuti da su u veÄini jeziÄkih parova koriÅ¡Äeni katalonski izrazi za simbole. Npr. vbhaver - od vb (verb) i haver (imati). Simboli su definisani u <sdef> tagovima i koriÅ¡Äeni u <s> tagovima.
TreÄa reÄ je paradigma. U naÅ¡em kontekstu, paradigma oznaÄava primer kako se neka grupa reÄi meÇa. U morfoloÅ¡kim reÄnicima leme su povezane s paradigmama koje nam dozvoÇavaju da opiÅ¡emo kako se data reÄ meÇa bez pisaÇa svakog pojedinaÄnog nastavka.
Recimo da želimo da opiÅ¡emo komparaciju prideva âsreÄanâ i âdosadanâ:
- sreÄan, sreÄ (an, niji, naj - niji)
- dosadan, dosad (an, niji, naj - niji)
DovoÇno je da napiÅ¡emo jedno pravilo za pridev koje se primeÇuje na mnogo drugih prideva. Paradigme se definiÅ¡u u tagu <pardef>, a koriste u <par>.
Sâm poÄetak
JednojeziÄki reÄnici
Prvo Äemo napraviti reÄnik za izvorni jezik, koji se nalazi u XML fajlu. Pokrenite tekst editor i ukucajte sledeÄe: and type the following:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> </dictionary>
Dakle, fajl do sada definiÅ¡e naÅ¡u žeÇu da saÄinimo novi reÄnik. Da bi taj reÄnik bio iole koristan, neophodno je da prvo dodamo abecedu - spisak slova koje Äemo koristiti u reÄniku. Za srpskohrvatski:
<alphabet>ABCÄÄDDžÄEFGHIJKLLjMNNjOPRSÅ TUVZŽabcÄÄddžÄefghijklljmnnjoprsÅ¡tuvzž</alphabet>
Dodajte abecedu ispod <dictionary> taga.
Sada treba da definiÅ¡emo neke simbole. PoÄnimo s jednostavnim - imenica (n) u jednini (sg) ili množini (pl).
<sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs>
Simboli ne moraju biti kratki, možete koristiti i ce izraz ukoliko želite. Ipak, poÅ¡to Äete to Äesto pisati, ima smisla koristiti skraÄenice.
OÄigledno, nije sve tako jednostavno jer se reÄi deklinuju i konjuguju itd. ali Äemo za potrebe ovog primera pretpostaviti da je imenica muÅ¡kog roda u jednini.
SledeÄi zadatak je da definiÅ¡emo paradigme:
<pardefs> </pardefs>
i sekciju za reÄnik:
<section id="main" type="standard"> </section>
Postoje dve vrste sekcija - prva je standardna, koja sadrži reÄi, enklitike itd. Drugi tip sadrži stvari kao Å¡to interpunkcija i ostale nezavisne simbole. Ovde tu sekciju nemamo, ali Äemo je kasnije demonstrirati.
KonaÄno, naÅ¡ fajl Äe izgledati ovako:
<?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>
PoÅ¡to smo postavili temeÇ reÄniku, možemo dodati imenicu. Igrom sluÄaja, izabrali smo da za demonstraciju koristimo imenicu âgramofonâ.
Za poÄetak treba da definiÅ¡emo paradigmu.
Podrazumevamo imenicu muÅ¡kog roda u nominativu. Jednina je âgramofonâ, a množina âgramofoniâ. Elem:
<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>
PažÇa: tag â<l/>â (ekvivalent <l></l>) oznaÄava da niÅ¡ta ne treba dodati korenu reÄi.
Tagovi kao Å¡to su <e>,
, <l> and <r> oznaÄavaju sledeÄe:
- e, je za unos (entry).
- p, je za par (pair).
- l, je za levo (left).
- r, je za desno (right).
Levo i desno imaju svoju svrhu. Naime, morfoloÅ¡ki reÄnici se kasnije kompajliraju u konaÄnu maÅ¡inu. Kompilacija s leva na desno proizvodi analizu iz reÄi, a s desna na levo proizvodi reÄ iz analize. Na primer:
* gramofoni â gramofon<n><pl> (analiza) * gramofon<n><pl> â gramofoni (generisanje)
Kada smo definisali paradigmu, treba je povezati sa lemom - gramofon. StaviÄemo to u sekciju koju smo definisali.
Unos Äe biti ovakav:
<e lm="gramofon"><i>gramofon</i><par n="gramofon__n"/></e>
ObjaÅ¡ÇeÇe preÄica:
- lm, je za lema
- i, je za identitet (svejedno da li je levo ili desno).
- par, je za paradigmu.
Ovaj unos navodi lemu reÄi (gramofon), koren reÄi (gramogon) i paradigmu kojom se meÇa (gramofon__n). Razlika izmeÄu leme i korena je u tome Å¡to je lema oblik reÄi kako se navodi u reÄniku, a koren je deo leme na koji se dodaju dodaci. Ovo Äe biti jasnije s primerom gde se lema i koren razlikuju.
Sada možemo da testiramo reÄnik. SaÄuvajte ga, te se vratite u shell. Prvo treba da ga kompajliramo (sa lt-comp), a onda da ga testiramo (sa lt-proc).
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin
Treba da ispiše:
main@standard 12 12
Kako kompajliramo s leva na desno, pravimo analizator. Napravimo i generator:
$ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin
Sada bi naredba treablo da dâ isti izlaz.
Da testiramo. Pokrenit lt-proc na analizatoru.
$ lt-proc sh-en.automorf.bin
Testirajte ga. Upišite gramofoni, pa pogledajte ispis:
^gramofoni/gramofon<n><pl>$
Uradimo isto i za engleski reÄnik, ali zamenimo Englesku reÄ gramophone sa gramofon i promenimo meÇaÇe u množini. Kasnije Äemo objasniti Å¡ta bi radili da želimo da koristimo formalniji izraz ârecord plazerâ.
Sada bi trebalo da imate dva fajla u direktorijumu:
- apertium-sh-en.sh.dix koji sadrži (veoma jednostavi) srpskohrvatski morfoloÅ¡ki reÄnik i
- apertium-sh-en.en.dix koji sadrži (veoma jednostavi) engleski morfoloÅ¡ki reÄnik.
DvojeziÄki reÄnik
PoÅ¡to imamo dva morfoloÅ¡ka reÄnika, možemo napraviti dvojeziÄki reÄnik, koji opisuje odnos izmeÄu reÄi. Svi reÄnici koriste isti format (detaÇian u DTD, dix.dtd).
Napravite novi fajl, apertium-sh-en.sh-en.dix i dodajte kostur:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> <alphabet/> <sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs> <section id="main" type="standard"> </section> </dictionary>
Sada nam treba unos za prevod izmeÄu dve reÄi. NeÅ¡to kao:
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>
PiÅ¡emo jedan unos po redu iz prostog razloga Å¡to Äe ih biti puno, pa da ne bi uniÅ¡tili ÄitÇivost. I opet koristimo âlâ i ârâ⦠Kompajliramo ga levo na desno da bi dobili srpskohrvatsko - engleski reÄnik, a desno na levo za englesko - srpskohrvatski reÄnik.
Nakon Å¡to ste to zavrÅ¡ili, pokrenite sledeÄe naredbe:
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin $ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin $ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin $ lt-comp rl apertium-sh-en.en.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
⦠da generiÅ¡ete morfoloÅ¡ki analizator (automorf), morfoloÅ¡ki generator (autogen) i tražeÇe reÄi (autobil). Bil je skraÄeno za âbilingualâ (dvojeziÄko).
Pravila prevoda
PoÅ¡to imamo dva morfoloÅ¡ka reÄnika i dvojeziÄki reÄnik, potrebna su nam pravila prevoda za imenice. Pravila prevoda imaju svoj DTD (transfer.dtd), koji se može naÄi u paketu Apertiuma. Ako treba da implementirate pravila, požeÇno je da prvo konsultujete pravila drugih parova jezika, jer se mnoga pravila daju reciklirati. Npr. pravila opisana dole važe za sve jezike gde se subjekat izostavÇa:
ZapoÄnite skeletonom:
<?xml version="1.0" encoding="UTF-8"?> <transfer> </transfer>
Trenutno, poÅ¡to ignoriÅ¡emo padeže, treba nam samo pravilo koje prima unos gramatiÄkih simbola, te ih ponovo ispisuje.
Kao prvo, treba da definiÅ¡emo kategorije i atribute, koji nam dozvoÇavaju grupisaÇe gramatiÄkih simbola. Kategorijama možemo grupisati simbole radi pretrage (npr. ân.*â su sve imenice). Atributima grupiÅ¡emo simbole meÄu kojima se može birati (npr. âsgâ i âplâ mogu grupisati atribut ânumberâ).
Dodajmo neophodne delove:
<section-def-cats> </section-def-cats> <section-def-attrs> </section-def-attrs>
Pošto vršimo samo inflikciju imenica u jednini i množini, neophodna nam je kategorija za imenice sa atributom broja. Nešto kao:
U section-def-cats dodajte:
<def-cat n="nom"> <cat-item tags="n.*"/> </def-cat>
Ovo Äe âuhvatitiâ sve imenice (leme iza kojih je <n>, pa bilo Å¡ta), a âobraÄaÄeâ im se sa ânomâ, Å¡to Äemo detaÇnije prouÄiti kasnije.
U section section-def-attrs, dodajte:
<def-attr n="nbr"> <attr-item tags="sg"/> <attr-item tags="pl"/> </def-attr>
te onda:
<def-attr n="a_nom"> <attr-item tags="n"/> </def-attr>
Prvo smo definisali atribute nbr (number - broj), koji može biti u jednini (sg) ili množini (pl).
Onda smo definisali atribut a_nom (atribut imenica).
Zatim nam treba sekcija za globalne promenÇive.
<section-def-vars> </section-def-vars>
Ove promenÇive drže ili služe za transfer atributa meÄu pravilima. Za sada nam treba samo jedan.
<def-var n="number"/>
KonaÄno, treba da dodamo pravilo kojim Äemo uneÅ¡enu imenicu ispisati u taÄnom obliku. TrebaÄe nam sekcija za pravilaâ¦
<section-rules> </section-rules>
A sada, prvo pogledajmo sâm primer, koji Äemo kasnije objasniti.
<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>
Prvi je tag oÄigledan - definiÅ¡e pravilo. Drugi tag govori: âprimeni ovo pravilo ako je zadati niz za pretraga pronaÄenâ. U ovom primeru zadati se niz sastoji od jedne imenice. Obratite pažnju da se nizovi za pretragu pronalaze âÅ¡irokoâ, tj. prvo se nalazi najduži niz. Ako imate tri pravila, prvo pravilo Äe pronaÄi â<prn><vblex><n>â, drugo pravilo Äe pronaÄi â<prn><vblex>â, a treÄe Äe pronaÄi â<n>â, pa Äe samo prvo pravilo biti uzeto u obzir.
Za svaki niz pretrage postoji i odgovarajuÄa akcija koja proizvodi odgovarajuÄi ispis. Ispis je leksiÄka jedinica (lu).
Atributi i izvornog jezika (side="sl") i ciÇnog jezika (side="sl") se mogu manipulisati âclipâ tagovima.
Sada možemo kompajlirati i testirati program. Pravila prenosa se kompajliraju komandom:
$ apertium-preprocess-transfer apertium-sh-en.trules-sh-en.xml trules-sh-en.bin
koja Äe generisati fajl trules-sh-en.bin.
Now we're ready to test our machine translation system. There is one crucial part missing, the part-of-speech (PoS) tagger, but that will be explained shortly. In the meantime we can test it as is:
First, lets analyse a word, gramofoni:
$ echo "gramofoni" | lt-proc sh-en.automorf.bin ^gramofon/gramofon<n><pl>$
Now, normally here the POS tagger would choose the right version based on the part of speech, but we don't have a POS tagger yet, so we can use this little gawk script (thanks to Sergio) that will just output the first item retrieved.
$ 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>$
Now let's process that with the transfer rule:
$ 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin
It will output:
^gramophone<n><pl>$^@
- 'gramophone' is the target language (side="tl") lemma (lem) at position 1 (pos="1").
- '<n>' is the target language a_nom at position 1.
- '<pl>' is the target language attribute of number (nbr) at position 1.
Try commenting out one of these clip statements, recompiling and seeing what happens.
So, now we have the output from the transfer, the only thing that remains is to generate the target-language inflected forms. For this, we use lt-proc, but in generation (-g), not analysis 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin gramophones\@
And c'est ca. You now have a machine translation system that translates a Serbo-Croatian noun into an English noun. Obviously this isn't very useful, but we'll get onto the more complex stuff soon. Oh, and don't worry about the '@' symbol, I'll explain that soon too.
Think of a few other words that inflect the same as gramofon. How about adding those. We don't need to add any paradigms, just the entries in the main section of the monolingual and bilingual dictionaries.