Difference between revisions of "Kiel aldoni novan lingvoparon"

From Apertium
Jump to navigation Jump to search
(Traduko de la unuaj aretoj de alineoj.)
 
 
(31 intermediate revisions by 9 users not shown)
Line 1: Line 1:
{{TOCD}}
{{TOCD}}
Tiu dokumento priskribas kiel oni komencas aldoni novan lingvan duon por la Apertium maŝintraduka sistemo de nenio.


''Ĉi tiu paĝo estas tradukata. Bonvolu helpi!''
La dokumento ne antaŭsupozas ian scion de lingvoscienco, aŭ maŝintraduko preter ke vi povas distingi inter nomoj, verboj, prepozicioj k.t.p.

Tiu dokumento priskribas kiel oni komencas aldoni novan lingvoparon por la maŝintraduka sistemo Apertium komencante je nenio.

La dokumento ne antaŭsupozas ian scion pri lingvoscienco, aŭ maŝintraduko preter ke vi povas distingi inter nomoj, verboj, prepozicioj k.t.p.


==Enkonduko==
==Enkonduko==


Apertium estas, kiel vi eble jam komprenis, maŝintradukan sistemo. Nu, ne tute; ĝi estas maŝintraduka estrado. Ĝi provizas motoro kaj ilaro kiujn vi povas uzi por krei vian propran maŝintradukajn sistemojn. Vi devas sole provizas la datumojn. La datumoj je baza nivelo, konsistas el tri vortaroj kaj iuj regoj (por reordoni vortojn kaj aliajn gramatikajn aferojn).
Apertium estas, kiel vi eble jam komprenis, maŝintraduka sistemo. Nu, ne tute; ĝi estas maŝintraduka estrado. Ĝi provizas motoron kaj ilaron, kiujn vi povas uzi por krei viajn proprajn maŝintradukajn sistemojn. Vi devas sole provizi la datumojn. La datumoj, je baza nivelo, konsistas el tri vortaroj kaj iuj reguloj (por aliordigi vortojn, kaj aliaj gramatikaj aferoj).


Por pli detala enkonduko pri kiel ĝi funkcias, vi povas trovi iujn bonegajn artikolojn je la projekta retejo apertium.sourceforge.net.
Por pli detala enkonduko pri kiel ĝi funkcias, vi povas trovi iujn bonegajn artikolojn ĉe la projekta retejo apertium.sourceforge.net.


==Vi bezonos==
==Vi bezonos==


* [[lttoolbox]] (>= 3.0.0)
* [[lttoolbox]] (>= 3.0.0)
* libxml utils (xmllint etc.)
* libxml iloj (xmllint etc.)
* apertium (>= 3.0.0)
* apertium (>= 3.0.0)
* teksta redaktilo (aŭ specialiga XML redaktilo se vi preferas ĝin)
* teksta redaktilo (aŭ speciala redaktilo por XML-formato, se vi preferus tian)


Tiu ĉi dokumento ne priskribas kiel oni instalas ĉi tiujn pakaĵojn. Por plia informo pri tio, bonvolu rigardu la dokumentadan parton el la retejo de Apertium.
This document will not describe how to install these packages, for more information on that, please see the documentation section of the Apertium website.


==Kio estas lingvoparo?==
==What does a language pair consist of?==
La maŝintradukilo Apertium estas speco supraĵa-transformada. Tio simple signifas ke ĝi uzas vortarojn kaj supraĵajn regularojn por la transformado. Supraĵa-transformado diferencas el profunda transformado per tio, ke ĝi ne analizas la plenan sintakson; tipe, la reguloj traktas grupojn de leksikonaj unueroj, anstataŭ trakti analizarbaĵojn. Je baza nivelo, estas tri ĉefaj vortaroj:
# La morfema vortaro por lingvo xx: tiu ĉi enhavas la deklinaciajn regulojn de lingvo xx. En tiu ĉi ekzemplo, ĝi nomiĝas apertium-sh-en.sh.dix
# La morfema vortaro por lingvo yy: tiu ĉi enhavas la deklinaciajn regulojn de lingvo yy. En tiu ĉi ekzemplo, ĝi nomiĝas apertium-sh-en.en.dix
# Dulingva vortaro: ĝi enhavas rilatojn inter la vortoj kaj simboloj trans la du lingvoj. En tiu ĉi ekzemplo, ĝi nomiĝas apertium-sh-en.sh-en.dix


Por traduki, oni povas uzi ambaŭ lingvojn kiel fonto aŭ celo. Ĉi tioj estas terminoj relativaj.
The Apertium machine translation system is of the shallow-transfer type, this basically means it works on dictionaries and shallow transfer rules. Shallow transfer is distinguished from "deep transfer" in that it doesn't do full syntactic parsing, the rules are typically operations on groups of lexical units, rather than operations on parse trees. On a basic level, there are three main dictionaries:
# The morphological dictionary for language xx: this contains the rules of how words in language xx are inflected. In our example this will be called: apertium-sh-en.sh.dix
# The morphological dictionary for language yy: this contains the rules of how words in language yy are inflected. In our example this will be called: apertium-sh-en.en.dix
# Bilingual dictionary: contains correspondences between words and symbols in the two languages. In our example this will be called: apertium-sh-en.sh-en.dix


Ekzistas ankaŭ du dosieroj por transformado-regulojn. Tiuj ĉi reguloj priskribas la aliordigadon de vortoj en frazoj: ekzemple chat noir -> kato nigra -> nigra kato. Ĝi priskribas ankaŭ la konkordo seksa kaj numera, k.t.p. Oni povas ankaŭ uzi la regulojn por enmeti aŭ forviŝi leksikonerojn, kiel priskribos malfrue. Tiuj ĉi dosieroj estas:
In a translation pair, both languages can be either source or target for translation, these are relative terms.
* Transformado-reguloj por lingvo xx al lingvo yy: tiu ĉi dosiero enhavas regulojn por ŝanĝi lingvon xx al lingvon yy. En tiu ĉi ekzemplo, ĝi estas: apertium-sh-en.trules-sh-en.xml
* Transformado-reguloj por lingvo yy al lingvo xx: tiu ĉi dosiero enhavas regulojn por ŝanĝi lingvon yy al lingvon xx. En tiu ĉi ekzemplo, ĝi estos: apertium-sh-en.trules-en-sh.xml


Multaj lingvoparoj nuntempe disponeblaj havas ankaŭ aliajn dosierojn, sed ni ne priskribas tiujn dosierojn tie ĉi. Oni bezonas sole la menciitajn dosierojn por krei funkciadan sistemon.
There are also two files for transfer rules. These are the rules which govern how words are re-ordered in sentences, e.g. chat noir -> cat black -> black cat. It also governs agreement of gender, number etc. The rules can also be used to insert or delete lexical items, as will be described later. These files are:


