Difference between revisions of "Апертиум, как се създава нова езикова двойка"

From Apertium
Jump to navigation Jump to search
 
(19 intermediate revisions by 6 users not shown)
Line 23: Line 23:
 
==От какво се състои езиковата двойка?==
 
==От какво се състои езиковата двойка?==
   
Системата за машинен превод Апертиум е от повърхностно-трансферен тип, което ще рече, че работи с речници и повърхностни правила за позициониране на думите. Повърхностнното позициониране на думите се различава от "пълното позициониране" с това, че не прави цялостно синтактично парсиране. По принцип правилата са операции върху групи от лексически раздели, и не са операции върху дървовидни структури. Основно съществуват три основни речника:
+
Системата за машинен превод Апертиум е от повърхностно-трансферен тип, което ще рече, че работи с речници и повърхностни правила за позициониране на думите. Повърхностнното позициониране на думите се различава от "пълното позициониране" с това, че не прави цялостно синтактично анализиране. По принцип правилата са операции върху групи от лексически раздели, и не са операции върху дървовидни структури. Основно съществуват три основни речника:
 
#Морфологичния речник за език ХХ: той съдържа правилата за това как се спрягат думите в език ХХ. В нашия пример този речник ще се нарича: apertium-sh-en.sh.dix
 
#Морфологичния речник за език ХХ: той съдържа правилата за това как се спрягат думите в език ХХ. В нашия пример този речник ще се нарича: apertium-sh-en.sh.dix
 
#Морфологичния речник за език УУ: той съдържа правилата за това как се спрягат думите в език УУ. В нашия пример този речник ще се нарича: apertium-sh-en.en.dix
 
#Морфологичния речник за език УУ: той съдържа правилата за това как се спрягат думите в език УУ. В нашия пример този речник ще се нарича: apertium-sh-en.en.dix
 
#Двуезичен речник: съдържа съответстия между думи и символи на двата езика. В нашия пример този речник ще се нарича: apertium-sh-en.sh-en.dix
 
#Двуезичен речник: съдържа съответстия между думи и символи на двата езика. В нашия пример този речник ще се нарича: apertium-sh-en.sh-en.dix
   
В двойката за превод и двата езика могат да бъдат или източник или приемник на превода, това са относителни тернини.
+
В двойката за превод и двата езика могат да бъдат или източник или приемник на превода, това са относителни термини.
   
 
Също така има два файла за правила на трансфера. Това са правилата, които управляват как се пренареждат думите в изреченията, пр. chat noir -> cat black -> black cat. Управляват се и родовете, числата и т.н. Правилата могат да бъдат използвани и да се смъкват или изтриват лексически елементи, както ще бъде описано по-късно. Тези файлове са:
 
Също така има два файла за правила на трансфера. Това са правилата, които управляват как се пренареждат думите в изреченията, пр. chat noir -> cat black -> black cat. Управляват се и родовете, числата и т.н. Правилата могат да бъдат използвани и да се смъкват или изтриват лексически елементи, както ще бъде описано по-късно. Тези файлове са:
Line 36: Line 36:
 
* правила за трансфер на език УУ към ХХ: този файл съдържа правила относно промяната на език УУ към ХХ. В нашия пример това ще бъде: apertium-sh-en.trules-en-sh.xml
 
* правила за трансфер на език УУ към ХХ: този файл съдържа правила относно промяната на език УУ към ХХ. В нашия пример това ще бъде: apertium-sh-en.trules-en-sh.xml
   
Много от езиковите двойки, които са налични в момента имат и друг файлове, но ние няма да ги разясняваме тук. Горните файлове са тези, които са необходими за изграждането на една функционална система.
+
Много от езиковите двойки, които са налични в момента имат и други файлове, но ние няма да ги разясняваме тук. Горните файлове са тези, които са необходими за изграждането на една функционална система.
   
 
==Езикова двойка==
 
==Езикова двойка==
   
Както може да се предположи от имената на файловете, това ръководство ще използва за обяснение на създаването на основната система примери от сърбо-хърватски на английски. Това не е идеалната двойка, тъй като системата работи по-добре с по-близки езици, но това няма да бъде рпоблем за простите примери, с които ще се сблъскаме тук.
+
Както може да се предположи от имената на файловете, това ръководство ще използва за обяснение на създаването на основната система примери от сърбо-хърватски на английски. Това не е идеалната двойка, тъй като системата работи по-добре с по-близки езици, но това няма да бъде проблем за простите примери, с които ще се сблъскаме тук.
   
 
==Кратка бележка за термините==
 
==Кратка бележка за термините==
   
Преди да продължим има няколко термини, които трябва да бъдат разяснени.
+
Преди да продължим има няколко термина, които трябва да бъдат разяснени.
   
Първият е лема. Лема е цитирането на дума. Това представлява думата, без никаква граматическа информация. На пример, лемата на думата котки е котка. За английските съществителни това обикновенно е единственото число на въпросната дума. За глаголи, лемата е основната форма. Лемата на глагола бях е съм.
+
Първият термин е лема цитирането на дума. Това представлява дума без никаква граматическа информация. Например, лемата на думата котки е котка. За съществителните на английски език това обикновенно е единственото число на въпросната дума. За глаголи, лемата е основната форма. Лемата на глагола бях е съм.
   
Вторият е символа. В контекста на Апертиум системата, символа означава граматически етикет. Думата котки е множествено число, следователно тя има символа за съществително и символа за многжествено число. На входа и изхода на модулите на Апертиум, горните обикновено се подавата между ъглови скоби, както следва:
+
Вторият термин е символ. В контекста на системата Апертиум, символ означава граматически етикет. Думата котки е множествено число, следователно тя има символ за съществително и символ за многжествено число. На входа и изхода на модулите на Апертиум, горните обикновено се подават между ъглови скоби, както следва:
   
 
* <n>; за съществителни
 
* <n>; за съществителни
 
* <pl>; за множествено число
 
* <pl>; за множествено число
   
Други примери за символи са <sg>; единствено число, <p1> първо лице, <pri> сегашно изявително наклонение и др. Когато са записани в квадратни скобки символите могат същото така да се приемат като тагове. Важно е да се отбележи, че в много от съществуващите езикови двойки дефинициите на символите са думи, образувани от началните букви на други думи на Каталонски език. На пример, vbhaver - от vb (глагол) и haver ("да имам" на каталонски). Символите са дефинирани в <sdef> тагове и се използват с <nowiki><s></nowiki> тагове.
+
Други примери за символи са <sg>; единствено число, <p1> първо лице, <pri> сегашно изявително наклонение и др. Когато са записани в квадратни скобки символите могат същото така да се приемат като маркери/тагове. Важно е да се отбележи, че в много от съществуващите езикови двойки дефинициите на символите са думи, образувани от началните букви на други думи на Каталонски език. На пример, vbhaver - от vb (глагол) и haver ("да имам" на каталонски). Символите са дефинирани в <sdef> маркери/тагове и се използват с <nowiki><s></nowiki> маркери/тагове.
   
Третата дума е парадигма. В контекста на Апертиум системата, парадигмата се отнася примерно как се спряга цяла група от думи. В морфологичния речник, лемите (виж по-горе) се свързват с парадигмите, което ни дава възможност да опишем как всяка лема може да бъде спрегната без да се налага да описваме всички наставки.
+
Третата дума е парадигма. В контекста на системата Апертиум, парадигмата пример за това как се спряга цяла група от думи. В морфологичния речник, лемите (виж по-горе) се свързват с парадигмите, което дава възможност да се описва как всяка лема може да бъде спрегната без да се налага описание на всички наставки.
   
