Difference between revisions of "Sevel ur c'houblad yezhoù nevez"
(20 intermediate revisions by 2 users not shown) | |||
Line 17: | Line 17: | ||
* libxml utils (xmllint etc.) |
* libxml utils (xmllint etc.) |
||
* apertium (>= 3.0.0) |
* apertium (>= 3.0.0) |
||
* |
* un aozer testennoù (pe un aozer XML arbennikaet mar kavit gwell) |
||
Ne vo ket displeget war an teul-mañ ar pazennoù da staliañ ar pakadoù-se; gwelit rann deuliaouiñ lec'hienn Apertium evit se. |
Ne vo ket displeget war an teul-mañ ar pazennoù da staliañ ar pakadoù-se; gwelit rann deuliaouiñ lec'hienn Apertium evit se. |
||
Line 23: | Line 23: | ||
==Petra eo ur c'houblad yezhoù evit gwir ?== |
==Petra eo ur c'houblad yezhoù evit gwir ?== |
||
Ober a ra Apertium gant un doare treuzkas diwar-c'horre. Dre vras ez eo diazezet troidigezh ar c'hefluskler war geriadurioù ha brasreolennoù treuzkas. Disheñvel eo an doare treuzkas diwar-c'horre-se diouzh an treuzkas don pa ne gas ket da benn un dielfennadenn ereadurel klok. Savet eo ar reolennoù war strolladoù unanennoù geriadurel ha neket war un dielfennadenn dre wezennadur. |
|||
Apertium is a shallow-transfer type machine translation system. Thus, it basically works on dictionaries and shallow transfer rules. In operation, 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. At a basic level, there are three main dictionaries: |
|||
Tri fenngeriadur zo savet an traoù diwarno : |
|||
# 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 |
|||
# |
# Ur geriadur morfologel evit ar yezh xx : ennañ reolennoù deverañ ar gerioù er yezh xx. Er skouer roet ganeomp e vo anvet : apertium-sh-en.sh.dix |
||
# |
# Ur geriadur morfologel evit ar yezh yy : ennañ reolennoù deverañ ar gerioù er yezh yy. Er skouer roet ganeomp e vo anvet : apertium-sh-en.en.dix |
||
# Ur geriadur divyezhek : ennañ ar c'hevatalderioù etre gerioù hag arouezennoù en div yezh. Er skouer roet ganeomp e vo anvet : apertium-sh-en.sh-en.dix |
|||
En ur c'houblad treiñ e c'hall an div yezh bezañ yezh-tal pe yezh-kein tro-ha-tro. Termenoù relativel int, traken. |
|||
In a translation pair, both languages can be either source or target for translation, these are relative terms. |
|||
Div restr evit ar reolennoù teuzkas zo ivez. Enno emañ ar pennreolennoù evit merkañ urzh ar gerioù er frazennoù, evel petite chaise -> bihan kador -> kador vihan. Plediñ a ra ar reolennoù gant gour ha niver ar gerioù ivez. Gallout a reer ober gant ar reolennoù-se evit degas pe dilemel unanennoù geriadurel ivez, evel ma vo deskrivet traoñoc'h. Ar restroù-se zo : |
|||
There are also two files for transfer rules. These are the rules that 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: |
|||
* |
* reolennoù treuzkas ar yezh xx er yezh yy : er restr-mañ e kaver reolennoù war an doare da cheñch ar yezh xx er yezh yy. Er skouer roet ganeomp e vo anvet : apertium-sh-en.trules-sh-en.xml |
||
* |
* reolennoù treuzkas ar yezh yy er yezh xx : er restr-mañ e kaver reolennoù war an doare da cheñch ar yezh yy er yezh xx. Er skouer roet ganeomp e vo anvet : apertium-sh-en.trules-en-sh.xml |
||
Meur a goublad yezhoù a c'haller kaout dija a ra gant restroù all met ne vo ket graet anv anezho amañ. Ar re meneget amañ eo ar re nemeto zo ezhomm evit ma yafe ar reizhiad en-dro. |
|||
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. |
|||
==Koublad yezhoù== |
==Koublad yezhoù== |
||
Evel hoc'h eus gallet divinout dre anvioù ar restroù marteze, eo diazezet an dornlevr-mañ war skouerioù troidigezhioù eus ar serbkroateg d'ar saozneg, a-benn lakaat war-wel penaos krouiñ ur reizhiad diazez. N'eo ket hemañ ur c'houblad eus ar c'hentañ troc'h rak mont a ra gwelloc'h ar reizhiad en-dro gant koubladoù yezhoù kar-tost. Ne vern ket re koulskoude evit ar skouerioù eeun a vo roet amañ. |
|||
As may have been alluded to 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, since the system works better for more closely related languages. This shouldn't present a problem for the simple examples given here. |
|||
== |
==Notennig diwar-benn termenoù zo== |
||
Un toullad termenoù a rankit intent mat a-raok mont pelloc'h. |
|||
There are number of terms that will need to be understood before we continue. |
|||
Ar c'hentañ eo ''lemma''. Lemma a reer eus stumm ur ger n'eo ket deveret. Da skouer, lemma ar ger ''kizhier'' zo ''kazh''. Peurliesañ, e saozneg, ez eo lemma un anv-kadarn stumm ar ger en unander (e brezhoneg ivez). Evit ar verboù saoznek, e klot al lemma gant an anv-verb lamet outañ an ''to''; setu lemma ''was'' zo ''be''. |
|||
An eil eo an termen ''arouez''. E reizhiad Apertium e ra dave an termen arouez d'un dikedenn yezhadurel. Un anv-kadarn lies eo ar ger cats (kizhier e saozneg), setu e vo merket gant div dikedenn (arouezioù) : anv-kadarn ha stumm lies. Evit ma c'hallfe ar c'heflusker mont en-dro eo merket an arouezioù etre balizennoù konkellek, evel a-is : |
|||
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: |
|||
* <code><n></code>; |
* <code><n></code>; evit noun (anv-kadarn). |
||
* <code><pl></code>; |
* <code><pl></code>; evit plural (liester). |
||
Skouerioù arouezioù all zo, evel <sg>; unander, <p1> kentañ gour, <pri> amzer-vremañ, hag all. Gallout a reer ober tikedennoù eus an arouezioù skrivet etre konkelloù. Talvezout a ra ar boan notenniñ e klot termenadurioù ar c'houbladoù yezhoù hegerzh gant gwreskanvioù pe stummoù gerioù krennet e katalaneg alies (dre m'eo bet diorroet Apertium eno da gentañ). Da skouer, vbhaver — diwar vb (verb) hag haver ("kaout" e katalaneg). Termenet eo an arouezioù etre balizennoù <sdef> hag implijet etre balizennoù <nowiki><s></nowiki>. |
|||
An trede termen eo ''paradigm''. E reizhiad Apertium, e ra dave ar paradigm da zeveradurioù skouer ur strollad gerioù bennak. Er geriadur morfologel eo liammet al lemmaoù (gwelet a-us) ouzh paradigmoù a c'haller deskrivañ drezo pere eo deveradurioù ul lemma hep bezañ rediet da skrivañ an holl zibennoù-ger bep tro. |
|||
The third word is ''paradigm''. In the context of the Apertium system, paradigm refers to an example of how a particular group of words inflect. In the morphological dictionary, lemmas (see above) are linked to paradigms that allow us to describe how a given lemma inflects without having to write out all of the endings. |
|||
Da ziskouez pegen talvoudus eo kement-mañ, ma venner plediñ gant an daou anv-gwan ''happy'' ha ''lazy'', e-lec'h merkañ div wezh an hevelep tra : |
|||
* happy, happ (y, ier, iest) |
* happy, happ (y, ier, iest) |
||
* lazy, laz (y, ier, iest) |
* lazy, laz (y, ier, iest) |
||
E c'haller displegañ unan hepken ha neuze merkañ e teverer "lazy evel happy", "shy evel happy", "naughty evel", "friendly evel happy", hag all. Er skouer-mañ e vo happy ar paradigm, ar patrom a verk mod deverañ ar gerioù all. Displeget e vo berr-ha-berr deskrivadur pizh ar mod m'eo bet termenet. Termenet eo ar paradigmoù etre balizennoù <pardef>, hag implijet etre balizennoù <par>. |
|||
==Kregiñ ganti== |
==Kregiñ ganti== |
||
===Geriadurioù unyezhek=== |
===Geriadurioù unyezhek=== |
||
{{Gwelet-ivez|Roll geriadurioù|Goerezh}} |
|||
{{see-also|List of dictionaries|Incubator}} |
|||
Let's start by making our first source language dictionary. The dictionary is an XML file. Fire up your text editor and type the following: |
|||
Krogomp gant stummañ hor geriadur diazez kentañ. Ur restr XML a ya d'ober anezhañ. Digorit hoc'h aozer testennoù ha skrivit ennañ al linennoù da-heul : |
|||
<pre> |
<pre> |
||
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
||
Line 74: | Line 76: | ||
</dictionary> |
</dictionary> |
||
</pre> |
</pre> |
||
Setu, betek-hen eo termenet er restr e fell deomp boulc'hañ ur geriadur nevez. Evit ma c'hallfe talvezout d'un dra bennak e vo ret deomp ouzhpennañ boued e-barzh bremañ ha, da gentañ-penn, termeniñ al lizherenneg. Ar pezh zo da-heul a zermen an holl lizherennoù a gaver en ur geriadur serbkorateg. Tennañ a raio mui pe vui d'ar roll dindan, ennañ holl lizherennoù lizhereneg ar serbkroateg : |
|||
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: |
|||
<pre> |
<pre> |
||
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet> |
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet> |
||
</pre> |
</pre> |
||
Lakait al lizherenneg dindan ar valizenn <dictionary>. |
|||
Goude-se e ranker termeniñ arouezioù zo. Kroget e vo gant traoù eeun-tre evel anv-kadarn (n) en unander (sg) hag el liester (pl). |
|||
<pre> |
<pre> |
||
<sdefs> |
<sdefs> |
||
Line 89: | Line 91: | ||
</sdefs> |
</sdefs> |
||
</pre> |
</pre> |
||
Gallout a rit skrivañ an arouezioù en o hed (n'eo ket ret ober gant ar berradurioù) met dre ma vo ret deoc'h skrivañ anezho kalz eo emsav-kenañ ober gant berradurioù. |
|||
The symbol names do not have to be so small, in fact, they could just be written out in full, but as you'll be typing them a lot, it makes sense to abbreviate. |
|||
Siwazh n'eo ket ken eeun an traoù. E serbkorateg e teverer an anvioù estreget evit o niver. Displeget e vezont ivez diouzh o jener ha diouzh an dro. Koulskoude, just evit ar skouer-mañ e raimp e-giz pa vije gourel an anv-kadarn hag en nominativ (ur skouer glok a vo kavet e traoñ an teul-mañ). |
|||
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). |
|||
Da c'houde e chom da dermeniñ ur rann evit merkañ ar paradigm, |
|||
The next thing is to define a section for the paradigms, |
|||
<pre> |
<pre> |
||
<pardefs> |
<pardefs> |
||
Line 99: | Line 101: | ||
</pardefs> |
</pardefs> |
||
</pre> |
</pre> |
||
hag ur rann c'heriadurel : |
|||
and a dictionary section: |
|||
<pre> |
<pre> |
||
<section id="main" type="standard"> |
<section id="main" type="standard"> |
||
Line 105: | Line 107: | ||
</section> |
</section> |
||
</pre> |
</pre> |
||
Daou seurt rann zo, ur rann voutin enni gerioù, enklitikoù, hag all hag ur rann dibar enni traoù a denn d'ar poentadur da skouer. Ne vo ket spisaet a rann dibar amañ, diskouezet e vo pelloc'h. |
|||
There are two types of sections, the first is a standard section, that contains words, enclitics, etc. The second type is an inconditional section which typically contains punctuation, and so forth. We don't have an inconditional section here, although it will be demonstrated later. |
|||
Setu e tlefe hor restr kaout an tres-mañ a-benn bremañ : |
|||
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 124: | Line 126: | ||
</dictionary> |
</dictionary> |
||
</pre> |
</pre> |
||
Setu m'emañ staliet ar c'horf-eskern, gallout a reomp kregiñ ganti hag ouzhpennañ un anv-kadarn. Skrivet e vo 'gramofon' (ar pezh a dalvez 'sonskriver' pe 'troer-pladennoù'). |
|||
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'). |
|||
Tra gentañ zo d'ober pa n'eus ket a baradigm eo termeniñ unan. |
|||
The first thing we need to do, as we have no prior paradigms, is to define a paradigm. |
|||
Ho pet soñj, lavaret hon eus ger gourel en nominativ. Stumm gourel ar ger eo 'gramofon', hag e liester 'gramofoni'. Neuze : |
|||
<pre> |
<pre> |
||
<pardef n="gramofon__n"> |
<pardef n="gramofon__n"> |
||
Line 145: | Line 147: | ||
</pardef> |
</pardef> |
||
</pre> |
</pre> |
||
Notenn : merkañ a ra an '<l/>' (par da <l></l>) n'eus mann ebet all da vezañ ouzhpennet ouzh ar wrizienn evit an unander. |
|||
Un doare deskrivañ peurglok ha pounner-mat e seblant hemañ bezañ marteze met abegoù zo da gement-se ha fonnus a-walc'h ho po paket an doare. Sur a-walc'h en em c'houlennit evit petra eo an <e>, <p>, <l> hag an <r>. Setu aze, |
|||
This may seem like a rather verbose way of describing it, but there are reasons for this and it quickly becomes second nature. You're probably wondering what the <e>, <p>, <l> and <r> stand for. Well, |
|||
* e, |
* e, zo evit enmont (entry). |
||
* p, |
* p, zo evit koublad (pair). |
||
* l, |
* l, zo evit kleiz (left). |
||
* r, |
* r, zo evit dehou (right). |
||
Perak 'ta kleiz ha dehou ? Ma, diwezhatoc'h e vo daspunet ar geriadurioù morfologel en ardivinkoù echu o stad. Daspunañ anezho a-gleiz da zehou a brodu dielfennadurioù adalek gerioù, hag a zehou da gleiz a brodu gerioù adalek dielfennadurioù. Da skouer : |
|||
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 ( |
* gramofoni (a gleiz da zehou) gramofon<n><pl> (dielfennadur) |
||
* gramofon<n><pl> ( |
* gramofon<n><pl> (a zehou da gleiz) gramofoni (ganadur) |
||
</pre> |
</pre> |
||
Bremañ m'hon eus termenet ur paradigm, eo ret deomp e liammañ ouzh e lemma, gramofon. Lakaet e vo er rann spisaet ganeomp. |
|||
Setu pehini a vo tres an enmont lakaer er <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> |
||
Un adsell prim war ar berradurioù : |
|||
A quick run down on the abbreviations: |
|||
* lm, |
* lm, zo evit lemma. |
||
* i, |
* i, zo evit identelezh (heñvel eo kleiz ha dehou). |
||
* par, |
* par, zo evit paradigm. |
||
Merkañ a ra an enmont lemma ar ger, gramofon, ar wrizienn, gramofon hag ar paradigm emañ ar ger dindanañ gramofon__n. Setu an diforc'h etre al lemma hag ar wrizienn : Al lemma zo stumm meneget ur ger tra m'eo ar wrizienn un ischadenn eus al lemma ouzhpennet skodoù outi. Sklaeroc'h e vo diwezhatoc'h pa vo diskouezet un enmont ma vo disheñvel an daou. |
|||
Prest omp bremañ da destiñ ar geriadur. Enrollit-eñ ha distroit d'un etrefas dre linennoù urzhadoù. Ret e deomp e zaspunañ da gentañ (gant lt-comp), ha goude-se e destiñ (gant 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> |
||
a zlefe produiñ an ezvont : |
|||
Should produce the output: |
|||
<pre> |
<pre> |
||
main@standard 12 12 |
main@standard 12 12 |
||
</pre> |
</pre> |
||
evel m'emaomp o taspugn a gleiz da zehou emaomp o produiñ un dielfenner. Savomp ur ganer bremañ. |
|||
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> |
||
Degouezhet d'ar stad-mañ e tlefe an urzhad produiñ an hevelep ezvont. |
|||
At this stage, the command should produce the same output. |
|||
Gallout a reomp testiñ an dra-se bremañ. Lañsit lt-proc war an dielfenner. |
|||
<pre> |
<pre> |
||
$ lt-proc sh-en.automorf.bin |
$ lt-proc sh-en.automorf.bin |
||
</pre> |
</pre> |
||
Bremañ, grit un taol-esae, skrivit gramofoni (gramofonoù), ha sellit ouzh an ezvont : |
|||
<pre> |
<pre> |
||
^gramofoni/gramofon<n><pl>$ |
^gramofoni/gramofon<n><pl>$ |
||
</pre> |
</pre> |
||
Bremañ, grit an hevelep tra evit ar geriadur saozneg, hag erlerc'hiit ar ger saoznek gramophone gant gramofon, ha cheñchit deveradur al liester. Ha petra mar fell deoc'h implijout an termen azasoc'h 'record player' (troer-pladennoù) ? Ma, displeget e vo diwezhatoc'h penaos en ober. |
|||
Setu e tlefec'h kaout div restr er c'havlec'h bremañ : |
|||
You should now have two files in the directory: |
|||
* apertium-sh-en.sh.dix |
* apertium-sh-en.sh.dix enni ur geriadur morfologel serbkroatek diazez(-kenañ), hag |
||
* apertium-sh-en.en.dix |
* apertium-sh-en.en.dix enni ur geriadur morfologel saoznek diazez(-kenañ). |
||
===Geriadurioù divyezhek=== |
===Geriadurioù divyezhek=== |
||
Setu hon eus bremañ daou c'heriadur morfologel. Ar bazenn war-lerc'h zo sevel ar geriadur divyezhek ma teskriver al liammoù etre gerioù an div yezh. Ober a ra an holl c'heriadurioù gant an hevelep furmad (hag a zo spisaet en DTD, dix.dtd). |
|||
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). |
|||
Savit ur restr nevez, apertium-sh-en.sh-en.dix hag ouzhpennit enni ar c'horf-eskern diazez : |
|||
<pre> |
<pre> |
||
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
||
Line 222: | Line 224: | ||
</dictionary> |
</dictionary> |
||
</pre> |
</pre> |
||
Bremañ ez eus da lakaat ennañ un enmont evit an treiñ etre an daou c'her. Un dra bennak evel : |
|||
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> |
||
Skrivet eo an enmontoù-se war ul linenn hepken rak dre ma vo ur bern anezho e vint aesoc'h da lenn evel-se. C'hoazh gant an 'l' hag an 'r'. Daspunañ a reomp anezhañ a gleiz da zehou evit krouiñ ur geriadur serbkroateg → saozneg, hag a zehou da gleiz evit sevel unan saozneg → serbkroateg. |
|||
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. |
|||
Ur wezh m'eo graet, lañsit an urzhadoù da-heul : |
|||
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. |
$ 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. |
$ 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> |
||
Krouiñ a reer evel-se un dielfenner morfologel (automorf), ur ganer morfologel (autogen) hag ur c'hlasker gerioù (autobil); bil zo evit "bilingual" (divyezhek). |
|||
===Treuzkas reolennoù=== |
===Treuzkas reolennoù=== |
||
Ma, bremañ hon eus daou c'heriadur morfologel hag ur geriadur divyezhek. Ar pezh a vank eo ur reolenn treuzkas evit an anvioù-kadarn. Restroù DTD eo ar restroù reolennoù treuzkas (transfer.dtd) a c'haller kaout e pakad Apertium. Mar fell deoc'h enplementañ ur reolenn eo fur mont da sellet e restroù reolennoù koubladoù yezhoù all, da gentañ. Kalz reolennoù a c'hall bezañ adimplijet/azasaet evit yezhoù all. Da skouer e vo talvoudus ar reolenn da-heul evit an holl yezhoù n'o deus ket ezhomm rener ebet. |
|||
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. |
|||
Eilit ar patrom evel er restroù all : |
|||
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 252: | Line 254: | ||
</transfer> |
</transfer> |
||
</pre> |
</pre> |
||
D'an ampoent, p'hon eus divizet lezel a-gostez an troioù yezhadurel e vo trawalc'h sevel ur reolenn a dap an arouezioù yezhadurel evel enmontoù hag a dreuzfurm anezho en ezvontoù. |
|||
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. |
|||
Da gentañ ez eus da dermeniñ ar rummadoù hag an doareennoù. Aotren a ra ar rummadoù hag an doareennoù strollañ arouezioù yezhadurel. Talvezout a ra ar rummadoù da strollañ arouezioù evit o c'houblañ ivez (da skouer 'n.*' zo evit an holl anvioù). Servijout a ra an doareennoù da strollañ rummoù arouezioù ma c'haller ober un dibab en o zouez. Da skouer ('sg' ha 'pl' a c'hall bezañ strollet dindan an doareenn 'niver'). |
|||
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'). |
|||
Ouzhpennomp bremañ ar rannoù zo ezhomm : |
|||
Lets add the necessary sections: |
|||
<pre> |
<pre> |
||
<section-def-cats> |
<section-def-cats> |
||
Line 265: | Line 267: | ||
</section-def-attrs> |
</section-def-attrs> |
||
</pre> |
</pre> |
||
Dre ma ne zeveromp an anvioù-kadarn nemet dre o niver (unander pe liester) hon eus ezhomm da ouzhpennañ ur rummad evit an anvioù, dezhañ un doareenn niver. Un dra bennak evel ar pezh zo da-heul : |
|||
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: |
|||
Ouzhpennañ er rann section-def-cats : |
|||
<pre> |
<pre> |
||
<def-cat n="nom"> |
<def-cat n="nom"> |
||
Line 273: | Line 275: | ||
</def-cat> |
</def-cat> |
||
</pre> |
</pre> |
||
Pakañ a ra an holl anvioù (lemmaoù heuliet gant <n> pe gant ne vern pe tra all) hag ober a ra "nom" outo (gwelet a raimp petra ober gant se war-lerc'h). |
|||
This catches all nouns (lemmas followed by <n> then anything) and refers to them as "nom" (we'll see how thats used later). |
|||
Ouzhpennañ er rann section-def-attrs : |
|||
<pre> |
<pre> |
||
<def-attr n="nbr"> |
<def-attr n="nbr"> |
||
Line 282: | Line 284: | ||
</def-attr> |
</def-attr> |
||
</pre> |
</pre> |
||
ha neuze |
|||
and then |
|||
<pre> |
<pre> |
||
<def-attr n="a_nom"> |
<def-attr n="a_nom"> |
||
Line 288: | Line 290: | ||
</def-attr> |
</def-attr> |
||
</pre> |
</pre> |
||
Er c'hentañ e termener an doareenn nbr (niver), a c'hall bezañ pe unan (sg) pe lies (pl). |
|||
An eil a dermen an doareenn a_nom (doareenn anv). |
|||
Da c'houde eo ret ouzhpennañ ur rann evit an argemmoù hollek : |
|||
Next we need to add a section for global variables: |
|||
<pre> |
<pre> |
||
<section-def-vars> |
<section-def-vars> |
||
Line 298: | Line 300: | ||
</section-def-vars> |
</section-def-vars> |
||
</pre> |
</pre> |
||
Implijout a reer an argemmoù-mañ da virout pe da dreuzkas doareennoù etre reolennoù. N'eus ezhomm nemet unan anezho evit ar mare, |
|||
These variables are used to store or transfer attributes between rules. We need only one for now, |
|||
<pre> |
<pre> |
||
<def-var n="number"/> |
<def-var n="number"/> |
||
</pre> |
</pre> |
||
Er fin, e faot ouzhpennañ ur reolenn a dapo an anv hag a savo un ezvont er furmad reizh. Ezhomm zo ur rann reolennoù... |
|||
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... |
|||
<pre> |
<pre> |
||
<section-rules> |
<section-rules> |
||
Line 308: | Line 310: | ||
</section-rules> |
</section-rules> |
||
</pre> |
</pre> |
||
Evit cheñch tu e-keñver ar skouerioù kent e pegin ar reolenn-mañ, ha mont drezi, kentoc'h eget an tu kontrol. |
|||
Changing the pace from the previous examples, I'll just paste this rule, then go through it, rather than the other way round. |
|||
<pre> |
<pre> |
||
<rule> |
<rule> |
||
Line 326: | Line 328: | ||
</pre> |
</pre> |
||
Anat eo an dikedenn gentañ, termeniñ a ra ur reolenn. An eil, ar patrom a lavar dreist-holl : "laka a reolenn-mañ e pleustr ma kaver ar patrom-mañ". Er skouer-mañ ez a un anv-kadarn eeun d'ober ar patrom (termenet gant ar rummad nom). Notennit e klot ar patromoù gant an disoc'hoù hirañ da gentañ. Setu m'hoc'h eus teir reolenn, ar gentañ a dap "<prn><vblex><n>", an eil "<prn><vblex>" hag an drede "<n>", e vo sevenet ar reolenn gentañ da gentañ. |
|||
Pep patrom a glot gant un ober a grou un ezvont bennak a glot gantañ. Un unanenn c'heriadurel (lexical unit (lu)) eo an ezvont-se. |
|||
Dre ar valizenn "clip" e c'hall an implijer diuzañ ha merañ doareennoù hag itemoù geriadurel eus ar yezh-kein (side="sl"), pe eus ar yezh-tal (side="tl"). |
|||
Dapugnomp ha testomp an traoù. Daspugnet eo ar reolennoù trezkas gant : |
|||
Let's compile it and test it. Transfer rules are compiled with: |
|||
<pre> |
<pre> |
||
$ apertium-preprocess-transfer apertium-sh-en.trules-sh-en.xml trules-sh-en.bin |
$ apertium-preprocess-transfer apertium-sh-en.trules-sh-en.xml trules-sh-en.bin |
||
</pre> |
</pre> |
||
a grouo ur restr trules-sh-en.bin. |
|||
Setu bremañ emaomp prest da destiñ hor reizhiad treiñ emgefre. Mankout a ra c'hoazh un tamm hollbouezus, an tikedenner bommoù lavar (part-of-speech (PoS)) met displeget e vo berr-ha-berr traoñoc'h. Da c'hortoz e c'hallomp testiñ anezhañ evel m'emañ : |
|||
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: |
|||
Da gentañ, dielfennomp ur ger, gramofoni: |
|||
<pre> |
<pre> |
||
$ echo "gramofoni" | lt-proc sh-en.automorf.bin |
$ echo "gramofoni" | lt-proc sh-en.automorf.bin |
||
Line 669: | Line 671: | ||
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. |
||
==Ha petra gant ar |
==Ha petra gant ar sonskriver (Liesgerioù)== |
||
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. |
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. |
||
Line 729: | Line 731: | ||
*[[Building dictionaries]] |
*[[Building dictionaries]] |
||
*[[Finding_errors_in_dictionaries]] |
|||
*[[Cookbook]] |
|||
*[[Chunking]] |
|||
*[[Contributing to an existing pair]] |
|||
[[Category:Documentation]] |
[[Category:Documentation]] |
||
[[Category:HOWTO]] |
[[Category:HOWTO]] |
||
[[Category:Writing dictionaries]] |
|||
[[Category:Quickstart]] |
Latest revision as of 07:14, 16 February 2015
Dornlevr Apertium evit sevel koubladoù nevez etre yezhoù disheñvel.
Deskrivet e vo en teul-mañ ar pazennoù rekis a-benn sevel ur c'houblad yezhoù nevez evit meziant treiñ emgefre Apertium, adal ar penn-kentañ.
Estreget bezañ gouest da ziforc'hañ anvioù-kadarn diouzh verboù (ha diouzh araogennoù, hag all), n'eo ket ret bezañ desket-bras war ar yezhoniezh na war an treiñ emgefre.
Rakger[edit]
Ur savenn treiñ emgefre eo Apertium. Pourchas a ra ur c'heflusker hag ostilhoù a c'hallot drezo sevel ho reizhiad treiñ deoc'h-c'hwi hoc'h-unan. An dra nemetañ hoc'h eus da zegas eo ar roadennoù. Ar roadennoù zo anezho, da gregiñ ganti, tri geriadur hag un nebeud reolennoù (evit plediñ gant urzh ar gerioù ha reolennoù yezhadurel a seurt-se).
Evit lenn pelloc'h war ar penaos ez a en-dro ez eus teulioù a-zoare war lec'hienn ar raktres apertium.sourceforge.net.
Ezhomm ho po[edit]
- lttoolbox (>= 3.0.0)
- libxml utils (xmllint etc.)
- apertium (>= 3.0.0)
- un aozer testennoù (pe un aozer XML arbennikaet mar kavit gwell)
Ne vo ket displeget war an teul-mañ ar pazennoù da staliañ ar pakadoù-se; gwelit rann deuliaouiñ lec'hienn Apertium evit se.
Petra eo ur c'houblad yezhoù evit gwir ?[edit]
Ober a ra Apertium gant un doare treuzkas diwar-c'horre. Dre vras ez eo diazezet troidigezh ar c'hefluskler war geriadurioù ha brasreolennoù treuzkas. Disheñvel eo an doare treuzkas diwar-c'horre-se diouzh an treuzkas don pa ne gas ket da benn un dielfennadenn ereadurel klok. Savet eo ar reolennoù war strolladoù unanennoù geriadurel ha neket war un dielfennadenn dre wezennadur. Tri fenngeriadur zo savet an traoù diwarno :
- Ur geriadur morfologel evit ar yezh xx : ennañ reolennoù deverañ ar gerioù er yezh xx. Er skouer roet ganeomp e vo anvet : apertium-sh-en.sh.dix
- Ur geriadur morfologel evit ar yezh yy : ennañ reolennoù deverañ ar gerioù er yezh yy. Er skouer roet ganeomp e vo anvet : apertium-sh-en.en.dix
- Ur geriadur divyezhek : ennañ ar c'hevatalderioù etre gerioù hag arouezennoù en div yezh. Er skouer roet ganeomp e vo anvet : apertium-sh-en.sh-en.dix
En ur c'houblad treiñ e c'hall an div yezh bezañ yezh-tal pe yezh-kein tro-ha-tro. Termenoù relativel int, traken.
Div restr evit ar reolennoù teuzkas zo ivez. Enno emañ ar pennreolennoù evit merkañ urzh ar gerioù er frazennoù, evel petite chaise -> bihan kador -> kador vihan. Plediñ a ra ar reolennoù gant gour ha niver ar gerioù ivez. Gallout a reer ober gant ar reolennoù-se evit degas pe dilemel unanennoù geriadurel ivez, evel ma vo deskrivet traoñoc'h. Ar restroù-se zo :
- reolennoù treuzkas ar yezh xx er yezh yy : er restr-mañ e kaver reolennoù war an doare da cheñch ar yezh xx er yezh yy. Er skouer roet ganeomp e vo anvet : apertium-sh-en.trules-sh-en.xml
- reolennoù treuzkas ar yezh yy er yezh xx : er restr-mañ e kaver reolennoù war an doare da cheñch ar yezh yy er yezh xx. Er skouer roet ganeomp e vo anvet : apertium-sh-en.trules-en-sh.xml
Meur a goublad yezhoù a c'haller kaout dija a ra gant restroù all met ne vo ket graet anv anezho amañ. Ar re meneget amañ eo ar re nemeto zo ezhomm evit ma yafe ar reizhiad en-dro.
Koublad yezhoù[edit]
Evel hoc'h eus gallet divinout dre anvioù ar restroù marteze, eo diazezet an dornlevr-mañ war skouerioù troidigezhioù eus ar serbkroateg d'ar saozneg, a-benn lakaat war-wel penaos krouiñ ur reizhiad diazez. N'eo ket hemañ ur c'houblad eus ar c'hentañ troc'h rak mont a ra gwelloc'h ar reizhiad en-dro gant koubladoù yezhoù kar-tost. Ne vern ket re koulskoude evit ar skouerioù eeun a vo roet amañ.
Notennig diwar-benn termenoù zo[edit]
Un toullad termenoù a rankit intent mat a-raok mont pelloc'h.
Ar c'hentañ eo lemma. Lemma a reer eus stumm ur ger n'eo ket deveret. Da skouer, lemma ar ger kizhier zo kazh. Peurliesañ, e saozneg, ez eo lemma un anv-kadarn stumm ar ger en unander (e brezhoneg ivez). Evit ar verboù saoznek, e klot al lemma gant an anv-verb lamet outañ an to; setu lemma was zo be.
An eil eo an termen arouez. E reizhiad Apertium e ra dave an termen arouez d'un dikedenn yezhadurel. Un anv-kadarn lies eo ar ger cats (kizhier e saozneg), setu e vo merket gant div dikedenn (arouezioù) : anv-kadarn ha stumm lies. Evit ma c'hallfe ar c'heflusker mont en-dro eo merket an arouezioù etre balizennoù konkellek, evel a-is :
<n>
; evit noun (anv-kadarn).<pl>
; evit plural (liester).
Skouerioù arouezioù all zo, evel <sg>; unander, <p1> kentañ gour, <pri> amzer-vremañ, hag all. Gallout a reer ober tikedennoù eus an arouezioù skrivet etre konkelloù. Talvezout a ra ar boan notenniñ e klot termenadurioù ar c'houbladoù yezhoù hegerzh gant gwreskanvioù pe stummoù gerioù krennet e katalaneg alies (dre m'eo bet diorroet Apertium eno da gentañ). Da skouer, vbhaver — diwar vb (verb) hag haver ("kaout" e katalaneg). Termenet eo an arouezioù etre balizennoù <sdef> hag implijet etre balizennoù <s>.
An trede termen eo paradigm. E reizhiad Apertium, e ra dave ar paradigm da zeveradurioù skouer ur strollad gerioù bennak. Er geriadur morfologel eo liammet al lemmaoù (gwelet a-us) ouzh paradigmoù a c'haller deskrivañ drezo pere eo deveradurioù ul lemma hep bezañ rediet da skrivañ an holl zibennoù-ger bep tro.
Da ziskouez pegen talvoudus eo kement-mañ, ma venner plediñ gant an daou anv-gwan happy ha lazy, e-lec'h merkañ div wezh an hevelep tra :
- happy, happ (y, ier, iest)
- lazy, laz (y, ier, iest)
E c'haller displegañ unan hepken ha neuze merkañ e teverer "lazy evel happy", "shy evel happy", "naughty evel", "friendly evel happy", hag all. Er skouer-mañ e vo happy ar paradigm, ar patrom a verk mod deverañ ar gerioù all. Displeget e vo berr-ha-berr deskrivadur pizh ar mod m'eo bet termenet. Termenet eo ar paradigmoù etre balizennoù <pardef>, hag implijet etre balizennoù <par>.
Kregiñ ganti[edit]
Geriadurioù unyezhek[edit]
- Gwelet ivez: Roll geriadurioù and Goerezh
Krogomp gant stummañ hor geriadur diazez kentañ. Ur restr XML a ya d'ober anezhañ. Digorit hoc'h aozer testennoù ha skrivit ennañ al linennoù da-heul :
<?xml version="1.0" encoding="UTF-8"?> <dictionary> </dictionary>
Setu, betek-hen eo termenet er restr e fell deomp boulc'hañ ur geriadur nevez. Evit ma c'hallfe talvezout d'un dra bennak e vo ret deomp ouzhpennañ boued e-barzh bremañ ha, da gentañ-penn, termeniñ al lizherenneg. Ar pezh zo da-heul a zermen an holl lizherennoù a gaver en ur geriadur serbkorateg. Tennañ a raio mui pe vui d'ar roll dindan, ennañ holl lizherennoù lizhereneg ar serbkroateg :
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>
Lakait al lizherenneg dindan ar valizenn <dictionary>.
Goude-se e ranker termeniñ arouezioù zo. Kroget e vo gant traoù eeun-tre evel anv-kadarn (n) en unander (sg) hag el liester (pl).
<sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs>
Gallout a rit skrivañ an arouezioù en o hed (n'eo ket ret ober gant ar berradurioù) met dre ma vo ret deoc'h skrivañ anezho kalz eo emsav-kenañ ober gant berradurioù.
Siwazh n'eo ket ken eeun an traoù. E serbkorateg e teverer an anvioù estreget evit o niver. Displeget e vezont ivez diouzh o jener ha diouzh an dro. Koulskoude, just evit ar skouer-mañ e raimp e-giz pa vije gourel an anv-kadarn hag en nominativ (ur skouer glok a vo kavet e traoñ an teul-mañ).
Da c'houde e chom da dermeniñ ur rann evit merkañ ar paradigm,
<pardefs> </pardefs>
hag ur rann c'heriadurel :
<section id="main" type="standard"> </section>
Daou seurt rann zo, ur rann voutin enni gerioù, enklitikoù, hag all hag ur rann dibar enni traoù a denn d'ar poentadur da skouer. Ne vo ket spisaet a rann dibar amañ, diskouezet e vo pelloc'h.
Setu e tlefe hor restr kaout an tres-mañ a-benn bremañ :
<?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>
Setu m'emañ staliet ar c'horf-eskern, gallout a reomp kregiñ ganti hag ouzhpennañ un anv-kadarn. Skrivet e vo 'gramofon' (ar pezh a dalvez 'sonskriver' pe 'troer-pladennoù').
Tra gentañ zo d'ober pa n'eus ket a baradigm eo termeniñ unan.
Ho pet soñj, lavaret hon eus ger gourel en nominativ. Stumm gourel ar ger eo 'gramofon', hag e liester 'gramofoni'. Neuze :
<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>
Notenn : merkañ a ra an '<l/>' (par da <l></l>) n'eus mann ebet all da vezañ ouzhpennet ouzh ar wrizienn evit an unander.
Un doare deskrivañ peurglok ha pounner-mat e seblant hemañ bezañ marteze met abegoù zo da gement-se ha fonnus a-walc'h ho po paket an doare. Sur a-walc'h en em c'houlennit evit petra eo an <e>,
, <l> hag an <r>. Setu aze,
- e, zo evit enmont (entry).
- p, zo evit koublad (pair).
- l, zo evit kleiz (left).
- r, zo evit dehou (right).
Perak 'ta kleiz ha dehou ? Ma, diwezhatoc'h e vo daspunet ar geriadurioù morfologel en ardivinkoù echu o stad. Daspunañ anezho a-gleiz da zehou a brodu dielfennadurioù adalek gerioù, hag a zehou da gleiz a brodu gerioù adalek dielfennadurioù. Da skouer :
* gramofoni (a gleiz da zehou) gramofon<n><pl> (dielfennadur) * gramofon<n><pl> (a zehou da gleiz) gramofoni (ganadur)
Bremañ m'hon eus termenet ur paradigm, eo ret deomp e liammañ ouzh e lemma, gramofon. Lakaet e vo er rann spisaet ganeomp.
Setu pehini a vo tres an enmont lakaer er </dictionary>
Bremañ ez eus da lakaat ennañ un enmont evit an treiñ etre an daou c'her. Un dra bennak evel :
<e><p><l>gramofon<s n="n"/></l><r>gramophone<s n="n"/></r></p></e>
Skrivet eo an enmontoù-se war ul linenn hepken rak dre ma vo ur bern anezho e vint aesoc'h da lenn evel-se. C'hoazh gant an 'l' hag an 'r'. Daspunañ a reomp anezhañ a gleiz da zehou evit krouiñ ur geriadur serbkroateg → saozneg, hag a zehou da gleiz evit sevel unan saozneg → serbkroateg.
Ur wezh m'eo graet, lañsit an urzhadoù da-heul :
$ 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
Krouiñ a reer evel-se un dielfenner morfologel (automorf), ur ganer morfologel (autogen) hag ur c'hlasker gerioù (autobil); bil zo evit "bilingual" (divyezhek).
Treuzkas reolennoù[edit]
Ma, bremañ hon eus daou c'heriadur morfologel hag ur geriadur divyezhek. Ar pezh a vank eo ur reolenn treuzkas evit an anvioù-kadarn. Restroù DTD eo ar restroù reolennoù treuzkas (transfer.dtd) a c'haller kaout e pakad Apertium. Mar fell deoc'h enplementañ ur reolenn eo fur mont da sellet e restroù reolennoù koubladoù yezhoù all, da gentañ. Kalz reolennoù a c'hall bezañ adimplijet/azasaet evit yezhoù all. Da skouer e vo talvoudus ar reolenn da-heul evit an holl yezhoù n'o deus ket ezhomm rener ebet.
Eilit ar patrom evel er restroù all :
<?xml version="1.0" encoding="UTF-8"?> <transfer> </transfer>
D'an ampoent, p'hon eus divizet lezel a-gostez an troioù yezhadurel e vo trawalc'h sevel ur reolenn a dap an arouezioù yezhadurel evel enmontoù hag a dreuzfurm anezho en ezvontoù.
Da gentañ ez eus da dermeniñ ar rummadoù hag an doareennoù. Aotren a ra ar rummadoù hag an doareennoù strollañ arouezioù yezhadurel. Talvezout a ra ar rummadoù da strollañ arouezioù evit o c'houblañ ivez (da skouer 'n.*' zo evit an holl anvioù). Servijout a ra an doareennoù da strollañ rummoù arouezioù ma c'haller ober un dibab en o zouez. Da skouer ('sg' ha 'pl' a c'hall bezañ strollet dindan an doareenn 'niver').
Ouzhpennomp bremañ ar rannoù zo ezhomm :
<section-def-cats> </section-def-cats> <section-def-attrs> </section-def-attrs>
Dre ma ne zeveromp an anvioù-kadarn nemet dre o niver (unander pe liester) hon eus ezhomm da ouzhpennañ ur rummad evit an anvioù, dezhañ un doareenn niver. Un dra bennak evel ar pezh zo da-heul :
Ouzhpennañ er rann section-def-cats :
<def-cat n="nom"> <cat-item tags="n.*"/> </def-cat>
Pakañ a ra an holl anvioù (lemmaoù heuliet gant <n> pe gant ne vern pe tra all) hag ober a ra "nom" outo (gwelet a raimp petra ober gant se war-lerc'h).
Ouzhpennañ er rann section-def-attrs :
<def-attr n="nbr"> <attr-item tags="sg"/> <attr-item tags="pl"/> </def-attr>
ha neuze
<def-attr n="a_nom"> <attr-item tags="n"/> </def-attr>
Er c'hentañ e termener an doareenn nbr (niver), a c'hall bezañ pe unan (sg) pe lies (pl).
An eil a dermen an doareenn a_nom (doareenn anv).
Da c'houde eo ret ouzhpennañ ur rann evit an argemmoù hollek :
<section-def-vars> </section-def-vars>
Implijout a reer an argemmoù-mañ da virout pe da dreuzkas doareennoù etre reolennoù. N'eus ezhomm nemet unan anezho evit ar mare,
<def-var n="number"/>
Er fin, e faot ouzhpennañ ur reolenn a dapo an anv hag a savo un ezvont er furmad reizh. Ezhomm zo ur rann reolennoù...
<section-rules> </section-rules>
Evit cheñch tu e-keñver ar skouerioù kent e pegin ar reolenn-mañ, ha mont drezi, kentoc'h eget an tu kontrol.
<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>
Anat eo an dikedenn gentañ, termeniñ a ra ur reolenn. An eil, ar patrom a lavar dreist-holl : "laka a reolenn-mañ e pleustr ma kaver ar patrom-mañ". Er skouer-mañ ez a un anv-kadarn eeun d'ober ar patrom (termenet gant ar rummad nom). Notennit e klot ar patromoù gant an disoc'hoù hirañ da gentañ. Setu m'hoc'h eus teir reolenn, ar gentañ a dap "<prn><vblex><n>", an eil "<prn><vblex>" hag an drede "<n>", e vo sevenet ar reolenn gentañ da gentañ.
Pep patrom a glot gant un ober a grou un ezvont bennak a glot gantañ. Un unanenn c'heriadurel (lexical unit (lu)) eo an ezvont-se.
Dre ar valizenn "clip" e c'hall an implijer diuzañ ha merañ doareennoù hag itemoù geriadurel eus ar yezh-kein (side="sl"), pe eus ar yezh-tal (side="tl").
Dapugnomp ha testomp an traoù. Daspugnet eo ar reolennoù trezkas gant :
$ apertium-preprocess-transfer apertium-sh-en.trules-sh-en.xml trules-sh-en.bin
a grouo ur restr trules-sh-en.bin.
Setu bremañ emaomp prest da destiñ hor reizhiad treiñ emgefre. Mankout a ra c'hoazh un tamm hollbouezus, an tikedenner bommoù lavar (part-of-speech (PoS)) met displeget e vo berr-ha-berr traoñoc'h. Da c'hortoz e c'hallomp testiñ anezhañ evel m'emañ :
Da gentañ, dielfennomp ur ger, 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.
Degas ar verboù[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\@
Hag ar raganvioù-gour ?[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.
Ha petra gant ar sonskriver (Liesgerioù)[edit]
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.
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.
<e lm="record player"><i>record<b/>player</i><par n="gramophone__n"/></e>
The only thing different about this is the use of the tag, although this isn't entirely new as we saw it in use in the rules file.
So, recompile and test in the orthodox fashion:
$ 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
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) — it would not be possible to translate this English phrase word-by-word into Serbo-Croatian.
Merañ an diforc'hioù munut[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.
Dielfennañ[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.