==Lingvoparo==
* language xx to language yy transfer rules: this file contains rules for how language xx will be changed into language yy. In our example this will be: apertium-sh-en.trules-sh-en.xml
Oni povus vidi per la dosieronomoj ke tiu ĉi klarigo uzas la ekzemplon pri la traduko el serba-kroata al angla por klarigi kiel oni kreas bazan sistemon. Tiu ĉi paro ne estas ideala, ĉar la Apertium-sistemo funkcias pli bone por pli proksime rilataj lingvoj; por la simplaj ekzemploj en tiu ĉi dokumento, ne gravas.
* language yy to xx language transfer rules: this file contains rules for how language yy will be changed into language xx. In our example this will be: apertium-sh-en.trules-en-sh.xml


==Mallonga noto pri terminoj==
Many of the language pairs currently available have other files, but we won't cover them here. These files are the only ones required to generate a functional system.
Nun ekzistas numero da terminoj kiuj oni devas kompreni antaŭ kontinui.


La unua estas '''lemo'''. '''Lemo''' estas la citaĵa formo de vorto. Ĝi estas la vorto sen ia gramatika informaĵo. Ekzemple, la lemo de la vorto ''katojn'' estas ''kat'' sen ''-o''. En Esperanto, substantivoj estas tipe en la singulara, nominativa formo. Por verboj, la lemo estas la infinitivo sen ''-i''; ekzemple la lemo de ''amis'' estas ''am''.
==Language pair==


La dua termino estas ''simbolo''. En la kunteksto de la Apertium sistemo, ''simbolo'' signifas gramatikan etikedon. La vorto ''katoj'' estas plurala substantivo; do ĝi havos substantivan simbolon kaj pluralan simbolon. Je la enigo kaj eligo de Apertium modjuloj, tiuj etikedoj aperas inter angulaj krampoj, kiel sekve:
As may have been alluded by the file names, this HOWTO will use the example of translating Serbo-Croatian to English to explain how to create a basic system. This is not an ideal pair, as the system works better for more closely related languages, but that shouldn't present a problem for the simple examples we'll have here.


* <n>; por substantivo.
==A brief note on terms==
* <pl>; por pluralo.


Aliaj ekzemploj de simboloj estas <sg>; por singularo, <p1> por unua persono, <pri> por indiki estantecon, k.t.p. Simbolo inter krampoj nomiĝas ankaŭ etikedo. Estas notinda ke en multaj da nuntempe disponigataj lingvoparoj, la simbolaj difinoj estas akronimoj aŭ mallongigitoj de katalunaj vortoj. Ekzemple, vbhaver devenas el ''vb'' (kiu signifas: verbo) kaj ''haver'' ("havi" en kataluna lingvo). Simboloj estas difinitaj inter <sdef> etikedoj kaj uzitaj inter <nowiki><s></nowiki> etikedoj.
There are number of terms that will need to be understood before we continue.


La tria vorto estas ''paradigmo''. En la kunteksto de la Apertiuma sistemo, paradigmo priskribas la fleksion de vortaroj. En la morfema vortaro, lemo (vidu supre) estas ligita al paradigmo kiu priskribas la fleksion de la lemo; do oni ne devas provizi ĉiujn finaĵojn de la lemo.
The first is lemma. A lemma is the citation form of a word. It is the word stripped of any grammatical information. For example, the lemma of the word cats is ''cat''. In English nouns this will typically be the singular form of the word in question. For verbs, the lemma is the infinitive stripped of to, e.g. the lemma of was would be ''be''.


Konsideru la sekvan ekzemplon kiu montras la utilon de tiu ĉi skemo: oni volas konservi la anglajn adjektivojn ''happy'' kaj ''lazy''; anstataŭ konservi du tre similajn vortarojn kiel:
The second is symbol. In the context of the Apertium system, symbol refers to a grammatical label. The word cats is a plural noun, therefore it will have the noun symbol and the plural symbol. In the input and output of Apertium modules these are typically given between angle brackets, as follows:


* happy, happ (y, ier, iest), kaj
* <n>; for noun.
* lazy, laz (y, ier, iest),
* <pl>; for plural.


oni simple konservas la ŝablonon de unu (ekzemple ''happy'') kaj tiam signifas ke "''lazy'' fleksias kiel ''happy''", kaj "''friendly'' fleksias kiel ''happy''", "''naughty'' fleksias kiel ''happy''" k.t.p. En tiu ĉi ekzemplo, ''happy'' estas la ŝablono aŭ paradigmo kiu priskribas la fleksion de la aliaj vortoj. La preciza priskribo de la paradigma difino estas baldaŭ priskribota. Paradigmoj estas difinitaj inter ''<pardef>''-aj etikedoj, kaj uzita inter ''<par>''-aj etikedoj.
Other examples of symbols are <sg>; singular, <p1> first person, <pri> present indicative etc. When written in angle brackets, the symbols may also be referred to as tags. It is worth noting that in many of the currently available language pairs the symbol definitions are acronyms or contractions of words in Catalan. For example, vbhaver — from vb (verb) and haver ("to have" in Catalan). Symbols are defined in <sdef> tags and used in <nowiki><s></nowiki> tags.


==Kiel komenci==
The third word is paradigm. In the context of the Apertium system, paradigm refers to a example of how a particular group of words inflect. In the morphological dictionary, lemmas (see above) are linked to paradigms which allows us to describe how a given lemma inflects without having to write out all of the endings.


==Unulingvaj vortaroj==
An example of the utility of this is, if we wanted to store the two adjectives happy and lazy, instead of storing two lots of the same thing:
Ni komencu per fari nian unuan fontlingvan vortaron. La vortaro estas XML-dosiero. Ruligu vian tekstilon kaj tajpu la sekvajn:

* happy, happ (y, ier, iest)
* lazy, laz (y, ier, iest)

We can simply store one, and then say "lazy, inflects like happy", or indeed "shy inflects like happy", "naughty inflects like happy", "friendly inflects like happy" etc. In this example, happy would be the paradigm, the model for how the others inflect. The precise description of how this is defined will be explained shortly. Paradigms are defined in <pardef> tags, and used in <par> tags.

==Getting started==

===Monolingual dictionaries===

Lets start by making our first source language dictionary. The dictionary is an XML file. Fire up your text editor and type the following:
<pre>
<pre>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
Line 72: Line 70:
</dictionary>
</dictionary>
</pre>
</pre>

So, the file so far defines that we want to start a dictionary. In order for it to be useful, we need to add some more entries, the first is an alphabet. This defines the set of letters that may be used in the dictionary, for Serbo-Croatian. It will look something like the following, containing all the letters of the Serbo-Croatian alphabet:
Nu, la dosiero difinas ke ni volas komenci vortaron. Por fari ĝin utilan, ni devas aldoni iujn enskribigojn. La unua estas la alfabeto: tiu ĉi difinas la signaron kiun oni uzos en la vortaro (serba-kroata tiukaze). Ĝi aperos kiel la sekvajn (enhavita ĉiujn da la signoj en la serba-kroata alfabeto)
<pre>
<pre>
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>
</pre>
</pre>


Place the alphabet below the <dictionary> tag.
Metu la alfabeto malsupre de la <dictionary> etikedo.