Примерно, ако искаме да съхраним две прилагателни happy и lazy, вместо да запазваме две еднакви наствки:
+
Примерно, ако трябва да се съхранят две прилагателни happy и lazy, вместо да се запазват две еднакви наствки:
   
 
* happy, happ (y, ier, iest)
 
* happy, happ (y, ier, iest)
 
* lazy, laz (y, ier, iest)
 
* lazy, laz (y, ier, iest)
   
Можем просто да съхраним едната и после да кажем, че "lazy, се спряга като happy", или "shy се спряга като happy","naughty се спряга като happy", "friendly се спряга като happy" и така нататък. В този пример, happy ще е парадигмата, модела за това как всички останали се спрягат. Точното описание на как точно се дефинира това ще бъде обяснено скоро. Парадигмите се дефинират в <pardef> тагове и се използват в <par> тагове.
+
Може просто да се съхрани едната и после да се зададе, че "lazy, се спряга като happy", или "shy се спряга като happy","naughty се спряга като happy", "friendly се спряга като happy" и т.н. В този пример, happy ще е парадигмата, модела за това как всички останали се спрягат. Подробно описание как се дефинира това ще бъде обяснено по-нататък. Парадигмите се дефинират в <pardef> маркери/тагове и се използват в <par> маркери/тагове.
   
 
==Начало==
 
==Начало==
Line 206: Line 206:
 
===Двуезичен речник===
 
===Двуезичен речник===
   
  +
Така сега имаме два морфологични речника, следващото нещо е да създадем двуезичен речник. Той описва съответствията между думите. Всички речници използват същия формат (който е описан в 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).
 
   
Create a new file, apertium-sh-en.sh-en.dix and add the basic skeleton:
+
Създайте нов файл, apertium-sh-en.sh-en.dix и добавете основната структура:
 
<pre>
 
<pre>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
Line 224: Line 224:
 
</dictionary>
 
</dictionary>
 
</pre>
 
</pre>
  +
Сега е необходимо да добавим запис за превод между двете думи. Нещо като:
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>
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.
 
   
  +
Тъй като има много такива записи, те се пишат обикновено на един и същи ред за да се улесни четенето на файла. Отново с 'l' и 'r'? Компилираме го от ляво надясно за да се създаде сърбо-хърватски > английски речник, и отдясно наляво за създаването на английски > сърбо-хърватски речник.
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>
  +
Така се генерират морфологичните анализатори (automorf), морфологичните генератори (autogen) и се проверяват думите (autobil), думата bil означава двуезичен.
To generate the morphological analysers (automorf), the morphological generators (autogen) and the word lookups (autobil), the bil is for "bilingual".
 
   
  +
===Правила за трансфер===
===Transfer rules===
 
   
  +
Така, имаме два морфологични речника и двуезичен речник. Това от което се нуждаем сега е правило за трансфер за съществителни. Оравилата за трансфер имат собствени DTD фаилове(transfer.dtd), които могат да бъдат открити в пакета Apertium. Ако трябва да създадете ново правило е желателно да погледнете във файловете с правила на други езикови двойки първо. Много правила могат да бъдат използвани многократно от различните езици.
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.
 
  +
Например правилото описано по-долу ще е полезно за всеки език, който използва падежи за определяне на личните местоимения(аз, ти, той, ние, вие, те) и те могат да се изпускат.
   
  +
Започнете като всички други с основна структура:
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 254: Line 256:
 
</transfer>
 
</transfer>
 
</pre>
 
</pre>
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').
 
  +
  +
Първо трябва да се дефинират категории и атрибути. Категориите и атрибутите позволяват да групираме граматични символи. Категориите позволяват да групуираме символи за съвпадение, например 'n.*' за всички съществителни(nouns). Атрибутите позволяват да се групират символи, от които може да се избира. Например 'sg' и 'pl' могат да се групират в атрибута число (number).
   
  +
Нека да добавим необходимите раздели:
Lets add the necessary sections:
 
 
<pre>
 
<pre>
 
<section-def-cats>
 
<section-def-cats>
Line 267: Line 270:
 
</section-def-attrs>
 
</section-def-attrs>
 
</pre>
 
</pre>
  +
Тъй като само спрягаме съществителните в единствено и множествено число трябва да добавим категория за съществителни и атрибут за число. Нещо като следващото ще бъде достатъчно:
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:
+
В section-def-cats се добавя:
 
<pre>
 
<pre>
 
<def-cat n="nom">
 
<def-cat n="nom">
Line 275: Line 278:
 
</def-cat>
 
</def-cat>
 
</pre>
 
</pre>
  +
Това прихваща всички съществителни (леми след които има <n> и след това каквото и да е друг) и се отнася към тях като с "nom"(ще демонстрираме използването му по-късно).
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:
+
В секцията section section-def-attrs се добавя:
 
<pre>
 
<pre>
 
<def-attr n="nbr">
 
<def-attr n="nbr">
Line 284: Line 287:
 
</def-attr>
 
</def-attr>
 
</pre>
 
</pre>
  +
и след това
and then
 
 
<pre>
 
<pre>
 
<def-attr n="a_nom">
 
<def-attr n="a_nom">
Line 290: Line 293:
 
</def-attr>
 
</def-attr>
 
</pre>
 
</pre>
  +
Първото дефинира атрибута nbr(номер), който може да бъде и в единствено(sg) и в множествено число(pl).
The first defines the attribute nbr (number), which can be either singular (sg) or plural (pl).
 
   
  +
Второто дефинира атрибута a_nom (атрибут съществително).
The second defines the attribute a_nom (attribute noun).
 
   
  +
Следва да добавим секция за глобални променливи:
Next we need to add a section for global variables:
 
 
<pre>
 
<pre>
 
<section-def-vars>
 
<section-def-vars>
Line 300: Line 303:
 
</section-def-vars>
 
</section-def-vars>
 
</pre>
 
</pre>
  +
Тези променливи се използват за съхранение или трансфер на атрибути между правила. Необходимо ни е само едно за сега:
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>
  +
Накрая добавяме правило, което да приеме съществителното и да го генерира в правилната форма. Ще ни трябва секция с правила...
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 310: Line 313:
 
</section-rules>
 
</section-rules>
 
</pre>
 
</pre>
  +
Като сменяме стъпката от предишния пример ще покажем правилото, след това ще го разгледаме, отколкото наобратно.
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 328: Line 331:
 
</pre>
 
</pre>
   
  +
Първия таг е очевиден, той дефинира правило. Втория таг основно казва: "приложи правилото, ако примера е намерен". В този случай примера се състои от едно съществително (дефинирано от категорията nom). Забележете, че примерите се съпоставят по правилото на по-дългото съвпадение е първо. Така че ако имате три правила, пърото прихваща "<prn><vblex><n>", второто прихваща "<prn><vblex>", третото прихваща "<n>", примера който ще съвпадне и правилото, което ще се изпулни е първото.
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.
 
   
  +
За всеки пример има свързано действие, което генерира определен изход. Изхода е лексическа мярка (lu).
For each pattern, there is an associated action, which produces an associated output, out. The output, is a lexical unit (lu).
 
   
  +
Клип тага позволява на потребителя да избира и манипулира атрибути и части на лексическия параграф на входния език (side="sl"), или изходния език (side="tl").
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:
 
 
<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>
Which will generate a trules-sh-en.bin file.
+
Файла trules-sh-en.bin ще бъде създаден.
   
  +