Sekve, ni devas difini iujn simbolojn. Ni komencu per la simplaj aĵoj: singularaj (sg) kaj pluralaj (pl) substantivoj (n):
Next we need to define some symbols. Lets start off with the simple stuff, noun (n) in singular (sg) and plural (pl).
<pre>
<pre>
<sdefs>
<sdefs>
Line 87: Line 86:
</sdefs>
</sdefs>
</pre>
</pre>
La simbolaj nomoj ne devas esti tiel malgrandaj. Fakte, oni povas plene skribi tiujn ĉi. Tamen, vi ofte tajpos tiujn ĉi, do estas prudenta mallongigi.
The symbol names do not have to be so small, in fact they could be just written our in full, but as you'll be typing them a lot, it makes sense to abbreviate.


Bedaŭrinde, ĝi ne estas tiel simpla. Substantivoj en serba-kroata fleksias laŭ pli ol sole numero; ili fleksias ankaŭ laŭ genro kaj kazo. Tamen, ni alprenu por tiu ekzemplo ke la substantivo estas vira kaj en la nominativa kazo (kompleta ekzemplo troviĝas je la fino de tiu ĉi dokumento).
Unfortunately, it isn't quite so simple, nouns in Serbo-Croatian inflect for more than just number, they also inflect for gender and case. However, we'll assume for the purposes of this example that the noun is masculine and in the nominative case (a full example may be found at the end of this document).


Sekve, ni devas difini parto por la paradigmoj:
Next thing is to define a section for the paradigms,
<pre>
<pre>
<pardefs>
<pardefs>
Line 97: Line 96:
</pardefs>
</pardefs>
</pre>
</pre>
kaj vortara parto:
and a dictionary section:
<pre>
<pre>
<section id="main" type="standard">
<section id="main" type="standard">
Line 103: Line 102:
</section>
</section>
</pre>
</pre>
Estas du tipoj de partoj:
There are two types of sections, the first is a standard section, which contains words, enclitics etc. The second type is an inconditional section which typically contains punctuation etc. We don't have an inconditional section here, although it will be demonstrated later.
#Standarda parto kiu enhavas vortojn, enklitojn (kiuj estas tipoj de postafiksoj), k.t.p.,
#Nestata parto kiu tipe enhavas interpunkcio k.t.p. Ni ne havas nestatn parton tie ĉi, kvankam ni vidos ĝin pli poste.


Do, nia dosiero devus nun aperi iom kiel:
So, our file should now look something like:
<pre>
<pre>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
Line 122: Line 123:
</dictionary>
</dictionary>
</pre>
</pre>
Nun ni havas la vortara ostaro kaj ni povas komenci per aldoni substantivon. Ni uzu 'gramofon' (kiuj signifas 'gramofono').
Now we've got the skeleton in place, we can start by adding a noun. The noun in question will be 'gramofon' (which means 'gramophone' or 'record player').


Pro tio ke ni havas neniun paradigmon, ni devas difini paradigmon.
The first thing we need to do, as we have no prior paradigms, is to define a paradigm.


Remember we're assuming masculine gender and nominative case. The singular form of the noun is 'gramofon', and the plural is 'gramofoni'. So:
Memoru ke ni alprenas ke substantivoj havas virajn genrojn kaj nominativajn kazojn. La singulara formo de la substantivo estas 'gramofon' kaj la plurala estas 'gramofoni'. Do:
<pre>
<pre>
<pardef n="gramofon__n">
<pardef n="gramofon__n">
Line 143: Line 144:
</pardef>
</pardef>
</pre>
</pre>
Note: the '<l/>' (equivalent to <l></l>) denotes that there is no extra material to be added to the stem for the singular.
Rimarku: la '<l/>' (egalvalora ol <l></l>) signifas ke ne estas pluaj aĵoj kiuj estas aldonota al la radiko de la singulara.


This may seem like a rather verbose way of describing it, but there are reasons for it and it quickly becomes second nature. You're probably wondering what the <e>, <p>, <l> and <r> stand for. Well,
Tio ĉi eble ŝajnas kiel iom longa maniero por priskribi ĝin, sed estas bonaj rezonoj kaj ĝi iĝas baldaŭ pli naturan. Vi eble scivolas kion signifas la <e>, <p>, <l> kaj <r>. Nu:
* e, signifas enskribigo.
* p, signifas paron ("pair" en angla).
* l, signifas maldekstro ("left" en angla).
* r, signifas dekstro ("right" en angla).


Kiel dekstro kaj maldekstro? Nu, la morfemaj vortaroj estas kompilota al finiaj ŝtataj maŝinoj. Kompili tiujn ĉi de maldekstro al dekstro kreas analizojn el vortoj, kaj de dekstro al maldekstro kreas vortojn el analizoj. Ekzemple:
* e, is for entry.
* p, is for pair.
* l, is for left.
* r, is for right.

Why left and right? Well, the morphological dictionaries will later be compiled into finite state machines. Compiling them left to right produces analyses from words, and from right to left produces words from analyses. For example:
<pre>
<pre>
* gramofoni (left to right) gramofon<n><pl> (analysis)
* gramofoni (maldekstro al dekstro) gramofon<n><pl> (analizo)
* gramofon<n><pl> (right to left) gramofoni (generation)
* gramofon<n><pl> (dekstro al maldekstro) gramofoni (vorto)
</pre>
</pre>
Nun, ni ĵus difinis paradigmon kaj ni devas ligi ĝin al sia lemo, ''gramafon''. Ni metu tiun ĉi en la parto kiun ni difinis.
Now we've defined a paradigm, we need to link it to its lemma, gramofon. We put this in the section that we've defined.


The entry to put in the <section> will look like:
Oni devas meti la sekvan enskribon en <section>:
<pre>
<pre>
<e lm="gramofon"><i>gramofon</i><par n="gramofon__n"/></e>
<e lm="gramofon"><i>gramofon</i><par n="gramofon__n"/></e>
</pre>
</pre>
Rapida superrigardo de la mallongigoj:
A quick run down on the abbreviations:
* lm, estas por lemo.
* i, estas por idento (la maldekstro kaj la dekstro estas la sama).
* par, estas por paradigmo.


Tiu enskribo donas la limo de la vorto, ''gramofon'', la radiko, ''gramofon'' kaj la paradigmo 'gramofon__n' laŭ kiu la vorto fleksias. La malsameco inter la lemo kaj la radiko estas ke la limo estas la citada formo de la vorto, dum la radiko estas la subĉeno de la lemo al kiu postfiksoj estas aldonota. Tiu iĝos pli klara kiam ni vidigas enskribo kie la du malsamas.
* lm, is for lemma.
* i, is for identity (the left and the right are the same).
* par, is for paradigm.


Ni estas nun preta testi la vortaron. Konservu ĝin kaj reiru al la ŝelo. Ni unue devas kompili ĝin (uzante lt-comp), tiam ni povas testi ĝin (uzante lt-proc).
This entry states the lemma of the word, gramofon, the root, gramofon and the paradigm with which it inflects gramofon__n. The difference between the lemma and the root is that the lemma is the citation form of the word, while the root is the substring of the lemma to which stems are added. This will become clearer later when we show an entry where the two are different.

We're now ready to test the dictionary. Save it, and then return to the shell. We first need to compile it (with lt-comp), then we can test it (with lt-proc).
<pre>
<pre>
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin
</pre>
</pre>
Devus doni la eligo:
Should produce the output:
<pre>
<pre>
main@standard 12 12
main@standard 12 12
</pre>
</pre>
Dum ni estas kompilata ĝin maldekstre al dekstre, ni estas kreanta analizilo. Ni faru ankaŭ generilo:
As we are compiling it left to right, we're producing an analyser. Lets make a generator too.
<pre>
<pre>
$ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin
$ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin
</pre>
</pre>
Je tiu fazo, la ordono devus doni la saman eligon.
At this stage, the command should produce the same output.


We can now test these. Run lt-proc on the analyser.
Ni povas nun testi tiujn ĉi. Ruligu lt-proc uzante la analizilo:
<pre>
<pre>
$ lt-proc sh-en.automorf.bin
$ lt-proc sh-en.automorf.bin
</pre>
</pre>
Now try it out, type in gramofoni (gramophones), and see the output:
Nun, provu ĝin. Tajpu ''gramofoni'' (gramofonoj) kaj vidu la eligon:
<pre>
<pre>
^gramofoni/gramofon<n><pl>$
^gramofoni/gramofon<n><pl>$
</pre>
</pre>
Now, for the English dictionary, do the same thing, but substitute the English word gramophone for gramofon, and change the plural inflection. What if you want to use the more correct word 'record player', well, we'll explain how to do that later.
Nun, por la angla vortaro, faru la sama aĵoj, sed uzu la angla vorto ''gramophone'' por gramofono, kaj ŝanĝu la pluralan fleksion. Kio fari se vi deziras uzi la pli ĝustan vorton 'record player'? Nu, oni vidos pli poste kiel fari ĝin.


Vi devus nun havas du dosierojn en la dosierujoj.
You should now have two files in the directory:
* apertium-sh-en.sh.dix kiu enhavas (tre) bazan serba-kroatan morfeman vortaron, kaj
* apertium-sh-en.en.dix kiu enhavas (tre) bazan anglan morfeman vortaron.


===Dulingva vortaro===
* apertium-sh-en.sh.dix which contains a (very) basic Serbo-Croatian morphological dictionary, and
Nu ni havas du morfemajn vortarojn. La sekva farendaĵo estas la dulingva vortaro. Tiu priskribas asociojn inter vortoj. Ĉiuj vortaroj uzas la saman aranĝon (kiu estas precizigita en la DTD, dix.dtd).
* apertium-sh-en.en.dix which contains a (very) basic English morphological dictionary.


Kreu novan dosieron, apertium-sh-en.sh-en.dix kaj enmetu la bazan ostaron:
===Bilingual dictionary===

So we now have two morphological dictionaries, next thing to make is the bilingual dictionary. This describes mappings between words. All dictionaries use the same format (which is specified in the DTD, dix.dtd).

Create a new file, apertium-sh-en.sh-en.dix and add the basic skeleton:
<pre>
<pre>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
Line 220: Line 217:
</dictionary>
</dictionary>
</pre>
</pre>
Nun ni devas aldoni enskribon por traduki inter du vortoj. Io kiel:
Now we need to add an entry to translate between the two words. Something like:
<pre>
<pre>
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>
</pre>
</pre>
Pro tio ke ekzistas multaj da tiuj enskriboj, oni skribas ĝin je unu linio por faciligi lego de tiu ĉi dosiero. Denove, uzante la 'l' kaj 'r' ĉu ne? Nu, oni kompilas ĝin maldekstre al dekstre por fari la serba-kroatan → anglan vortaron kaj dekstre al maldekstre por fari la anglan → serba-kroatan vortaron.
Because there are a lot of these entries, they're typically written on one line to facilitate easier reading of the file. Again with the 'l' and 'r' right? Well, we compile it left to right to produce the Serbo-Croatian → English dictionary, and right to left to produce the English → Serbo-Croatian dictionary.


Do, kiam vi faris ĝin, ruligu la sekvitajn ordonojn:
So, once this is done, run the following commands:
<pre>
<pre>
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin
$ 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 rl apertium-sh-en.en.dix sh-en.autogen.bin


$ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.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 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 lr apertium-sh-en.sh-en.dix sh-en.autobil.bin
$ lt-comp rl apertium-sh-en.sh-en.dix en-sh.autobil.bin
$ lt-comp rl apertium-sh-en.sh-en.dix en-sh.autobil.bin
</pre>
</pre>
To generate the morphological analysers (automorf), the morphological generators (autogen) and the word lookups (autobil), the bil is for "bilingual".
Por generi la morfemajn analizilojn (automorf), la morfemajn generilojn (autogen) kaj la vortaj interrilataj tabloj (autobil), la "bil" estas por "bilingual" (t.e. dulingva).


===Transfer rules===
===Transiraj reguloj===


Do, nun ni havas du morfemajn vortarojn, kaj dulingvan vortaron. Ni devas sole doni la transirajn regulojn por substantivoj. Transiraj regulaj dosieroj havas siajn proprajn DTD-on (transfer.dtd) kiujn oni povas trovi en la Apertium-a enpako. Se vi bezonas krei regulon, estas ofte bona ideo unue konsideri la regulajn dosierojn de aliaj lingvoparojn. Oni povas reuzi multe da reguloj inter malsamaj lingvoparoj. Ekzemple, la regulo malsupre estus utila por iu ajn nul-subjekta lingvo.
So, now we have two morphological dictionaries, and a bilingual dictionary. All that we need now is a transfer rule for nouns. Transfer rule files have their own DTD (transfer.dtd) which can be found in the Apertium package. If you need to implement a rule it is often a good idea to look in the rule files of other language pairs first. Many rules can be recycled/reused between languages. For example the one described below would be useful for any null-subject language.


Komencu kiel ĉiuj da la aliaj kun baza ostaro:
Start out like all the others with a basic skeleton:
<pre>
<pre>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
Line 667: Line 664:
Which, while it isn't exactly prize-winning prose (much like this HOWTO), is a fairly accurate translation.
Which, while it isn't exactly prize-winning prose (much like this HOWTO), is a fairly accurate translation.


==So tell me about the record player (Multiwords)==
==Do rakontu min pri la gramofono (Multvortoj)==
Dum 'gramopone' estas angla vorto, ĝi ne estas la pli bona traduko. Oni uzas 'gramophone' tipe por la tre malnova speco kun la nadlo anstataŭ la grifelo kaj nenio plilaŭtigo. Pli bona traduko estus 'record player'. Kvankam oni havas pli ol unu vorto, ni povas trakti ĝin kvazaŭ estas unu vorto per uzi multvortajn (multipalabra) konstruojn.

While gramophone is an English word, it isn't the best translation. Gramophone is typically used for the very old kind, you know with the needle instead of the stylus, and no amplification. A better translation would be 'record player'. Although this is more than one word, we can treat it as if it is one word by using multiword (multipalabra) constructions.


Ni ne devas tuŝi la serba-kroatan vortaron - sole la anglan kaj dulingvan. Do malfermu ilin.
We don't need to touch the Serbo-Croatian dictionary, just the English one and the bilingual one this, so open it up.