Сега вече сме готови да тестваме нашата система за машинен превод. Липсва една важна част, част на говора (PoS) тагер, но той ще бъде описан скоро. Междувременно можем да тестваме по следния начин:
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:
+
Първо да анализираме думата gramofoni:
 
<pre>
 
<pre>
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin
 
^gramofon/gramofon<n><pl>$
 
^gramofon/gramofon<n><pl>$
 
</pre>
 
</pre>
  +
Обикновенно тук тагера PoS ще избере правилната версия на базата на част от речта, но тъй като нямаме PoS тагер все още можем да използваме следния елементарен gawk скрипт (благодарение на Segio), който просто ще ни даде първия елемент, който е получен.
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.
 
 
<pre>
 
<pre>
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \
Line 353: Line 356:
 
^gramofon<n><pl>$
 
^gramofon<n><pl>$
 
</pre>
 
</pre>
  +
Сега нека да обработим резултата с правило за трансфер:
Now let's process that with the transfer rule:
 
 
<pre>
 
<pre>
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \
Line 359: Line 362:
 
apertium-transfer apertium-sh-en.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin
 
apertium-transfer apertium-sh-en.trules-sh-en.xml trules-sh-en.bin sh-en.autobil.bin
 
</pre>
 
</pre>
  +
Това ще ни даде:
It will output:
 
 
<pre>
 
<pre>
 
^gramophone<n><pl>$^@
 
^gramophone<n><pl>$^@
 
</pre>
 
</pre>
* 'gramophone' is the target language (side="tl") lemma (lem) at position 1 (pos="1").
+
* 'gramophone' е изходният език (side="tl") лема (lem) на позиция 1 (pos="1").
* '<n>' is the target language a_nom at position 1.
+
* '<n>' е a_nom на изходния език на позиция 1.
  +
* '<pl>' е атрибута за число (nbr) на изходния език на позиция 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.
 
   
  +
Така, сега имаме изхода от прехвърлянето, единственото което остава е да се генерират спрегнатите форми на изходния език. За тази цел ние използваме lt-proc, но в режим на генериране (-g), не на анализ.
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.
 
 
<pre>
 
<pre>
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \
 
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \
Line 378: Line 381:
 
gramophones\@
 
gramophones\@
 
</pre>
 
</pre>
  +
И c'est ca. Сега имате система за машинен превод, която превежда съществително от сърбо-хърватски в съществително на английски. Очевидно това не е много полезно, но скоро ще се спрем на по-сложните неща. А, и не се тревожете за символа '@', ще обясня това скоро.
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==
 
   
  +
Добре, имаме система, която превежда съществителни, но това е доста безполезно, ние искаме също така да превеждаме глаголи и дори цели изречения! Какво ще кажете да започнем с глагола, за да видите. В сърбо-хърватския това е videti. Сърбо-хърватският е език с нулев подлог, това означава, че обикновено не използва лични местоимения преди спрегнатата форма на глагола. При английския не е така. Например: Аз виждам на английски би било преведено като vidim на сърбо-хърватски.
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
 
* Vidim
* see<p1><sg>
+
* виждам<p1><sg>
  +
* Аз виждам
* I see
 
   
  +
Забележка: <p1> обозначава първо лице
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.
+
Другите форми на глагола videti са: vidis, vidi, vidimo, vidite, and vide; които съответстват на: ти виждаш (единствено), той вижда, ние виждаме, вие виждате (множествено число) и те виждат.
   
  +
Има две форми на ти виждаш(you see), едната е в множествено и формално единствено число (vidite) и другата е в единствено неформално число (vidis).
There are two forms of you see, one is plural and formal singular (vidite) and the other is singular and informal (vidiš).
 
   
  +
Ще се опитаме да преведем изречението: "Vidim gramofoni" в "Виждам грамофони". Всъщност, само ще добавим достатъчно информация да направим превода и ще оставим попълването на парадигмите (добавянето на другото спрежение на глагола) като задача на читателя.
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.
 
   
  +
Проницателният читател вече ще е разбрал, че не можем просто да преведем vidim gramofoni, защото не е граматичeски правилно изречение на сърбо-хърватски. Правилното изречение би било vidim gramofone, като съществителното е във винителен падеж. Ще трябва също да добавим тази форма, няма нужда обаче за сега да се добавя информация за падежа , просто го добавяме като друга опция за множествено число. Така че, просто копирайте 'e' за 'i' и променете 'i' на 'e'.
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.
 
   
  +
Първото нещо, което трябва да направим е да добавим повече символи. Първо трябва да добавим символ за 'глагол', което ще наречем "vblex" (това означава лексикален глагол, обратно на модални глаголи и други типове). Глаголите имат 'лице' и 'време' заедно с число, така че нека да добавим също така няколко от тези. Трябва да преведем "Аз виждам", така че за лице трябва да добавим "p1" или 'първо лице' и за време "pri" или 'сегашно изявително'.
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'.
 
 
<pre>
 
<pre>
 
<sdef n="vblex"/>
 
<sdef n="vblex"/>
Line 408: Line 411:
 
<sdef n="pri"/>
 
<sdef n="pri"/>
 
</pre>
 
</pre>
  +
След като сме приключили с това, същото със съществителните, добавяме парадигма за спрягането на глагола. Първият ред ще бъде:
After we've done this, the same with the nouns, we add a paradigm for the verb conjugation. The first line will be:
 
 
<pre>
 
<pre>
 
<pardef n="vid/eti__vblex">
 
<pardef n="vid/eti__vblex">
 
</pre>
 
</pre>
  +
'/' се използва да разграничава къде се добавят stems-ите (частите между таговете <l> </l>).
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:
 
 
<pre>
 
<pre>
 
<e>
 
<e>
Line 423: Line 426:
 
</e>
 
</e>
 
</pre>
 
</pre>
  +
'im' обозначава края (като при 'vidim'), необходимо е да се добави 'eti' към секцията <r>, тъй като това ще бъде отрязано от дефиницията. Останалото е сравнително лесно, 'vblex' е лексикален глагол, 'pri' е сегашно изявително наклонение, 'p1' е първо лице и 'sg' е единствено число. Можем също да добавим множественото число, което ще бъде същото, освен 'imo' вместо 'im' и 'pl' вместо 'sg'.
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:
 
 
<pre>
 
<pre>
 
<e lm="videti"><i>vid</i><par n="vid/eti__vblex"/></e>
 
<e lm="videti"><i>vid</i><par n="vid/eti__vblex"/></e>
 
</pre>
 
</pre>
Note: the content of <nowiki><i> </i></nowiki> is the root, not the lemma.
+
Забележка: съдържанието на <nowiki><i> </i></nowiki> е коренът, не лемата.
   
  +
Това е работата по сърбо-хърватския речник, която сме свършили за сега. Нека да го компилираме и изпробваме.
Thats the work on the Serbo-Croatian dictionary done for now. Lets compile it then test it.
 
 
<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
Line 440: Line 443:
 
^vidimo/videti<vblex><pri><p1><pl>$
 
^vidimo/videti<vblex><pri><p1><pl>$
 
</pre>
 
</pre>
  +
Добре, сега правим същото и за английския речник (не забравяйте да добавите същите символни дефиниции, каквито добавихте за сърбо-хърватския речник).
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:
 
 
<pre>
 
<pre>
 
<pardef n="s/ee__vblex">
 
<pardef n="s/ee__vblex">
 
</pre>
 
</pre>
  +