The plural of 'record player' is 'record players', so it takes the same paradigm as gramophone (gramophone__n) in that we just add 's'. All we need to do is add a new element to the main section.
La pluralo de 'record player' estas 'record players', do ĝi uzas la saman paradigmon kiel 'gramophone' (gramophone__n); ni aldonu sole 's'. Nu, ni sole devu aldoni novan eron al la ĉefa sekcio.
<pre>
<pre>
<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e>
<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e>
</pre>
</pre>
La sola aĵo kiu malsamas, estas la uzo de la <b/> etikedo, kvankam ĝi ne estas tute novo, pro tio ke ni vidis ĝin je la regla dosiero.
The only thing different about this is the use of the <b/> tag, although this isn't entirely new as we saw it in use in the rules file.


Nu, rekompilu kaj testu laŭ la ortodoksa maniero:
So, recompile and test in the orthodox fashion:
<pre>
<pre>
$ echo "vidim gramofone" | lt-proc sh-en.automorf.bin | \
$ echo "vidim gramofone" | lt-proc sh-en.automorf.bin | \
Line 687: Line 683:
I see record players
I see record players
</pre>
</pre>
Perfect. A big benefit of using multiwords is that you can translate idiomatic expressions verbatim, without having to do word-by-word translation. For example the English phrase, "at the moment" would be translated into Serbo-Croatian as "trenutno" (trenutak = ''moment'', trenutno being adverb of that) &mdash; it would not be possible to translate this English phrase word-by-word into Serbo-Croatian.
Bonege. Granda bono de la uzo de multvortoj estas ke oni povas traduki idiomajn esprimojn laŭvorte. Ekzemple, la angla frazo "at the moment" tradukus al serba-kroata kiel "trenutno"('trenutak' = ''moment'' kaj 'trenutno' estas adverba formo) &mdash; ne estus ebla traduki ĝin vorte-per-vorte al serba-kroata.


==Dealing with minor variation==
==Dealing with minor variation==
Line 727: Line 723:


*[[Building dictionaries]]
*[[Building dictionaries]]
*[[Finding_errors_in_dictionaries]]
*[[Cookbook]]
*[[Chunking]]
*[[Contributing to an existing pair]]


[[Category:Documentation|HOWTO]]
[[Category:Dokumentado en Esperanto]]
[[Category:Documentation]]
[[Category:HOWTO]]
[[Category:Writing dictionaries]]
[[Category:Quickstart]]
[[Category:Esperanto]]

Latest revision as of 07:13, 16 February 2015

Ĉi tiu paĝo estas tradukata. Bonvolu helpi!

Tiu dokumento priskribas kiel oni komencas aldoni novan lingvoparon por la maŝintraduka sistemo Apertium komencante je nenio.

La dokumento ne antaŭsupozas ian scion pri lingvoscienco, aŭ maŝintraduko preter ke vi povas distingi inter nomoj, verboj, prepozicioj k.t.p.

Enkonduko[edit]

Apertium estas, kiel vi eble jam komprenis, maŝintraduka sistemo. Nu, ne tute; ĝi estas maŝintraduka estrado. Ĝi provizas motoron kaj ilaron, kiujn vi povas uzi por krei viajn proprajn maŝintradukajn sistemojn. Vi devas sole provizi la datumojn. La datumoj, je baza nivelo, konsistas el tri vortaroj kaj iuj reguloj (por aliordigi vortojn, kaj aliaj gramatikaj aferoj).

Por pli detala enkonduko pri kiel ĝi funkcias, vi povas trovi iujn bonegajn artikolojn ĉe la projekta retejo apertium.sourceforge.net.

Vi bezonos[edit]

  • lttoolbox (>= 3.0.0)
  • libxml iloj (xmllint etc.)
  • apertium (>= 3.0.0)
  • teksta redaktilo (aŭ speciala redaktilo por XML-formato, se vi preferus tian)

Tiu ĉi dokumento ne priskribas kiel oni instalas ĉi tiujn pakaĵojn. Por plia informo pri tio, bonvolu rigardu la dokumentadan parton el la retejo de Apertium.

Kio estas lingvoparo?[edit]

La maŝintradukilo Apertium estas speco supraĵa-transformada. Tio simple signifas ke ĝi uzas vortarojn kaj supraĵajn regularojn por la transformado. Supraĵa-transformado diferencas el profunda transformado per tio, ke ĝi ne analizas la plenan sintakson; tipe, la reguloj traktas grupojn de leksikonaj unueroj, anstataŭ trakti analizarbaĵojn. Je baza nivelo, estas tri ĉefaj vortaroj:

  1. La morfema vortaro por lingvo xx: tiu ĉi enhavas la deklinaciajn regulojn de lingvo xx. En tiu ĉi ekzemplo, ĝi nomiĝas apertium-sh-en.sh.dix
  2. La morfema vortaro por lingvo yy: tiu ĉi enhavas la deklinaciajn regulojn de lingvo yy. En tiu ĉi ekzemplo, ĝi nomiĝas apertium-sh-en.en.dix
  3. Dulingva vortaro: ĝi enhavas rilatojn inter la vortoj kaj simboloj trans la du lingvoj. En tiu ĉi ekzemplo, ĝi nomiĝas apertium-sh-en.sh-en.dix

Por traduki, oni povas uzi ambaŭ lingvojn kiel fonto aŭ celo. Ĉi tioj estas terminoj relativaj.

Ekzistas ankaŭ du dosieroj por transformado-regulojn. Tiuj ĉi reguloj priskribas la aliordigadon de vortoj en frazoj: ekzemple chat noir -> kato nigra -> nigra kato. Ĝi priskribas ankaŭ la konkordo seksa kaj numera, k.t.p. Oni povas ankaŭ uzi la regulojn por enmeti aŭ forviŝi leksikonerojn, kiel priskribos malfrue. Tiuj ĉi dosieroj estas:

  • Transformado-reguloj por lingvo xx al lingvo yy: tiu ĉi dosiero enhavas regulojn por ŝanĝi lingvon xx al lingvon yy. En tiu ĉi ekzemplo, ĝi estas: apertium-sh-en.trules-sh-en.xml
  • Transformado-reguloj por lingvo yy al lingvo xx: tiu ĉi dosiero enhavas regulojn por ŝanĝi lingvon yy al lingvon xx. En tiu ĉi ekzemplo, ĝi estos: apertium-sh-en.trules-en-sh.xml

Multaj lingvoparoj nuntempe disponeblaj havas ankaŭ aliajn dosierojn, sed ni ne priskribas tiujn dosierojn tie ĉi. Oni bezonas sole la menciitajn dosierojn por krei funkciadan sistemon.

Lingvoparo[edit]

Oni povus vidi per la dosieronomoj ke tiu ĉi klarigo uzas la ekzemplon pri la traduko el serba-kroata al angla por klarigi kiel oni kreas bazan sistemon. Tiu ĉi paro ne estas ideala, ĉar la Apertium-sistemo funkcias pli bone por pli proksime rilataj lingvoj; por la simplaj ekzemploj en tiu ĉi dokumento, ne gravas.

Mallonga noto pri terminoj[edit]

Nun ekzistas numero da terminoj kiuj oni devas kompreni antaŭ kontinui.