защото миналото време е 'видях'. Сега можем да направим едно от двете неща, можем да добавим и първо, и второ лице, но те са в една и съща форма. Фактически, всички форми (освен трето лице, единствено число) на глагола 'да видя' са 'виждам'. Така че вместо това ние правим само един запис за 'виждам' и му задаваме само символа 'pri'.
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.
 
 
<pre>
 
<pre>
 
<e>
 
<e>
Line 455: Line 458:
 
</e>
 
</e>
 
</pre>
 
</pre>
  +
и както винаги, запис в главния раздел:
and as always, an entry in the main section:
 
 
<pre>
 
<pre>
 
<e lm="see"><i>s</i><par n="s/ee__vblex"/></e>
 
<e lm="see"><i>s</i><par n="s/ee__vblex"/></e>
 
</pre>
 
</pre>
  +
Тогава нека да запишем, да прекомпилираме и изпробваме:
Then lets save, recompile and test:
 
</pre>
+
<pre>
 
$ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin
 
$ lt-comp lr apertium-sh-en.en.dix en-sh.automorf.bin
 
main@standard 18 19
 
main@standard 18 19
Line 467: Line 470:
 
^see/see<vblex><pri>$
 
^see/see<vblex><pri>$
 
</pre>
 
</pre>
  +
Сега за задължителния запис в двуезичния речник:
Now for the obligatory entry in the bilingual dictionary:
 
 
<pre>
 
<pre>
 
<e><p><l>videti<s n="vblex"/></l><r>see<s n="vblex"/></r></p></e>
 
<e><p><l>videti<s n="vblex"/></l><r>see<s n="vblex"/></r></p></e>
 
</pre>
 
</pre>
  +
(отново, не забравяйте да добавите sdefs от по-рано)
(again, don't forget to add the sdefs from earlier)
 
   
  +
И прекомпилираме:
And recompile:
 
 
<pre>
 
<pre>
 
$ 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
Line 480: Line 483:
 
main@standard 18 18
 
main@standard 18 18
 
</pre>
 
</pre>
  +
Сега изпробваме:
Now to test:
 
 
<pre>
 
<pre>
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
Line 488: Line 491:
 
^see<vblex><pri><p1><sg>$^@
 
^see<vblex><pri><p1><sg>$^@
 
</pre>
 
</pre>
  +
Анализът преминава правилно, но когато се опитаме да генерираме повърхностна форма, получаваме '#' като по-долу:
We get the analysis passed through correctly, but when we try and generate a surface form from this, we get a '#', like below:
 
 
<pre>
 
<pre>
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
Line 496: Line 499:
 
#see\@
 
#see\@
 
</pre>
 
</pre>
  +
Като '#' означава, че генераторът не може да генерира правилната лексикална форма, защото не я съдържа. Защо се получава така?
This '#' means that the generator cannot generate the correct lexical form because it does not contain it. Why is this?
 
   
  +
Принципно, анализите не съвпадат, 'виждам' в речника е виждам<vblex><pri>, но виждам получено от трансфера е виждам<vblex><pri><p1><sg>. В сърбо-хърватската страна има повече информация отколкото английската страна се нуждае. Можете да изпробвате това като добавите липсващите символи към английския речник, и след това прекомпилирате и тествате отново.
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.
 
   
  +
Все пак, по-парадигматичен начин да се погрижим за това е като напишем правило. Така, отваряме файлът с правилата (apertium-sh-en.trules-sh-en.xml в случай, че сте забравили).
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'.
 
 
<pre>
 
<pre>
 
<def-cat n="vrb">
 
<def-cat n="vrb">
Line 508: Line 511:
 
</def-cat>
 
</def-cat>
 
</pre>
 
</pre>
  +
Също така трябва да добавим атрибути за глаголно време и лице. Ще го направим много просто за сега, можете да добавите p2 и p3, но аз няма да го направя, за да спестя място.
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.
 
 
<pre>
 
<pre>
 
<def-attr n="temps">
 
<def-attr n="temps">
Line 518: Line 521:
 
</def-attr>
 
</def-attr>
 
</pre>
 
</pre>
  +
Трябва също да добавим атрибут за глаголи.
We should also add an attribute for verbs.
 
 
<pre>
 
<pre>
 
<def-attr n="a_verb">
 
<def-attr n="a_verb">
Line 524: Line 527:
 
</def-attr>
 
</def-attr>
 
</pre>
 
</pre>
  +
Сега върху правилото:
Now onto the rule:
 
 
<pre>
 
<pre>
 
<rule>
 
<rule>
Line 541: Line 544:
 
</rule>
 
</rule>
 
</pre>
 
</pre>
  +
Спомнете си когато се опитахте да махнете коментара на 'clip' таговете в предишния пример с правило и те изчезнаха от трансфера, ами, това е доста от което правим тук. Въвеждаме глагол с пълен анализ, но извеждаме само частичен анализ (лема + таг на глагола + таг на глаголното време).
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:
 
 
<pre>
 
<pre>
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
Line 550: Line 553:
 
^see<vblex><pri>$^@
 
^see<vblex><pri>$^@
 
</pre>
 
</pre>
and:
+
и:
 
<pre>
 
<pre>
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
 
$ echo "vidim" | lt-proc sh-en.automorf.bin | \
Line 558: Line 561:
 
see\@
 
see\@
 
</pre>
 
</pre>
  +
Опитайте с 'vidimo' (ние виждаме) да видите дали получавате правилния изход.
Try it with 'vidimo' (we see) to see if you get the correct output.
 
   
Now try it with "vidim gramofone":
+
Сега опитайте с "vidim gramofone":
 
<pre>
 
<pre>
 
$ echo "vidim gramofoni" | lt-proc sh-en.automorf.bin | \
 
$ echo "vidim gramofoni" | lt-proc sh-en.automorf.bin | \
Line 569: Line 572:
 
</pre>
 
</pre>
   
  +
==Но какво да кажем за личните местоимения?==
==But what about personal pronouns?==
 
   
  +
Ами, това е страхотно, но все още ни липсва личното местоимение, което е необходимо за английския. За да го добавим, трябва първо да редактираме английският морфологичен речник.
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:
 
 
<pre>
 
<pre>
 
<sdef n="prn"/>
 
<sdef n="prn"/>
 
<sdef n="subj"/>
 
<sdef n="subj"/>
 
</pre>
 
</pre>
  +
От двата символа, prn е местоимение и subj е подлог (като в подлога на изречение).
Of the two symbols, prn is pronoun, and subj is subject (as in the subject of a sentence).
 
   
  +
Защото няма корен или 'лема' за подлози лични местоимения, просто добавяме pardef както следва:
Because there is no root, or 'lemma' for personal subject pronouns, we just add the pardef as follows:
 
 
<pre>
 
<pre>
 
<pardef n="prsubj__prn">
 
<pardef n="prsubj__prn">
Line 591: Line 594:
 
</pardef>
 
</pardef>
 
</pre>
 
</pre>
  +
Като 'prsubj' е 'личен подлог'. Останалите от тях (Вие, Ние и др.) са оставени като упражнение за читателя.
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:
 
 
<pre>
 
<pre>
 
<e lm="personal subject pronouns"><i/><par n="prsubj__prn"/></e>
 
<e lm="personal subject pronouns"><i/><par n="prsubj__prn"/></e>
 
</pre>
 
</pre>
  +
Така, записваме, прекомпилираме и тестваме, и трябва да получим нещо като:
So, save, recompile and test, and we should get something like:
 
 
<pre>
 
<pre>
 
$ echo "I" | lt-proc en-sh.automorf.bin
 
$ echo "I" | lt-proc en-sh.automorf.bin
Line 603: Line 606:
 
</pre>
 
</pre>
   
  +
(Забележка: в главни букви е, защото 'I' е с главни букви).
(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):
 
 
<pre>
 
<pre>
 
<def-cat n="prpers">
 
<def-cat n="prpers">
Line 613: Line 616:
 
</def-cat>
 
</def-cat>
 
</pre>
 
</pre>
  +
Сега добавяме типовете местоимение като атрибути, можем да добавим и типа 'obj' като сме на него, въпреки че няма да ни трябва за сега:
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:
 
 
<pre>
 
<pre>
 
<def-attr n="tipus_prn">
 
<def-attr n="tipus_prn">
Line 620: Line 623:
 
</def-attr>
 
</def-attr>
 
</pre>
 
</pre>
  +
И сега да въведем правилото:
And now to input the rule:
 
 
<pre>
 
<pre>
 
<rule>
 
<rule>
Line 645: Line 648:
 
</rule>
 
</rule>
 
</pre>
 
</pre>
  +
Това е почти същото правило като преди, само ще направим няколко малки промени.
This is pretty much the same rule as before, only we made a couple of small changes.
 
   
  +
Трябваше да изкараме:
We needed to output:
 
 
<pre>
 
<pre>
 
^prpers<prn><subj><p1><sg>$ ^see<vblex><pri>$
 
^prpers<prn><subj><p1><sg>$ ^see<vblex><pri>$
 
</pre>
 
</pre>
  +
така че генераторът да може да избере правилното местоимение и правилната форма на глагола.
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>, отпечатва буквен низ, в този случай "prpers"
  +
* <lit-tag>, отпечатва буквен таг, защото не можем да вземем таговете от глагола ги добавяме сами, "prn" за местоимение и "subj" за подлог.
* <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.
 
  +
* <b/>, отпечатва празно пространство.
* <b/>, 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:
 
 
<pre>
 
<pre>
 
$ echo "vidim gramofone" | lt-proc sh-en.automorf.bin | \
 
$ echo "vidim gramofone" | lt-proc sh-en.automorf.bin | \
Line 669: Line 672:
 
I see gramophones
 
I see gramophones
 
</pre>
 
</pre>
  +
Което, макар и да не е точно проза на лауреат (много харесвам това HOWTO), е относително точен превод.
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)==
 
   
  +