La unua estas lemo. Lemo estas la citaĵa formo de vorto. Ĝi estas la vorto sen ia gramatika informaĵo. Ekzemple, la lemo de la vorto katojn estas kat sen -o. En Esperanto, substantivoj estas tipe en la singulara, nominativa formo. Por verboj, la lemo estas la infinitivo sen -i; ekzemple la lemo de amis estas am.

La dua termino estas simbolo. En la kunteksto de la Apertium sistemo, simbolo signifas gramatikan etikedon. La vorto katoj estas plurala substantivo; do ĝi havos substantivan simbolon kaj pluralan simbolon. Je la enigo kaj eligo de Apertium modjuloj, tiuj etikedoj aperas inter angulaj krampoj, kiel sekve:

  • <n>; por substantivo.
  • <pl>; por pluralo.

Aliaj ekzemploj de simboloj estas <sg>; por singularo, <p1> por unua persono, <pri> por indiki estantecon, k.t.p. Simbolo inter krampoj nomiĝas ankaŭ etikedo. Estas notinda ke en multaj da nuntempe disponigataj lingvoparoj, la simbolaj difinoj estas akronimoj aŭ mallongigitoj de katalunaj vortoj. Ekzemple, vbhaver devenas el vb (kiu signifas: verbo) kaj haver ("havi" en kataluna lingvo). Simboloj estas difinitaj inter <sdef> etikedoj kaj uzitaj inter <s> etikedoj.

La tria vorto estas paradigmo. En la kunteksto de la Apertiuma sistemo, paradigmo priskribas la fleksion de vortaroj. En la morfema vortaro, lemo (vidu supre) estas ligita al paradigmo kiu priskribas la fleksion de la lemo; do oni ne devas provizi ĉiujn finaĵojn de la lemo.

Konsideru la sekvan ekzemplon kiu montras la utilon de tiu ĉi skemo: oni volas konservi la anglajn adjektivojn happy kaj lazy; anstataŭ konservi du tre similajn vortarojn kiel:

  • happy, happ (y, ier, iest), kaj
  • lazy, laz (y, ier, iest),

oni simple konservas la ŝablonon de unu (ekzemple happy) kaj tiam signifas ke "lazy fleksias kiel happy", kaj "friendly fleksias kiel happy", "naughty fleksias kiel happy" k.t.p. En tiu ĉi ekzemplo, happy estas la ŝablono aŭ paradigmo kiu priskribas la fleksion de la aliaj vortoj. La preciza priskribo de la paradigma difino estas baldaŭ priskribota. Paradigmoj estas difinitaj inter <pardef>-aj etikedoj, kaj uzita inter <par>-aj etikedoj.

Kiel komenci[edit]

Unulingvaj vortaroj[edit]

Ni komencu per fari nian unuan fontlingvan vortaron. La vortaro estas XML-dosiero. Ruligu vian tekstilon kaj tajpu la sekvajn:

<?xml version="1.0" encoding="UTF-8"?>
<dictionary>

</dictionary>

Nu, la dosiero difinas ke ni volas komenci vortaron. Por fari ĝin utilan, ni devas aldoni iujn enskribigojn. La unua estas la alfabeto: tiu ĉi difinas la signaron kiun oni uzos en la vortaro (serba-kroata tiukaze). Ĝi aperos kiel la sekvajn (enhavita ĉiujn da la signoj en la serba-kroata alfabeto)

<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>

Metu la alfabeto malsupre de la <dictionary> etikedo.

Sekve, ni devas difini iujn simbolojn. Ni komencu per la simplaj aĵoj: singularaj (sg) kaj pluralaj (pl) substantivoj (n):

<sdefs>
   <sdef n="n"/>
   <sdef n="sg"/>
   <sdef n="pl"/>
</sdefs>

La simbolaj nomoj ne devas esti tiel malgrandaj. Fakte, oni povas plene skribi tiujn ĉi. Tamen, vi ofte tajpos tiujn ĉi, do estas prudenta mallongigi.

Bedaŭrinde, ĝi ne estas tiel simpla. Substantivoj en serba-kroata fleksias laŭ pli ol sole numero; ili fleksias ankaŭ laŭ genro kaj kazo. Tamen, ni alprenu por tiu ekzemplo ke la substantivo estas vira kaj en la nominativa kazo (kompleta ekzemplo troviĝas je la fino de tiu ĉi dokumento).

Sekve, ni devas difini parto por la paradigmoj:

<pardefs>

</pardefs>

kaj vortara parto:

<section id="main" type="standard">

</section>

Estas du tipoj de partoj:

  1. Standarda parto kiu enhavas vortojn, enklitojn (kiuj estas tipoj de postafiksoj), k.t.p.,
  2. Nestata parto kiu tipe enhavas interpunkcio k.t.p. Ni ne havas nestatn parton tie ĉi, kvankam ni vidos ĝin pli poste.

Do, nia dosiero devus nun aperi iom kiel:

<?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>

Nun ni havas la vortara ostaro kaj ni povas komenci per aldoni substantivon. Ni uzu 'gramofon' (kiuj signifas 'gramofono').

Pro tio ke ni havas neniun paradigmon, ni devas difini paradigmon.

Memoru ke ni alprenas ke substantivoj havas virajn genrojn kaj nominativajn kazojn. La singulara formo de la substantivo estas 'gramofon' kaj la plurala estas 'gramofoni'. Do:

<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>

Rimarku: la '<l/>' (egalvalora ol <l></l>) signifas ke ne estas pluaj aĵoj kiuj estas aldonota al la radiko de la singulara.

Tio ĉi eble ŝajnas kiel iom longa maniero por priskribi ĝin, sed estas bonaj rezonoj kaj ĝi iĝas baldaŭ pli naturan. Vi eble scivolas kion signifas la <e>,

, <l> kaj <r>. Nu:

  • e, signifas enskribigo.
  • p, signifas paron ("pair" en angla).
  • l, signifas maldekstro ("left" en angla).
  • r, signifas dekstro ("right" en angla).

Kiel dekstro kaj maldekstro? Nu, la morfemaj vortaroj estas kompilota al finiaj ŝtataj maŝinoj. Kompili tiujn ĉi de maldekstro al dekstro kreas analizojn el vortoj, kaj de dekstro al maldekstro kreas vortojn el analizoj. Ekzemple:

* gramofoni (maldekstro al dekstro) gramofon<n><pl> (analizo)
* gramofon<n><pl> (dekstro al maldekstro) gramofoni (vorto)

Nun, ni ĵus difinis paradigmon kaj ni devas ligi ĝin al sia lemo, gramafon. Ni metu tiun ĉi en la parto kiun ni difinis.

Oni devas meti la sekvan enskribon en </dictionary>

Nun ni devas aldoni enskribon por traduki inter du vortoj. Io kiel:

<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>

Pro tio ke ekzistas multaj da tiuj enskriboj, oni skribas ĝin je unu linio por faciligi lego de tiu ĉi dosiero. Denove, uzante la 'l' kaj 'r' ĉu ne? Nu, oni kompilas ĝin maldekstre al dekstre por fari la serba-kroatan → anglan vortaron kaj dekstre al maldekstre por fari la anglan → serba-kroatan vortaron.