Докато грамофон е английска дума, това не е най-добрият превод. Грамофон обикновено се използва за много стар вид, който вие познавате с игла вместо с щифт без усилване. По-добър превод би бил 'record player'('записващ плейър'). Въпреки че това е повече от една дума, може да го разглеждаме като, че е една дума като използваме конструкции на мултидуми (multipalabra).
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.
+
Множественото число на 'record player' е 'record players', така че да приема същата парадигма като грамофон (gramophone__n) — при това ние просто добавихме 's'. Всичко, което е необходимо да направим е да добавим нов елемент към главния раздел.
 
<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>
  +
Единственото различно тук е използването на тага <b/>, въпреки че това не е изцяло ново както го видяхме в употреба във файлът с правила.
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.
 
   
  +
Така, прекомпилираме и тестваме в старата последователност:
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 691: Line 694:
 
I see record players
 
I see record players
 
</pre>
 
</pre>
  +
Перфектно. Голяма полза от използването на мултидуми е, че можете да превеждате идиоматични изрази дословно, без да се налага да превеждате дума-по-дума. Например английската фраза "at the moment"("в момента") би била преведена на сръбско-хърватски като "trenutno" (trenutak = ''moment'', trenutno е наречие на това) &mdash; преводът на тази английска фраза в сърбо-хърватски не би бил възможен дума по дума.
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.
 
   
  +
==Справяне с незначително изменение==
==Dealing with minor variation==
 
   
  +
Сърбо-хърватският обикновено има няколко начина за изписване на всяка дума заради диалектните варианти. Има яка фонетична писмена система, така че се пише както се изговаря. Например, хората говорещи в Ijekavian биха казали "rječnik", докато някой говорещ Ekavian би казал "rečnik", което отразява разликите в произношението на прото-славянската гласна ''yat''.
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===
+
===Анализ===
   
  +
Трябва да има относително лесен начин за справяне с това, и има, отново чрез използване на парадигми. Парадигми не се използват само за добавяне на граматични символи, но те също така могат да бъдат използвани да заменят всеки знак/символ с друг. Например, ето парадигма за приемане на "e" и "je" в анализа. Парадигмата трябва, както другите, да отиде в едноезичния сърбо-хърватски речник.
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.
 
   
 
<pre>
 
<pre>
Line 718: Line 721:
 
</pre>
 
</pre>
   
  +
Тогава в "основния раздел":
Then in the "main section":
 
   
 
<pre>
 
<pre>
Line 724: Line 727:
 
</pre>
 
</pre>
   
  +
Но това само ни позволява да анализираме двете форми... необходима е повече работа, ако искаме да генерираме и двете форми.
This only allows us to analyse both forms however... more work is necessary if we want to generate both forms.
 
   
  +
===Възпроизвеждане===
===Generation===
 
   
==See also==
+
==Виж също==
   
 
*[[Building dictionaries]]
 
*[[Building dictionaries]]
  +
*[[Finding_errors_in_dictionaries]]
  +
*[[Cookbook]]
  +
*[[Chunking]]
  +
*[[Contributing to an existing pair]]
   
[[Category:Documentation|HOWTO]]
+
[[Category:Documentation]]
  +
[[Category:HOWTO]]
  +
[[Category:Writing dictionaries]]
  +
[[Category:Quickstart]]

Latest revision as of 07:01, 16 February 2015

Апертиум, как се създава нова езикова двойка

Този документ има за цел да обясни как се създава нова езикова двойка в Апертиум системата за машинен превод от началото до края.

Не е необходимо никакво знание по лингвистика или по машинен превод над нивото на различаване на съществителни имена от глаголи (представки и други)

Въведение[edit]

Както може би вече сте се досетили, Апертиум е система за машинен превод. Всъщност, казано по-точно това е платформа за преводи. Разполага с машина и инструменти, които ви позволяват да създавате ваши собствени системи за превод. Единственото нещо, което трябва да направите е да запишете данните. Основно те се състоят от три речника и няколко правила за преподреждане на думите и други граматични трансформации.

За по конкретна информация как точно работи системата, има някои доста добри ръководства на уеб сайта на проекта apertium.sourceforge.net.

Какво ще ви е необходимо[edit]

  • lttoolbox (>= 3.0.0)
  • libxml utils (xmllint etc.)
  • apertium (>= 3.0.0)
  • текстов редактор (или ако предпочитате специализиран XML редактор)

Този документ няма да описва как да инсталирате тези пакети. За повече информация за това прочетете секцията с документацията на уеб сайта на Апертиум.

От какво се състои езиковата двойка?[edit]

Системата за машинен превод Апертиум е от повърхностно-трансферен тип, което ще рече, че работи с речници и повърхностни правила за позициониране на думите. Повърхностнното позициониране на думите се различава от "пълното позициониране" с това, че не прави цялостно синтактично анализиране. По принцип правилата са операции върху групи от лексически раздели, и не са операции върху дървовидни структури. Основно съществуват три основни речника:

  1. Морфологичния речник за език ХХ: той съдържа правилата за това как се спрягат думите в език ХХ. В нашия пример този речник ще се нарича: apertium-sh-en.sh.dix
  2. Морфологичния речник за език УУ: той съдържа правилата за това как се спрягат думите в език УУ. В нашия пример този речник ще се нарича: apertium-sh-en.en.dix
  3. Двуезичен речник: съдържа съответстия между думи и символи на двата езика. В нашия пример този речник ще се нарича: apertium-sh-en.sh-en.dix

В двойката за превод и двата езика могат да бъдат или източник или приемник на превода, това са относителни термини.

Също така има два файла за правила на трансфера. Това са правилата, които управляват как се пренареждат думите в изреченията, пр. chat noir -> cat black -> black cat. Управляват се и родовете, числата и т.н. Правилата могат да бъдат използвани и да се смъкват или изтриват лексически елементи, както ще бъде описано по-късно. Тези файлове са:

  • правила за трансфер на език ХХ към УУ: този файл съдържа правила относно промяната от език ХХ към УУ. В нашия пример това ще бъде: apertium-sh-en.trules-sh-en.xml
  • правила за трансфер на език УУ към ХХ: този файл съдържа правила относно промяната на език УУ към ХХ. В нашия пример това ще бъде: apertium-sh-en.trules-en-sh.xml

Много от езиковите двойки, които са налични в момента имат и други файлове, но ние няма да ги разясняваме тук. Горните файлове са тези, които са необходими за изграждането на една функционална система.

Езикова двойка[edit]

Както може да се предположи от имената на файловете, това ръководство ще използва за обяснение на създаването на основната система примери от сърбо-хърватски на английски. Това не е идеалната двойка, тъй като системата работи по-добре с по-близки езици, но това няма да бъде проблем за простите примери, с които ще се сблъскаме тук.

Кратка бележка за термините[edit]

Преди да продължим има няколко термина, които трябва да бъдат разяснени.

Първият термин е лема – цитирането на дума. Това представлява дума без никаква граматическа информация. Например, лемата на думата котки е котка. За съществителните на английски език това обикновенно е единственото число на въпросната дума. За глаголи, лемата е основната форма. Лемата на глагола бях е съм.

Вторият термин е символ. В контекста на системата Апертиум, символ означава граматически етикет. Думата котки е множествено число, следователно тя има символ за съществително и символ за многжествено число. На входа и изхода на модулите на Апертиум, горните обикновено се подават между ъглови скоби, както следва:

  • <n>; за съществителни
  • <pl>; за множествено число

Други примери за символи са <sg>; единствено число, <p1> първо лице, <pri> сегашно изявително наклонение и др. Когато са записани в квадратни скобки символите могат същото така да се приемат като маркери/тагове. Важно е да се отбележи, че в много от съществуващите езикови двойки дефинициите на символите са думи, образувани от началните букви на други думи на Каталонски език. На пример, vbhaver - от vb (глагол) и haver ("да имам" на каталонски). Символите са дефинирани в <sdef> маркери/тагове и се използват с <s> маркери/тагове.

Третата дума е парадигма. В контекста на системата Апертиум, парадигмата пример за това как се спряга цяла група от думи. В морфологичния речник, лемите (виж по-горе) се свързват с парадигмите, което дава възможност да се описва как всяка лема може да бъде спрегната без да се налага описание на всички наставки.

Примерно, ако трябва да се съхранят две прилагателни happy и lazy, вместо да се запазват две еднакви наствки:

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

Може просто да се съхрани едната и после да се зададе, че "lazy, се спряга като happy", или "shy се спряга като happy","naughty се спряга като happy", "friendly се спряга като happy" и т.н. В този пример, happy ще е парадигмата, модела за това как всички останали се спрягат. Подробно описание как се дефинира това ще бъде обяснено по-нататък. Парадигмите се дефинират в <pardef> маркери/тагове и се използват в <par> маркери/тагове.

Начало[edit]

Многоезини речници[edit]

Нека да започнем като направим нашия първи езиков речник. Речника представлява XML файл. Пуснете си вашия текстов редактор и напишете следното:

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

</dictionary>

Така, файла дефинира за сега, че искаме да направим речник. За да бъде полезен този файл трябва да добавим още няколко реда, първия от които е азбука. Тя дефинира поредицата от букви, които мога да се използват в речника за Сърбо-Хърватски. Ще изглежда по следния начин и ще съдържа всички букви от Сърбо-Хърватската азбука:

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

Поставете азбуката под тага <dictionary>.

След това трябва да дефинираме някои символи. Да започнем с нещо по-елементарно, съществително (n) в единствено число (pl) и множествено число (pl).

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

Символните имена не трябва да бъдат толкова кратки, всъщност те биха могли дори да бъдат написани пълно, но тъй като ще се налага да ги пишем често, има логика да използваме съкращения.

За нещастие, не е толкова лесно, съществителните в Сърбо-Хърватския се спрягат не само по число, а също така и по род и наклонение. Обаче, за този пример ще приемем, че съществителното е в мъжки род и в именителен падеж ( цялостен пример може да бъде намерен в края на този документ )

Следва да дефинираме секция за парадигмите,

<pardefs>

</pardefs>

и секция за речника:

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

</section>

Има два вида секции, първия е стандартна секция, която съдържа думи, енклитика и други. Втория вид е неусловна секция, която най-често съдържа препинателни знаци и други. Тук нямаме такава неусловна секция, но тя ще бъде описана по-късно.

Така, файла ни трябва да изглежда по следния начин:

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

Сега имаме структурата, можем да започнем с добавянето на съществително. За пример ще използваме "gramofon", който означава "грамофон" или "устройство, което свири плочи".

Първото нещо, което трябва да направим, тъй като нямаме предишни парадигми е да дефинираме парадигма.

Запомнете, че приемаме мъжки род и именителен падеж. Единственото число на съществителното е "gramofon", и множественото число е "gramofoni". Така:

<pardef n="gramofon__n">
   <e>
     <p>
       <l/>
       <r><s n="n"/><s n="sg"/></r>
     </p>
   </e>
   <e>
     <p>
       <l>i</l>
       <r><s n="n"/><s n="pl"/></r>
     </p>
   </e>
</pardef>

Забележка: '<l/>' (еквивалент на <l></l>) означава, че няма допълнителен материял да бъде добавян в основата на думата в единствено число.

Това може да изглежда като доста подробен начин за описването му, но има причини за това и скоро се свиква с него. Вие сигурно се чудите какво означават <e>,

, <l> и <r>. Така,

  • e - запис.
  • p - двойка.
  • l - ляво.
  • r - дясно.

Защо ляво и дясно? Ами морфологичните речници по-късно ще бъдат компилирани в крайни автомати. Компилирането им отляво надясно създава анализ от думи и от дясно наляво думи от анализи. Например:

* gramofoni (отляво надясно) gramofon<n><pl> (анализ)
* gramofon<n><pl> (отдясно наляво) gramofoni (генерация)

Сега дефинирахме парадигма, трябва да я свържем с нейната лема, gramofon. Поставяме я в секцията, която дефинирахме.ed.

Записа, който ще сложим в </dictionary>

Сега е необходимо да добавим запис за превод между двете думи. Нещо като:

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

Тъй като има много такива записи, те се пишат обикновено на един и същи ред за да се улесни четенето на файла. Отново с 'l' и 'r'? Компилираме го от ляво надясно за да се създаде сърбо-хърватски > английски речник, и отдясно наляво за създаването на английски > сърбо-хърватски речник.

И така, когато сме готови стартираме следните команди:

$ 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

Така се генерират морфологичните анализатори (automorf), морфологичните генератори (autogen) и се проверяват думите (autobil), думата bil означава двуезичен.

Правила за трансфер[edit]