Do, kiam vi faris ĝin, ruligu la sekvitajn ordonojn:

$ 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

Por generi la morfemajn analizilojn (automorf), la morfemajn generilojn (autogen) kaj la vortaj interrilataj tabloj (autobil), la "bil" estas por "bilingual" (t.e. dulingva).

Transiraj reguloj[edit]

Do, nun ni havas du morfemajn vortarojn, kaj dulingvan vortaron. Ni devas sole doni la transirajn regulojn por substantivoj. Transiraj regulaj dosieroj havas siajn proprajn DTD-on (transfer.dtd) kiujn oni povas trovi en la Apertium-a enpako. Se vi bezonas krei regulon, estas ofte bona ideo unue konsideri la regulajn dosierojn de aliaj lingvoparojn. Oni povas reuzi multe da reguloj inter malsamaj lingvoparoj. Ekzemple, la regulo malsupre estus utila por iu ajn nul-subjekta lingvo.

Komencu kiel ĉiuj da la aliaj kun baza ostaro:

<?xml version="1.0" encoding="UTF-8"?>
<transfer>

</transfer>

At the moment, because we're ignoring case, we just need to make a rule that takes the grammatical symbols input and outputs them again.

We first need to define categories and attributes. Categories and attributes both allow us to group grammatical symbols. Categories allow us to group symbols for the purposes of matching (for example 'n.*' is all nouns). Attributes allow us to group a set of symbols that can be chosen from. For example ('sg' and 'pl' may be grouped a an attribute 'number').

Lets add the necessary sections:

<section-def-cats>

</section-def-cats>
<section-def-attrs>

</section-def-attrs>

As we're only inflecting, nouns in singular and plural then we need to add a category for nouns, and with an attribute of number. Something like the following will suffice:

Into section-def-cats add:

<def-cat n="nom">
   <cat-item tags="n.*"/>
</def-cat>