Така, имаме два морфологични речника и двуезичен речник. Това от което се нуждаем сега е правило за трансфер за съществителни. Оравилата за трансфер имат собствени DTD фаилове(transfer.dtd), които могат да бъдат открити в пакета Apertium. Ако трябва да създадете ново правило е желателно да погледнете във файловете с правила на други езикови двойки първо. Много правила могат да бъдат използвани многократно от различните езици. Например правилото описано по-долу ще е полезно за всеки език, който използва падежи за определяне на личните местоимения(аз, ти, той, ние, вие, те) и те могат да се изпускат.

Започнете като всички други с основна структура:

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

</transfer>

Тъй като в момента игнорираме падежа трябва само да направим правило, което да взема граматичните символи на входа и да ги извежда отново.

Първо трябва да се дефинират категории и атрибути. Категориите и атрибутите позволяват да групираме граматични символи. Категориите позволяват да групуираме символи за съвпадение, например 'n.*' за всички съществителни(nouns). Атрибутите позволяват да се групират символи, от които може да се избира. Например 'sg' и 'pl' могат да се групират в атрибута число (number).

Нека да добавим необходимите раздели:

<section-def-cats>

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

</section-def-attrs>

Тъй като само спрягаме съществителните в единствено и множествено число трябва да добавим категория за съществителни и атрибут за число. Нещо като следващото ще бъде достатъчно:

В section-def-cats се добавя:

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

Това прихваща всички съществителни (леми след които има <n> и след това каквото и да е друг) и се отнася към тях като с "nom"(ще демонстрираме използването му по-късно).

В секцията section section-def-attrs се добавя:

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

и след това

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

Първото дефинира атрибута nbr(номер), който може да бъде и в единствено(sg) и в множествено число(pl).

Второто дефинира атрибута a_nom (атрибут съществително).

Следва да добавим секция за глобални променливи:

<section-def-vars>

</section-def-vars>

Тези променливи се използват за съхранение или трансфер на атрибути между правила. Необходимо ни е само едно за сега:

<def-var n="number"/>

Накрая добавяме правило, което да приеме съществителното и да го генерира в правилната форма. Ще ни трябва секция с правила...

<section-rules>

</section-rules>

Като сменяме стъпката от предишния пример ще покажем правилото, след това ще го разгледаме, отколкото наобратно.

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

Първия таг е очевиден, той дефинира правило. Втория таг основно казва: "приложи правилото, ако примера е намерен". В този случай примера се състои от едно съществително (дефинирано от категорията nom). Забележете, че примерите се съпоставят по правилото на по-дългото съвпадение е първо. Така че ако имате три правила, пърото прихваща "<prn><vblex><n>", второто прихваща "<prn><vblex>", третото прихваща "<n>", примера който ще съвпадне и правилото, което ще се изпулни е първото.

За всеки пример има свързано действие, което генерира определен изход. Изхода е лексическа мярка (lu).

Клип тага позволява на потребителя да избира и манипулира атрибути и части на лексическия параграф на входния език (side="sl"), или изходния език (side="tl").

Нека да го компилираме и да го тестваме. Правилата за трансфер се компилират с:

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

Файла trules-sh-en.bin ще бъде създаден.

Сега вече сме готови да тестваме нашата система за машинен превод. Липсва една важна част, част на говора (PoS) тагер, но той ще бъде описан скоро. Междувременно можем да тестваме по следния начин:

Първо да анализираме думата gramofoni:

$ echo "gramofoni" | lt-proc sh-en.automorf.bin 
^gramofon/gramofon<n><pl>$

Обикновенно тук тагера PoS ще избере правилната версия на базата на част от речта, но тъй като нямаме PoS тагер все още можем да използваме следния елементарен gawk скрипт (благодарение на Segio), който просто ще ни даде първия елемент, който е получен.

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

Сега нека да обработим резултата с правило за трансфер:

$ 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

Това ще ни даде:

^gramophone<n><pl>$^@
  • 'gramophone' е изходният език (side="tl") лема (lem) на позиция 1 (pos="1").
  • '<n>' е a_nom на изходния език на позиция 1.
  • '<pl>' е атрибута за число (nbr) на изходния език на позиция 1.

Опитайте се да коментирате едно от тези клипови твърдения, да компилирате отново и да видите какво се случва.

Така, сега имаме изхода от прехвърлянето, единственото което остава е да се генерират спрегнатите форми на изходния език. За тази цел ние използваме lt-proc, но в режим на генериране (-g), не на анализ.

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

И c'est ca. Сега имате система за машинен превод, която превежда съществително от сърбо-хърватски в съществително на английски. Очевидно това не е много полезно, но скоро ще се спрем на по-сложните неща. А, и не се тревожете за символа '@', ще обясня това скоро.

Помислете за няколко други думи, които се спрягат по същия начин като грамофон. Какво ще кажете за добавянето на тези. Не трябва да добавяме никакви парадигми, само записите в главната секция на едноезичните и двуезичните речници.

Да вкараме глаголите в играта[edit]

Добре, имаме система, която превежда съществителни, но това е доста безполезно, ние искаме също така да превеждаме глаголи и дори цели изречения! Какво ще кажете да започнем с глагола, за да видите. В сърбо-хърватския това е videti. Сърбо-хърватският е език с нулев подлог, това означава, че обикновено не използва лични местоимения преди спрегнатата форма на глагола. При английския не е така. Например: Аз виждам на английски би било преведено като vidim на сърбо-хърватски.

  • Vidim
  • виждам<p1><sg>
  • Аз виждам

Забележка: <p1> обозначава първо лице

Това ще бъде важно когато трябва да напишем правилото за прехвърляне на глаголи. Други примери за нулев подлог включват: испански, румънски и полски. Също така има и последицата, че докато ние само се нуждаем да добавим глагола в сърбо-хърватския морфологичен речник, трябва да добавим както глагола, така и личните местоимения в английският морфологичен речник. Ще минем и през двете.

Другите форми на глагола videti са: vidis, vidi, vidimo, vidite, and vide; които съответстват на: ти виждаш (единствено), той вижда, ние виждаме, вие виждате (множествено число) и те виждат.

Има две форми на ти виждаш(you see), едната е в множествено и формално единствено число (vidite) и другата е в единствено неформално число (vidis).

Ще се опитаме да преведем изречението: "Vidim gramofoni" в "Виждам грамофони". Всъщност, само ще добавим достатъчно информация да направим превода и ще оставим попълването на парадигмите (добавянето на другото спрежение на глагола) като задача на читателя.

Проницателният читател вече ще е разбрал, че не можем просто да преведем vidim gramofoni, защото не е граматичeски правилно изречение на сърбо-хърватски. Правилното изречение би било vidim gramofone, като съществителното е във винителен падеж. Ще трябва също да добавим тази форма, няма нужда обаче за сега да се добавя информация за падежа , просто го добавяме като друга опция за множествено число. Така че, просто копирайте 'e' за 'i' и променете 'i' на 'e'.

Първото нещо, което трябва да направим е да добавим повече символи. Първо трябва да добавим символ за 'глагол', което ще наречем "vblex" (това означава лексикален глагол, обратно на модални глаголи и други типове). Глаголите имат 'лице' и 'време' заедно с число, така че нека да добавим също така няколко от тези. Трябва да преведем "Аз виждам", така че за лице трябва да добавим "p1" или 'първо лице' и за време "pri" или 'сегашно изявително'.

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

След като сме приключили с това, същото със съществителните, добавяме парадигма за спрягането на глагола. Първият ред ще бъде:

<pardef n="vid/eti__vblex">

'/' се използва да разграничава къде се добавят stems-ите (частите между таговете <l> </l>).

След това окончанието за първо лице, единствено число:

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

'im' обозначава края (като при 'vidim'), необходимо е да се добави 'eti' към секцията <r>, тъй като това ще бъде отрязано от дефиницията. Останалото е сравнително лесно, 'vblex' е лексикален глагол, 'pri' е сегашно изявително наклонение, 'p1' е първо лице и 'sg' е единствено число. Можем също да добавим множественото число, което ще бъде същото, освен 'imo' вместо 'im' и 'pl' вместо 'sg'.

След това трябва да добавим лема, парадигмично картографиране към главния раздел:

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

Забележка: съдържанието на <i> </i> е коренът, не лемата.

Това е работата по сърбо-хърватския речник, която сме свършили за сега. Нека да го компилираме и изпробваме.

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

Добре, сега правим същото и за английския речник (не забравяйте да добавите същите символни дефиниции, каквито добавихте за сърбо-хърватския речник).

Парадигмата е:

<pardef n="s/ee__vblex">

защото миналото време е 'видях'. Сега можем да направим едно от двете неща, можем да добавим и първо, и второ лице, но те са в една и съща форма. Фактически, всички форми (освен трето лице, единствено число) на глагола 'да видя' са 'виждам'. Така че вместо това ние правим само един запис за 'виждам' и му задаваме само символа 'pri'.

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

и както винаги, запис в главния раздел:

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

Тогава нека да запишем, да прекомпилираме и изпробваме:

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

Сега за задължителния запис в двуезичния речник:

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

(отново, не забравяйте да добавите sdefs от по-рано)

И прекомпилираме:

$ 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

Сега изпробваме:

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

Анализът преминава правилно, но когато се опитаме да генерираме повърхностна форма, получаваме '#' като по-долу:

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

Като '#' означава, че генераторът не може да генерира правилната лексикална форма, защото не я съдържа. Защо се получава така?

Принципно, анализите не съвпадат, 'виждам' в речника е виждам<vblex><pri>, но виждам получено от трансфера е виждам<vblex><pri><p1><sg>. В сърбо-хърватската страна има повече информация отколкото английската страна се нуждае. Можете да изпробвате това като добавите липсващите символи към английския речник, и след това прекомпилирате и тествате отново.

Все пак, по-парадигматичен начин да се погрижим за това е като напишем правило. Така, отваряме файлът с правилата (apertium-sh-en.trules-sh-en.xml в случай, че сте забравили).

Трябва да добавим нова категория за 'глагол'.

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

Също така трябва да добавим атрибути за глаголно време и лице. Ще го направим много просто за сега, можете да добавите p2 и p3, но аз няма да го направя, за да спестя място.

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

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

Трябва също да добавим атрибут за глаголи.

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

Сега върху правилото:

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

Спомнете си когато се опитахте да махнете коментара на 'clip' таговете в предишния пример с правило и те изчезнаха от трансфера, ами, това е доста от което правим тук. Въвеждаме глагол с пълен анализ, но извеждаме само частичен анализ (лема + таг на глагола + таг на глаголното време).

Така че сега ако го прекомпилираме, получаваме:

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

и:

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

Опитайте с 'vidimo' (ние виждаме) да видите дали получавате правилния изход.

Сега опитайте с "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\@

Но какво да кажем за личните местоимения?[edit]

Ами, това е страхотно, но все още ни липсва личното местоимение, което е необходимо за английския. За да го добавим, трябва първо да редактираме английският морфологичен речник.

Като преди, първото нещо да направим е да добавим необходимите символи:

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

От двата символа, prn е местоимение и subj е подлог (като в подлога на изречение).

Защото няма корен или 'лема' за подлози лични местоимения, просто добавяме pardef както следва:

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

Като 'prsubj' е 'личен подлог'. Останалите от тях (Вие, Ние и др.) са оставени като упражнение за читателя.

Можем да добавим запис към основния раздел както следва:

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

Така, записваме, прекомпилираме и тестваме, и трябва да получим нещо като:

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

(Забележка: в главни букви е, защото 'I' е с главни букви).

Сега трябва да коригираме правилото за 'глагол' да изкара подлог лично местоимение заедно с правилната форма на глагола.

Първо, добавяме категория (това трябва да бъде доста прозаично за сега):

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

Сега добавяме типовете местоимение като атрибути, можем да добавим и типа 'obj' като сме на него, въпреки че няма да ни трябва за сега:

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

И сега да въведем правилото:

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

Това е почти същото правило като преди, само ще направим няколко малки промени.

Трябваше да изкараме:

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

така че генераторът да може да избере правилното местоимение и правилната форма на глагола.

Така че накратко:

  • <lit>, отпечатва буквен низ, в този случай "prpers"
  • <lit-tag>, отпечатва буквен таг, защото не можем да вземем таговете от глагола ги добавяме сами, "prn" за местоимение и "subj" за подлог.
  • , отпечатва празно пространство.

Забележете, че получихме информацията за номер и време директно от глагола.

Така, сега ако го прекомпилираме и тестваме отново:

$ 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

Което, макар и да не е точно проза на лауреат (много харесвам това HOWTO), е относително точен превод.

Кажи ми за грамофона (Мултидуми)[edit]

Докато грамофон е английска дума, това не е най-добрият превод. Грамофон обикновено се използва за много стар вид, който вие познавате с игла вместо с щифт без усилване. По-добър превод би бил 'record player'('записващ плейър'). Въпреки че това е повече от една дума, може да го разглеждаме като, че е една дума като използваме конструкции на мултидуми (multipalabra).

Не трябва да пипаме сърбо-хърватския речник, само английския и двуезичния, така че го отворете.

Множественото число на 'record player' е 'record players', така че да приема същата парадигма като грамофон (gramophone__n) — при това ние просто добавихме 's'. Всичко, което е необходимо да направим е да добавим нов елемент към главния раздел.

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

Единственото различно тук е използването на тага , въпреки че това не е изцяло ново както го видяхме в употреба във файлът с правила.

Така, прекомпилираме и тестваме в старата последователност:

$ 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

Перфектно. Голяма полза от използването на мултидуми е, че можете да превеждате идиоматични изрази дословно, без да се налага да превеждате дума-по-дума. Например английската фраза "at the moment"("в момента") би била преведена на сръбско-хърватски като "trenutno" (trenutak = moment, trenutno е наречие на това) — преводът на тази английска фраза в сърбо-хърватски не би бил възможен дума по дума.

Справяне с незначително изменение[edit]

Сърбо-хърватският обикновено има няколко начина за изписване на всяка дума заради диалектните варианти. Има яка фонетична писмена система, така че се пише както се изговаря. Например, хората говорещи в Ijekavian биха казали "rječnik", докато някой говорещ Ekavian би казал "rečnik", което отразява разликите в произношението на прото-славянската гласна yat.

Анализ[edit]

Трябва да има относително лесен начин за справяне с това, и има, отново чрез използване на парадигми. Парадигми не се използват само за добавяне на граматични символи, но те също така могат да бъдат използвани да заменят всеки знак/символ с друг. Например, ето парадигма за приемане на "e" и "je" в анализа. Парадигмата трябва, както другите, да отиде в едноезичния сърбо-хърватски речник.

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

Тогава в "основния раздел":

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

Но това само ни позволява да анализираме двете форми... необходима е повече работа, ако искаме да генерираме и двете форми.

Възпроизвеждане[edit]

Виж също[edit]