This catches all nouns (lemmas followed by <n> then anything) and refers to them as "nom" (we'll see how thats used later).

Into the section section-def-attrs, add:

<def-attr n="nbr">
   <attr-item tags="sg"/>
   <attr-item tags="pl"/>
</def-attr>

and then

<def-attr n="a_nom">
   <attr-item tags="n"/>
</def-attr>

The first defines the attribute nbr (number), which can be either singular (sg) or plural (pl).

The second defines the attribute a_nom (attribute noun).

Next we need to add a section for global variables:

<section-def-vars>

</section-def-vars>

These variables are used to store or transfer attributes between rules. We need only one for now,

<def-var n="number"/>

Finally, we need to add a rule, to take in the noun and then output it in the correct form. We'll need a rules section...

<section-rules>

</section-rules>

Changing the pace from the previous examples, I'll just paste this rule, then go through it, rather than the other way round.

<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>

The first tag is obvious, it defines a rule. The second tag, pattern basically says: "apply this rule, if this pattern is found". In this example the pattern consists of a single noun (defined by the category item nom). Note that patterns are matched in a longest-match first. So if you have three rules, the first catches "<prn><vblex><n>", the second catches "<prn><vblex>" and the third catches "<n>", the pattern matched, and rule executed will be the first.

For each pattern, there is an associated action, which produces an associated output, out. The output, is a lexical unit (lu).

The clip tag allows a user to select and manipulate attributes and parts of the source language (side="sl"), or target language (side="tl") lexical item.

Let's compile it and test it. Transfer rules are compiled with:

$ apertium-preprocess-transfer apertium-sh-en.trules-sh-en.xml trules-sh-en.bin

Which will generate a trules-sh-en.bin file.

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.

Bring on the verbs[edit]

Ok, so we have a system that translates nouns, but thats pretty useless, we want to translate verbs too, and even whole sentences! How about we start with the verb to see. In Serbo-Croatian this is videti. Serbo-Croatian is a null-subject language, this means that it doesn't typically use personal pronouns before the conjugated form of the verb. English is not. So for example: I see in English would be translated as vidim in Serbo-Croatian.

  • Vidim
  • see<p1><sg>
  • I see

Note: <p1> denotes first person

This will be important when we come to write the transfer rule for verbs. Other examples of null-subject languages include: Spanish, Romanian and Polish. The also has the effect that while we only need to add the verb in the Serbo-Croatian morphological dictionary, we need to add both the verb, and the personal pronouns in the English morpohlogical dictionary. We'll go through both of these.

The other forms of the verb videti are: vidiš, vidi, vidimo, vidite, and vide; which correspond to: you see (singular), he sees, we see, you see (plural), and they see.

There are two forms of you see, one is plural and formal singular (vidite) and the other is singular and informal (vidiš).

We're going to try and translate the sentence: "Vidim gramofoni" into "I see gramophones". In the interests of space, we'll just add enough information to do the translation and will leave filling out the paradigms (adding the other conjugations of the verb) as an exercise to the reader.

The astute reader will have realised by this point that we can't just translate vidim gramofoni because it is not a grammatically correct sentence in Serbo-Croatian. The correct sentence would be vidim gramofone, as the noun takes the accusative case. We'll have to add that form too, no need to add the case information for now though, we just add it as another option for plural. So, just copy the 'e' block for 'i' and change the 'i' to 'e' there.

First thing we need to do is add some more symbols. We need to first add a symbol for 'verb', which we'll call "vblex" (this means lexical verb, as opposed to modal verbs and other types). Verbs have 'person', and 'tense' along with number, so lets add a couple of those aswell. We need to translate "I see", so for person we should add "p1", or 'first person', and for tense "pri", or 'present indicative'.

<sdef n="vblex"/>
<sdef n="p1"/>
<sdef n="pri"/>

After we've done this, the same with the nouns, we add a paradigm for the verb conjugation. The first line will be:

<pardef n="vid/eti__vblex">

The '/' is used to demarcate where the stems (the parts between the <l> </l> tags) are added to.

Then the inflection for first person singular:

<e>
   <p>
     <l>im</l>
     <r>eti<s n="vblex"/><s n="pri"/><s n="p1"/><s n="sg"/></r>
   </p>
</e>

The 'im' denotes the ending (as in 'vidim'), it is necessary to add 'eti' to the <r> section, as this will be chopped off by the definition. The rest is fairly straightforward, 'vblex' is lexical verb, 'pri' is present indicative tense, 'p1' is first person and 'sg' is singular. We can also add the plural which will be the same, except 'imo' instead of 'im' and 'pl' instead of 'sg'.

After this we need to add a lemma, paradigm mapping to the main section:

<e lm="videti"><i>vid</i><par n="vid/eti__vblex"/></e>

Note: the content of is the root, not the lemma.

Thats the work on the Serbo-Croatian dictionary done for now. Lets compile it then test it.

$ 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>$

Ok, so now we do the same for the English dictionary (remember to add the same symbol definitions here as you added to the Serbo-Croatian one).

The paradigm is:

<pardef n="s/ee__vblex">

because the past tense is 'saw'. Now, we can do one of two things, we can add both first and second person, but they are the same form. In fact, all forms (except third person singular) of the verb 'to see' are 'see'. So instead we make one entry for 'see' and give it only the 'pri' symbol.

<e>
   <p>
     <l>ee</l>
     <r>ee<s n="vblex"/><s n="pri"/></r>
   </p>
</e>

and as always, an entry in the main section:

<e lm="see"><i>s</i><par n="s/ee__vblex"/></e>

Then lets save, recompile and test:

$ 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>$

Now for the obligatory entry in the bilingual dictionary:

<e><p><l>videti<s n="vblex"/></l><r>see<s n="vblex"/></r></p></e>

(again, don't forget to add the sdefs from earlier)

And recompile:

$ 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

Now to test:

$ 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin 

^see<vblex><pri><p1><sg>$^@

We get the analysis passed through correctly, but when we try and generate a surface form from this, we get a '#', like below:

$ 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin | \
  lt-proc -g sh-en.autogen.bin
#see\@

This '#' means that the generator cannot generate the correct lexical form because it does not contain it. Why is this?

Basically the analyses don't match, the 'see' in the dictionary is see<vblex><pri>, but the see delivered by the transfer is see<vblex><pri><p1><sg>. The Serbo-Croatian side has more information than the English side requires. You can test this by adding the missing symbols to the English dictionary, and then recompiling, and testing again.

However, a more paradigmatic way of taking care of this is by writing a rule. So, we open up the rules file (apertium-sh-en.trules-sh-en.xml in case you forgot).

We need to add a new category for 'verb'.

<def-cat n="vrb">
   <cat-item tags="vblex.*"/>
</def-cat>

We also need to add attributes for tense and for person. We'll make it really simple for now, you can add p2 and p3, but I won't in order to save space.

<def-attr n="temps">
   <attr-item tags="pri"/>
</def-attr>

<def-attr n="pers">
   <attr-item tags="p1"/>
</def-attr>

We should also add an attribute for verbs.

<def-attr n="a_verb">
   <attr-item tags="vblex"/>
</def-attr>

Now onto the rule:

<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>

Remember when you tried commenting out the 'clip' tags in the previous rule example and they disappeared from the transfer, well, thats pretty much what we're doing here. We take in a verb with a full analysis, but only output a partial analysis (lemma + verb tag + tense tag).

So now, if we recompile that, we get:

$ 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin
^see<vblex><pri>$^@

and:

$ 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin | \
  lt-proc -g sh-en.autogen.bin
see\@

Try it with 'vidimo' (we see) to see if you get the correct output.

Now try it with "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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin | \
  lt-proc -g sh-en.autogen.bin
see gramophones\@

But what about personal pronouns?[edit]

Well, thats great, but we're still missing the personal pronoun that is necessary in English. In order to add it in, we first need to edit the English morphological dictionary.

As before, the first thing to do is add the necessary symbols:

<sdef n="prn"/>
<sdef n="subj"/>

Of the two symbols, prn is pronoun, and subj is subject (as in the subject of a sentence).

Because there is no root, or 'lemma' for personal subject pronouns, we just add the pardef as follows:

<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>

With 'prsubj' being 'personal subject'. The rest of them (You, We etc.) are left as an exercise to the reader.

We can add an entry to the main section as follows:

<e lm="personal subject pronouns"><i/><par n="prsubj__prn"/></e>

So, save, recompile and test, and we should get something like:

$ echo "I" | lt-proc en-sh.automorf.bin
^I/PRPERS<prn><subj><p1><sg>$

(Note: its in capitals because 'I' is in capitals).

Now we need to amend the 'verb' rule to output the subject personal pronoun along with the correct verb form.

First, add a category (this must be getting pretty pedestrian by now):

<def-cat n="prpers">
   <cat-item lemma="prpers" tags="prn.*"/>
</def-cat>

Now add the types of pronoun as attributes, we might as well add the 'obj' type as we're at it, although we won't need to use it for now:

<def-attr n="tipus_prn">
   <attr-item tags="prn.subj"/>
   <attr-item tags="prn.obj"/>
</def-attr>

And now to input the rule:

<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>

This is pretty much the same rule as before, only we made a couple of small changes.

We needed to output:

^prpers<prn><subj><p1><sg>$ ^see<vblex><pri>$

so that the generator could choose the right pronoun and the right form of the verb.

So, a quick rundown:

  • <lit>, prints a literal string, in this case "prpers"
  • <lit-tag>, prints a literal tag, because we can't get the tags from the verb, we add these ourself, "prn" for pronoun, and "subj" for subject.
  • , prints a blank, a space.

Note that we retrieved the information for number and tense directly from the verb.

So, now if we recompile and test that again:

$ 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin | \
  lt-proc -g sh-en.autogen.bin
I see gramophones

Which, while it isn't exactly prize-winning prose (much like this HOWTO), is a fairly accurate translation.

Do rakontu min pri la gramofono (Multvortoj)[edit]

Dum 'gramopone' estas angla vorto, ĝi ne estas la pli bona traduko. Oni uzas 'gramophone' tipe por la tre malnova speco kun la nadlo anstataŭ la grifelo kaj nenio plilaŭtigo. Pli bona traduko estus 'record player'. Kvankam oni havas pli ol unu vorto, ni povas trakti ĝin kvazaŭ estas unu vorto per uzi multvortajn (multipalabra) konstruojn.

Ni ne devas tuŝi la serba-kroatan vortaron - sole la anglan kaj dulingvan. Do malfermu ilin.

La pluralo de 'record player' estas 'record players', do ĝi uzas la saman paradigmon kiel 'gramophone' (gramophone__n); ni aldonu sole 's'. Nu, ni sole devu aldoni novan eron al la ĉefa sekcio.

<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e>

La sola aĵo kiu malsamas, estas la uzo de la etikedo, kvankam ĝi ne estas tute novo, pro tio ke ni vidis ĝin je la regla dosiero.

Nu, rekompilu kaj testu laŭ la ortodoksa maniero:

$ 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.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin  | \
  lt-proc -g sh-en.autogen.bin
I see record players

Bonege. Granda bono de la uzo de multvortoj estas ke oni povas traduki idiomajn esprimojn laŭvorte. Ekzemple, la angla frazo "at the moment" tradukus al serba-kroata kiel "trenutno"('trenutak' = moment kaj 'trenutno' estas adverba formo) — ne estus ebla traduki ĝin vorte-per-vorte al serba-kroata.

Dealing with minor variation[edit]

Serbo-Croatian typically has a few ways of writing each word because of dialectal variation. It has a cool phonetic writing system so you write how you speak. For example, people speaking in Ijekavian would say "rječnik", while someone speaking Ekavian would say "rečnik", which reflects the differences in pronunciation of the proto-Slavic vowel yat.

Analysis[edit]

There should be a fairly easy way of dealing with this, and there is, using paradigms again. Paradigms aren't only used for adding grammatical symbols, but they can also be used to replace any character/symbol with another. For example, here is a paradigm for accepting both "e" and "je" in the analysis. The paradigm should, as with the others go into the monolingual dictionary for Serbo-Croatian.

  <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>

Then in the "main section":

    <e lm="rečnik"><i>r</i><par n="e_je__yat"/><i>čni</i><par n="rečni/k__n"/></e>

This only allows us to analyse both forms however... more work is necessary if we want to generate both forms.

Generation[edit]

See also[edit]