Difference between revisions of "Як створити нову мовну пару"
(corrected most of the incorrect declensions and conjugations, minor punctuation and other edits) |
|||
Line 1: | Line 1: | ||
Як створити нову мовну пару |
=Як створити нову мовну пару= |
||
Цей документ містить пояснення, як створити нову мовну пару для системи машинного перекладу Apertium з нуля. |
|||
Вам не треба знати багато про лінгвистику або машинний переклад, |
Вам не треба знати багато про лінгвистику або машинний переклад, достатньо буде розрізняти іменники й дієслова (та прийменники і т.д). |
||
==Вступ== |
|||
==Введення== |
|||
Apertium є, як ви певно зрозуміли, |
Apertium є, як ви, певно, зрозуміли, системою машинного перекладу. Ну, не зовсім, це --- платформа машинного перекладу. Вона забезпечує вас рушієм (англ. "engine") та інструментами, з їхньою допомогою ви можете створювати ваші власні системи машинного перекладу. Ви тільки повинні записати дані. Дані скаладаються з трьох словників та кількох правил (які забезпечують перестановку слів та інші грамматичні речі). |
||
За |
За більш детальною інформацією ви можете звернутись до цього сайту з відмінимми статтями: [[Publications]] |
||
==Вам |
==Вам знадобляться== |
||
* lttoolbox (>= 3.0.0) |
* lttoolbox (>= 3.0.0) |
||
Line 18: | Line 18: | ||
* текстовий редактор (або спеціальний XML редактор, якщо вам так хочеться) |
* текстовий редактор (або спеціальний XML редактор, якщо вам так хочеться) |
||
Цей документ не пояснює, як встановлювати ці пакети, за більш детальною інформацією будь ласка відвідайте документаційну секцію на сайті Apertium. |
|||
==Із чого |
==Із чого зроблено мовну пару== |
||
Apertium являє собою систему машинного перекладу поверхнево-передачного типу. В основному він має справу зі словниками та правилами |
Apertium являє собою систему машинного перекладу поверхнево-передачного типу. В основному він має справу зі словниками та правилами поверхневої передачі. На практиці поверхнева передача відрізняється від глибокої передачі тим, що при ній не виконується повний синтаксичний розбір речіннь, а правила, на відміну від операцій на дереві синтаксичного розбору, являють собою операції з групами лексичних одиниць. На базовому рівні є три головних словники: |
||
# Морфологічний словник для мови xx: він містить правила про зміну слов у мові xx. У нашому прикладі цей словник буде називатися так: apertiumh-en.sh.dix |
# Морфологічний словник для мови xx: він містить правила про зміну слов у мові xx. У нашому прикладі цей словник буде називатися так: apertiumh-en.sh.dix |
||
# Морфологічний словник для мови yy: він, у свою чергу, містить інформацію про зміну слов у мові yy. У нашому прикладі він |
# Морфологічний словник для мови yy: він, у свою чергу, містить інформацію про зміну слов у мові yy. У нашому прикладі він матиме назву: apertium-en.en.dix |
||
# Двомовний словник: містить перекладні відповідності слів і символів |
# Двомовний словник: містить перекладні відповідності слів і символів обох мов. Він буде називатися так: apertium-sh-en.sh-en.dix |
||
У мовній парі будь-яка з мов, що складають цю пару, може бути як вхідною, так і вихідною мовою, тобто ці терміни вживаються умовно. |
У мовній парі будь-яка з мов, що складають цю пару, може бути як вхідною, так і вихідною мовою, тобто ці терміни вживаються умовно. |
||
Мовну пару |
Мовну пару складають також два файли з правилами передачі. Це правила, які керують перестановкою слів у реченнях, наприклад, chat noir -> кіт чорний -> чорний кіт. Також ці правила забезпечують узгодження роду у реченні, числа і т.д. Вони також можуть використовуватися і для вставки або видалення лексичних одиниць, як це буде описано нижче. Ці файли мають наступний вигляд: |
||
* Правила передачі з мови xx до мови yy: |
* Правила передачі з мови xx до мови yy: цей файл містить правила, що описують перетворення, які повинні бути застосовані при перекладі з мови xx на мову yy. У нашому прикладі це: apertium-sh-en.sh-en.t1x |
||
* Правила передачі з мови yy до мови xx: цей файл містить правила, що описують перетворення, які повинні бути |
* Правила передачі з мови yy до мови xx: цей файл містить правила, що описують перетворення, які повинні бути застосовані при перекладі з мови yy на мову xx. У нашому прикладі цей файл буде називатися так: apertium-sh-en.en-sh.t1x |
||
Багато з існуючих мовних пар містять інші файли, але ми не будемо розглядати їх в даному керівництві. Нам достатньо |
Багато з існуючих мовних пар містять інші файли, але ми не будемо розглядати їх в даному керівництві. Нам достатньо цих файлів для створення функціональної системи. |
||
==Мовна |
==Мовна пара== |
||
Ви могли здогадатися з назв файлів, що для опису порядку створення базової системи в цьому керівництві будуть використовуватися приклади перекладу з сербохорватської на англійську мову. Зауважимо, що це не ідеальна пара, так як система працює краще зі спорідненими мовами. Однак у випадку простих прикладів, які приводяться тут, ми не зіткнемося з якими-небудь проблемами. |
Ви могли здогадатися з назв файлів, що для опису порядку створення базової системи в цьому керівництві будуть використовуватися приклади перекладу з сербохорватської на англійську мову. Зауважимо, що це не ідеальна пара, так як система працює краще зі спорідненими мовами. Однак у випадку простих прикладів, які приводяться тут, ми не зіткнемося з якими-небудь проблемами. |
||
Line 45: | Line 45: | ||
Перед тим як продовжити, слід пояснити значення деяких термінів. |
Перед тим як продовжити, слід пояснити значення деяких термінів. |
||
Першим з них є лема. Лема - це канонічна форма слова, слово без граматичної інформації. Наприклад, лемою слова коти є кіт. В англійській мові лема розглянутого іменника як правило співпадає з його формою однини. Для дієслів в англійській мові лема маєть вигляд інфінітива без ''to'' (або просто інфінітива в |
Першим з них є лема. Лема - це канонічна форма слова, слово без граматичної інформації. Наприклад, лемою слова коти є кіт. В англійській мові лема розглянутого іменника як правило співпадає з його формою однини. Для дієслів в англійській мові лема маєть вигляд інфінітива без ''to'' (або просто інфінітива в українській мові). Наприклад, лемою слова was буде be, також як лемою слова був буде бути. |
||
Другим терміном є |
Другим терміном є ''символ''. У контексті Apertium символ означає граматичний знак. Слово коти є іменником в множині, отже, воно буде мати символ іменника та символ множини. На вході та виході модулів Apertium ці символи, зазвичай, беруться в кутові дужки, як показано нижче: |
||
* <n>; Для іменника. |
* <n>; Для іменника. |
||
* <pl>; Для множини. |
* <pl>; Для множини. |
||
Іншими прикладами символів є <sg> (однина), <p1> (перша особа), <pri> (теперішній час дійсного способу) та інші. Треба зауважити, що в багатьох з існуючих мовних пар символи мають вигляд акронімів чи скорочень каталанською |
Іншими прикладами символів є <sg> (однина), <p1> (перша особа), <pri> (теперішній час дійсного способу) та інші. Треба зауважити, що в багатьох з існуючих мовних пар символи мають вигляд акронімів чи скорочень каталанською мовою. Наприклад, vbhaver - від vb (дієслово) та haver ("мати" каталонською). Символи визначаються в тегах <sdef> та використовуються в тегах <nowiki><s></nowiki> |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
* Happy, happ (y, ier, iest) |
* Happy, happ (y, ier, iest) |
||
* Lazy, laz (y, ier, iest) |
* Lazy, laz (y, ier, iest) |
||
ми можемо записати закінчення форм слова happy, а потім написати що "lazy відмінюється як happy", або "shy відмінюється як happy", "naughty відмінюється як happy", "friendly відмінюється як happy" і т.д. У цьому прикладі happy буде парадигмою, моделлю зміни всіх інших. Точний опис визначення парадигм буде дано пізніше. Парадигми визначаються в тегах <pardef> та використовуються в тегах <par>. |
ми можемо записати закінчення форм слова happy, а потім написати, що "lazy відмінюється як happy", або "shy відмінюється як happy", "naughty відмінюється як happy", "friendly відмінюється як happy" і т.д. У цьому прикладі happy буде парадигмою, моделлю зміни всіх інших. Точний опис визначення парадигм буде дано пізніше. Парадигми визначаються в тегах <pardef> та використовуються в тегах <par>. |
||
==Як починати== |
==Як починати== |
||
Line 67: | Line 68: | ||
{{see-also|List of dictionaries|Incubator}} |
{{see-also|List of dictionaries|Incubator}} |
||
Почнімо зі створення нашого першого словника вхідної мови. Власне словник є XML-файлом. Відкрийте ваш текстовий редактор та введіть: |
|||
<pre> |
<pre> |
||
Line 76: | Line 77: | ||
</pre> |
</pre> |
||
Поки що файл визначає, що ми хочемо почати створювати словник. Щоб цей файл був більш корисним, ми повинні додати в нього ще кілька записів, першим з яких буде абетка. Вона визначає набір букв, які можуть використовуватися в словнику для сербохорватської мови. Цей запис виглядає як показано нижче та містить усі літери сербохорватської абетки: |
|||
<pre> |
<pre> |
||
Line 82: | Line 83: | ||
</pre> |
</pre> |
||
Розмістіть абетку після тега <dictionary>. |
|||
Далі нам необхідно визначити деякі символи. Почнемо з простіших - іменник (n) в однині (sg) та множині (pl). |
Далі нам необхідно визначити деякі символи. Почнемо з простіших - іменник (n) в однині (sg) та множині (pl). |
||
Line 96: | Line 97: | ||
Імена символів не обов'язково повинні бути такими короткими, ви можете писати їх повністю, але, так як робити це доведеться багато разів, краще скорочувати. |
Імена символів не обов'язково повинні бути такими короткими, ви можете писати їх повністю, але, так як робити це доведеться багато разів, краще скорочувати. |
||
На жаль, все не так просто - іменники в |
На жаль, все не так просто - іменники в сербохорватській мові мають не тільки категорію числа, а також і категорії роду та відмінка. Однак для нашого прикладу ми будемо припускати, що іменник є іменником чоловічого роду у називному відмінку (приклад можна знайти в кінці цього документа). |
||
Тепер визначимо розділ для парадигм, |
Тепер визначимо розділ для парадигм, |
||
Line 105: | Line 106: | ||
</pardefs> |
</pardefs> |
||
</pre> |
</pre> |
||
и раздел для словаря: |
|||
и розділ для словника: |
|||
<pre> |
<pre> |
||
<section id="main" type="standard"> |
<section id="main" type="standard"> |
||
Line 112: | Line 115: | ||
</pre> |
</pre> |
||
Є два види розділів. |
Є два види розділів. Перший --- стандартний розділ, він містить слова, енклітики, тощо. Другий --- безумовний розділ, що містить знаки пунктуації і подібне. У нашому прикладі немає безумовного розділу, хоча ми покажемо його пізніше |
||
Таким чином, наш файл буде виглядати так: |
Таким чином, наш файл буде виглядати так: |
||
Line 133: | Line 136: | ||
</pre> |
</pre> |
||
Тепер ми маємо основну частина словника, |
Тепер, коли ми маємо основну частина словника, ми можемо перейти до додавання іменника. Ним буде слово 'gramofon'. |
||
Так як |
Так як визначених раніше парадигм у нас немає, насамперед потрібно визначити парадигму. |
||
Нагадаємо, що ми маємо на увазі чоловічий рід |
Нагадаємо, що ми маємо на увазі чоловічий рід у називному відмінку. Формою однини є 'gramofon', формою множини --- 'gramofoni'. Таким чином: |
||
<pre> |
<pre> |
||
Line 156: | Line 159: | ||
</pre> |
</pre> |
||
Зауважте що конструкція <l/> (еквівалент <l></l>) означає, що в однині |
Зауважте що конструкція <l/> (еквівалент <l></l>) означає, що в однині до основи нічого не приєднується. |
||
Все це може здатися досить багатослівним способом опису, але |
Все це може здатися досить багатослівним способом опису, але для цього є причини та ви швидко звикнете. Ви, напевно, вже гадаєте, що означають всі ці <e>, <l> та <r>? |
||
* e значить |
* e значить запис (entry). |
||
* p значить пара (pair). |
* p значить пара (pair). |
||
* l значить наліво (left). |
* l значить наліво (left). |
||
* r значить направо (right). |
* r значить направо (right). |
||
Чому вліво та вправо? Морфологічні словники будуть пізніше скомпільовані у кінцеві автомати. Компіляція зліва направо створює аналізи слів, а справа наліво - слова з аналізів. Наприклад: |
Чому вліво та вправо? Морфологічні словники будуть пізніше скомпільовані у кінцеві автомати. Компіляція зліва направо створює аналізи слів, а справа наліво --- слова з аналізів. Наприклад: |
||
<pre> |
<pre> |
||
* gramofoni ( |
* gramofoni (зліва направо) gramofon<n><pl> (аналіз) |
||
* gramofon<n><pl> ( |
* gramofon<n><pl> (справа наліво) gramofoni (генерація) |
||
</pre> |
</pre> |
||
Ми визначили парадигму, тепер потрібно співвіднести її з лемою - gramofon. Ця дія виконується в раніше визначеному розділі. |
Ми визначили парадигму, тепер потрібно співвіднести її з лемою --- gramofon. Ця дія виконується в раніше визначеному розділі. |
||
Записом, який потрібно додати до < section >, є: |
|||
<pre> |
<pre> |
||
Line 180: | Line 183: | ||
</pre> |
</pre> |
||
Коротке пояснення до скорочень: |
|||
* lm означає лема (lemma). |
* lm означає лема (lemma). |
||
* i означає ідентичність (identity) |
* i означає ідентичність (identity), однаковий як при аналізі так і генерації. |
||
* par означає парадигма (paradigm). |
* par означає парадигма (paradigm). |
||
Цей запис визначає лему слова, gramofon, корінь слова, gramofon, та парадигму відмінювання цього слова gramofon_n. Різниця між лемою та коренем |
Цей запис визначає лему слова, gramofon, корінь слова, gramofon, та парадигму відмінювання цього слова gramofon_n. Різниця між лемою та коренем полягає в тому, що лема --- це "цитована форма" слова, у той час як корінь є частиною леми, до якої приєднуються суфікси та закінчення. Ця різниця стане зрозумілою, коли ми дійдемо до запису з різними лемою та коренем. |
||
Тепер ми можемо перевірити наш словник. Збережіть його та поверніться до командного рядка. Насамперед ми повинні скомпілювати |
Тепер ми можемо перевірити наш словник. Збережіть його та поверніться до командного рядка. Насамперед ми повинні скомпілювати словника (за допомогою lt-comp), потім ми зможемо перевірити його (за допомогою lt-proc). |
||
<pre> |
<pre> |
||
Line 200: | Line 203: | ||
</pre> |
</pre> |
||
Так як ми компілювали зліва направо, ми створили аналізатор. |
Так як ми компілювали зліва направо, ми створили аналізатор. Створімо і генератор: |
||
<pre> |
<pre> |
||
Line 206: | Line 209: | ||
</pre> |
</pre> |
||
Команда повинна видати |
Команда повинна видати так само. |
||
Тепер ми можемо протестувати їх. Запустіть lt-proc в аналізаторі. |
Тепер ми можемо протестувати їх. Запустіть lt-proc в аналізаторі. |
||
Line 214: | Line 217: | ||
</pre> |
</pre> |
||
Тепер перевірте - введіть ''gramofoni'', та |
Тепер перевірте --- введіть ''gramofoni'', та подивіться на результат: |
||
<pre> |
<pre> |
||
Line 220: | Line 223: | ||
</pre> |
</pre> |
||
Тепер зробіть те ж саме для англійського словника, але замініть слово''gramofon''англійським словом ''gramophone'' і поміняйте закінчення множини (тобто''i''на''s'') А що робити, якщо ви захочете використовувати більш правильний переклад 'record player'? Це ми пояснимо пізніше. |
Тепер зробіть те ж саме для англійського словника, але замініть слово ''gramofon'' англійським словом ''gramophone'' і поміняйте закінчення множини (тобто ''i'' на ''s''). А що робити, якщо ви захочете використовувати більш правильний переклад 'record player'? Це ми пояснимо пізніше. |
||
Тепер в |
Тепер в теці у вас повинно бути два файли: |
||
* apertium-sh-en.sh.dix, який містить (дуже) маленький сербохорватський морфологічний словник, та |
* apertium-sh-en.sh.dix, який містить (дуже) маленький сербохорватський морфологічний словник, та |
||
* apertium-sh-en.en.dix, який містить (дуже) маленький англіський морфологічний словник. |
* apertium-sh-en.en.dix, який містить (дуже) маленький англіський морфологічний словник. |
||
=== |
===Двомовний словник=== |
||
Таким чином, у нас є два морфологічних словника, тепер ми перейдемо до |
Таким чином, у нас є два морфологічних словника, тепер ми перейдемо до створення двомовного словника. Двомовний словник описує відповідності слів. Всі словники мають один і той же формат (якій описаний в DTD, dix.dtd). |
||
Створіть новий файл з ім'ям ''apertium-sh-en.sh-en.dix'' та вставте наступну основу словника: |
Створіть новий файл з ім'ям ''apertium-sh-en.sh-en.dix'' та вставте наступну основу словника: |
||
Line 249: | Line 252: | ||
</pre> |
</pre> |
||
Тепер ми повинні додати запис (в <section>) для здійснення перекладу слів: |
Тепер ми повинні додати запис (в < section >) для здійснення перекладу слів: |
||
<pre> |
<pre> |
||
Line 255: | Line 258: | ||
</pre> |
</pre> |
||
Так як у словнику таких записів дуже багато, для зручності читання їх зазвичай пишуть в один рядок. Знову 'l' і 'r', так? Все просто - ми компілюємо зліва направо для створення '' |
Так як у словнику таких записів дуже багато, для зручності читання їх зазвичай пишуть в один рядок. Знову 'l' і 'r', так? Все просто --- ми компілюємо зліва направо для створення словника ''сербохорватська → англійська'', а справа наліво для створення ''англійська → сербохорватська''. |
||
Коли все це зроблено, виконайте наступні команди: |
Коли все це буде зроблено, виконайте наступні команди: |
||
<pre> |
<pre> |
||
Line 270: | Line 273: | ||
</pre> |
</pre> |
||
Для створення морфологічних аналізаторів (automorf), морфологічних генераторів (autogen) та пошуковців слів (autobil), слово "bil" означає "bilingual", |
Для створення морфологічних аналізаторів (automorf), морфологічних генераторів (autogen) та пошуковців слів (autobil), слово "bil" означає "bilingual", тобто "двомовний". |
||
===Правила трансферу=== |
===Правила трансферу=== |
||
Тепер ми маємо два морфологічних словника та один двомовний словник. Все що нам залишолось |
Тепер ми маємо два морфологічних словника та один двомовний словник. Все що нам залишолось, це написати правила трансферу для іменників. Файли з правилами трансферу мають свій власний DTD (transfer.dtd), який може бути знайдений в пакеті Apertium. Якщо вам потрібно написати правило трансферу, то часто має сенс спочатку звернутися до файлів з правилами для інших мовних пар, так як багато правил можуть бути використані для різних мовних пар. Або ж ці правила можна використовувати в модифікованому вигляді. Наприклад, правило, наведене нижче, може бути використано для всіх нуль-суб'єктних мов. |
||
Основна частина файлу така же: |
Основна частина файлу така же: |
||
<pre> |
<pre> |
||
Line 288: | Line 290: | ||
Так як ми не враховуємо відмінки (тобто можливі зміни відмінків при перекладі), нам необхідно створити правило, яке би просто "брало" граматичні символи на вході і, у свою чергу, видавало їх. |
Так як ми не враховуємо відмінки (тобто можливі зміни відмінків при перекладі), нам необхідно створити правило, яке би просто "брало" граматичні символи на вході і, у свою чергу, видавало їх. |
||
Спочатку нам слід визначити категорії та атрибути. Категорії та атрибути дозволяють об'єднувати граматичні символи. За допомогою категорій ми можемо об'єднувати символи для їх " |
Спочатку нам слід визначити категорії та атрибути. Категорії та атрибути дозволяють об'єднувати граматичні символи. За допомогою категорій ми можемо об'єднувати символи для їх "зведення воєдино" (наприклад, категорія 'n. *' об'єднує всі іменники). Атрибути дозволяють нам об'єднувати символи, з яких ми далі можемо вибрати потрібний нам (наприклад, 'sg' та 'pl' можуть бути об'єднані атрибутом 'number'). |
||
Додамо необхідні розділи: |
Додамо необхідні розділи: |
||
Line 301: | Line 303: | ||
</pre> |
</pre> |
||
Іменники в нашому прикладі змінюються тільки |
Іменники в нашому прикладі змінюються тільки у числі, отже, необхідно додати категорію для іменників та атрибут числа. Досить наступних записів: |
||
В розділ section-def-cats додайте: |
В розділ section-def-cats додайте: |
||
Line 328: | Line 330: | ||
</pre> |
</pre> |
||
Перший запис визначає атрибут nbr (number = число), яке може бути або |
Перший запис визначає атрибут nbr (number = число), яке може бути або одниною (sg), або множиною (pl). |
||
Другий запис визначає атрибут a_nom (атрибут іменник). |
Другий запис визначає атрибут a_nom (атрибут іменник). |
||
Line 373: | Line 375: | ||
</pre> |
</pre> |
||
Перший тег очевидний - він визначає правило. Другий тег,''pattern'', означає "застосовувати це правило, якщо знайдено цей шаблон". У цьому прикладі шаблон складається з одного іменника ( |
Перший тег очевидний --- він визначає правило. Другий тег, ''pattern'', означає "застосовувати це правило, якщо знайдено цей шаблон". У цьому прикладі шаблон складається з одного іменника (визначеного категорією nom). Зауважте, що шаблони накладаються в режимі "найдовше співпадіння". Так, якщо у вас є три правила, перше з яких належить до сполук слів, що відповідають шаблону "<prn><vblex><n>", друге --- шаблону "<prn><vblex>" та третє --- шаблону "<n>", вживаним (у разі відповідності сполук слів цим шаблонам) правилом буде перше. |
||
Кожному шаблону відповідає певна дія, яка генерує відповідні |
Кожному шаблону відповідає певна дія, яка генерує відповідні вихідні дані. Вихідними даними (висновком) є лексична одиниця (lu, lexical unit). |
||
Тег ''clip'' дозволяє користувачеві вибирати атрибути або частини лексичної одиниці |
Тег ''clip'' дозволяє користувачеві вибирати атрибути або частини лексичної одиниці вхідної (side = "sl") або вихідної (side = "tl") мови та маніпулювати ними. |
||
Скомпілюймо та перевіримо файл. Правила трансферу компілюються так: |
|||
<pre> |
<pre> |
||
Line 387: | Line 389: | ||
що створить файл <code>sh-en.t1x.bin</code>. |
що створить файл <code>sh-en.t1x.bin</code>. |
||
Тепер все готово для перевірки нашої системи машинного перекладу. У нас ще немає одного важливого компонента, а саме, |
Тепер все готово для перевірки нашої системи машинного перекладу. У нас ще немає одного важливого компонента, а саме, інструмента частиномовної розмітки (PoS tagger, part-of-speech tagger), однак незабаром це питання буде поясненно. Поки ми можемо перевірити систему і без нього. |
||
Спочатку проаналізуємо слово "gramofoni": |
Спочатку проаналізуємо слово "gramofoni": |
||
Line 396: | Line 398: | ||
</pre> |
</pre> |
||
Після цього |
Після цього інструмент частиномовної розмітки повинен вибрати правильний варіант (правильну частину мови), але так як його поки у нас немає, ми можемо використовувати маленький gawk-скрипт (спасибі Sergio), який буде видавати перший з отриманих результатів. |
||
<pre> |
<pre> |
||
Line 424: | Line 426: | ||
Спробуйте видалити один з цих clip-рядків, перекомпілювати файл і подивиться, що станеться. |
Спробуйте видалити один з цих clip-рядків, перекомпілювати файл і подивиться, що станеться. |
||
Тепер у нас є вивід трансферу, і єдине, що залишається зробити |
Тепер у нас є вивід трансферу, і єдине, що залишається зробити --- це згенерувати словоформи (тобто належним чином відмінені або дієвідмінені форми) вихідною мовою. Для цього використовується той самий lt-proc, але в іншому режимі --- в режимі генерування. |
||
<pre> |
<pre> |
||
Line 435: | Line 437: | ||
</pre> |
</pre> |
||
Вуаля. Тепер у вас є система машинного перекладу, яка |
Вуаля. Тепер у вас є система машинного перекладу, яка перекладає сербохорватський іменник англійською мовою. Очевидно, що користі від такої системи не так багато, проте незабаром ми перейдемо до більш складного матеріалу. Про символ '@' теж не турбуйтеся, скоро буде пояснено, що це таке. |
||
Спробуйте знайти / згадати інші слова, які |
Спробуйте знайти / згадати інші слова, які відмінюються так само, як слово "gramofon". Про порядок їх долучення --- нам потрібно додавати лише записи (entries, які ми образно назвали "словниковими статтями") в головних розділах одномовного і двомовного словників, а не парадигми. |
||
==Додамо дієслова== |
==Додамо дієслова== |
||
Так, тепер наша система може |
Так, тепер наша система може перекладати іменники. Однак користі від цього небагато, адже ми хочемо перекладати і дієслова, і навіть цілі речення! Почнемо з дієслова "to see". У сербохорватській йому відповідає "videti". Сербохорватська мова є т.зв. нуль-суб'єктною мовою (сербохорватською перед особистими формами дієслів особисті займенники як правило не використовуються). Англійська ж не є такою. Так, наприклад, англійське "I see" буде перекладено сербохорватською як "vidim". |
||
* Vidim |
* Vidim |
||
Line 447: | Line 449: | ||
* I see |
* I see |
||
Примітка: <code><p1></code> означає перша особа |
Примітка: <code><p1></code> означає перша особа. |
||
Іншими прикладами нуль-суб'єктних мов можуть |
Іншими прикладами нуль-суб'єктних мов можуть слугувати іспанська, румунська та польська. Це буде важливо при написанні правил трансферу для дієслів. |
||
"Нуль-суб'єктність" сербохорватської мови означає, що якщо в сербохорватська |
"Нуль-суб'єктність" сербохорватської мови означає, що якщо в сербохорватська морфологічний словник ми додамо лише дієслово, то в англійський морфологічний словник потрібно буде додати не лише дієслово, а й особисті займенники. |
||
Іншими формами дієслова бачити є: vidiš, vidi, vidimo, vidite, і vide. Відповідно: you see (однина), he sees, we see, you see (множина), і they see. |
Іншими формами дієслова бачити є: vidiš, vidi, vidimo, vidite, і vide. Відповідно: you see (однина), he sees, we see, you see (множина), і they see. |
||
Ми постараємося перекласти |
Ми постараємося перекласти "Vidim gramofoni" з сербохорватської на "I see gramophones" англійською. З метою економії часу ми додамо до словника тільки достатню для перекладу інформацію і залишимо опис парадигми (додавання інших особистих форм дієслова) як вправу для самостійної роботи читачеві. |
||
Уважний читач напевно помітив, що переклад "vidim gramofoni неправильний, так як |
Уважний читач напевно помітив, що переклад "vidim gramofoni" неправильний, так як це речення є граматично некоректним. Граматично правильним реченням є " vidim gramofone ", так як іменник має бути в знахідному відмінку. Так, ми додамо форму знахідного відмінка, проте інформацію про відмінок додавати не будемо (у цьому немає необхідності) --- потрібне нам слово буде фігурувати як другий варіант множини. Для цього необхідно скопіювати (іншими словами, "клонувати") блок 'e' для форми множини й виправити там лiтеру 'i' (у тезі <l >) на 'e'. |
||
Перш за все ми повинні додати кілька нових символів. Для початку символ для дієслова ('verb'), який ми будемо називати "vblex" (lexical verb = |
Перш за все ми повинні додати кілька нових символів. Для початку символ для дієслова ('verb'), який ми будемо називати "vblex" (lexical verb = значуще дієслово, на противагу модальним і іншим дієсловам). Разом з числом (number) дієслова мають категорію особи ('person') і часу ( 'tense'), так що додамо ці символи теж. Нагадаємо, що ми хотіли перекласти "I see" - значить, для особи ми додамо "p1", тобто 'перша особа', а для часу - "pri ", тобто 'present indicative'. |
||
<pre> |
<pre> |
||
Line 473: | Line 475: | ||
</pre> |
</pre> |
||
Знаком '/' розмежовується основа слова, до якої приєднуються які приносить тегів <l>. |
|||
Знак '/' використовується для позначення місць, де додається основа слова (частина між теґами <l> </l>). |
|||
⚫ | |||
⚫ | |||
<pre> |
<pre> |
||
Line 486: | Line 489: | ||
</pre> |
</pre> |
||
'im' |
'im' являється суфіксом першої особи однини (Як у нашому прикладі 'vidim'), у тезі <r> необхідно додати 'eti', суфікс інфинітива. З рештою все просто: 'vblex' є, як вже було згадано вище, скороченням від "lexical verb", 'pri' --- від "present indicative", 'p1' означає "first person" (перша особа) 'sg' є єдиним числом. Можно додати до словника й форму першої особи множини --- у нашій статті треба буде замінити суфікс 'im' суфіксом 'imo', а символ 'sg' символом 'pl'. |
||
Далф нам слід додати до основного розділу лему й співвіднести її з вищенаведеною парадигмою: |
|||
Далее нам следует добавит в основной раздел лемму и соотнести её с вышеописанной парадигмой: |
|||
<pre |
<pre |
||
Line 494: | Line 497: | ||
</pre> |
</pre> |
||
Зверніть увагу: в |
Зверніть увагу: в теґ <nowiki> <i></i></nowiki> пишеться корінь дієслова, не сама лема. |
||
На цьому |
На цьому завершімо складання сербохорватського словника. Скомпілюймо й перевіримо його. |
||
<pre> |
<pre> |
||
Line 507: | Line 510: | ||
</pre> |
</pre> |
||
Тепер |
Тепер зробімо те саме для англійського словника (не забудьте додати в англійський словник визначення символів, що було зроблено на попередньому етапі для сербохорватскоо словника). |
||
Парадигма виглядає так: |
Парадигма виглядає так: |
||
Line 579: | Line 582: | ||
</pre> |
</pre> |
||
Цей символ '#' означає, що генератор не може згенерувати правильну лексичну форму, тому що її нема. Чому це так? |
|||
Просто аналізи не збігаються: 'see' у словнику - це 'see <vblex><pri>', а 'see' доставляється трансфером - 'see<vblex><pri><p1><sg>'. Сербо-хорватська сторона має більше інформації, ніж потрібно англійській стороні. Ви можете перевірити це, додавши символи в англійський словник, |
Просто аналізи не збігаються: 'see' у словнику --- це 'see <vblex><pri>', а 'see' доставляється трансфером --- 'see<vblex><pri><p1><sg>'. Сербо-хорватська сторона має більше інформації, ніж потрібно англійській стороні. Ви можете перевірити це, додавши символи в англійський словник, перекомпілювавши та протестувавши знову. |
||
Але існує більш парадигматичний спосіб це зробити, суть якого полягає у написанні правила. Так що, відкриваємо файл з правилами (apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin, якщо ви забули). |
Але існує більш парадигматичний спосіб це зробити, суть якого полягає у написанні правила. Так що, відкриваємо файл з правилами (apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin, якщо ви забули). |
||
Ми повинні додати нову категорію для 'verb' (дієслова). |
Ми повинні додати нову категорію для 'verb' (дієслова). |
||
Line 633: | Line 635: | ||
</pre> |
</pre> |
||
Пам'ятаєте, коли ви спробували видалити clip- |
Пам'ятаєте, коли ви спробували видалити clip-рядки в попередньому прикладі правила, вони зникли з трансферу? Зараз ми робимо те ж саме. |
||
Ми беремо дієслово з повним аналізом, а на виході отримуємо тільки частковий аналіз (лема + 'verb tag' ( |
Ми беремо дієслово з повним аналізом, а на виході отримуємо тільки частковий аналіз (лема + 'verb tag' (теґ дієслова) + 'tense tag' (теґ часу)). |
||
Тепер, якщо ми все це |
Тепер, якщо ми все це перекомпілюємо, то отримаємо: |
||
<pre> |
<pre> |
||
Line 656: | Line 657: | ||
</pre> |
</pre> |
||
Спробуйте це зі словом 'vidimo' (we see), щоб перевірити, |
Спробуйте це зі словом 'vidimo' (we see), щоб перевірити, чи ви отримали коректний висновок. |
||
А тепер з "vidim gramafone": |
А тепер з "vidim gramafone": |
||
Line 670: | Line 671: | ||
==А як же особисті займенники?== |
==А як же особисті займенники?== |
||
Все це чудово, але у нас все ще |
Все це чудово, але у нас все ще немає особистих займенників, які обов'язкові в англійській мові. Для того, щоб їх додати, спочатку нам потрібно відредагувати англійський морфологічний словник. |
||
Як і раніше, перше, що ми робимо - це додаємо необхідні символи: |
Як і раніше, перше, що ми робимо --- це додаємо необхідні символи: |
||
<pre> |
<pre> |
||
Line 679: | Line 680: | ||
</pre> |
</pre> |
||
Всього два символи: prn - pronoun (займенник) та subj - subject (підмет). |
Всього два символи: prn --- pronoun (займенник) та subj --- subject (підмет). |
||
Оскільки у таких особистих займенників немає ні кореня, ні 'леми', то ми просто додаємо pardef: |
Оскільки у таких особистих займенників немає ні кореня, ні 'леми', то ми просто додаємо pardef: |
||
Line 742: | Line 743: | ||
</pre> |
</pre> |
||
Це |
Це те ж саме правило, за винятком кількох маленьких змін. |
||
Нам потрібно було вивести: |
Нам потрібно було вивести: |
||
Line 754: | Line 755: | ||
Пояснення: |
Пояснення: |
||
* <code><lit></Code>, |
* <code><lit></Code>, виводить буквений рядок, в даному випадку "prpers" |
||
* <code><lit-tag></Code>, |
* <code><lit-tag></Code>, виводить буквений тег, так як ми не можемо отримати його з дієслова, то просто додаємо; "prn" означає pronoun, а "subj" - subject. |
||
* <code><b/></Code>, |
* <code><b/></Code>, виводить пробіл. |
||
Зауважте, що ми отримуємо інформацію про |
Зауважте, що ми отримуємо інформацію про число та час безпосередньо з дієслова. |
||
Тепер перекомпілююємо та протестуємо знову: |
Тепер перекомпілююємо та протестуємо знову: |
||
Line 770: | Line 771: | ||
</pre> |
</pre> |
||
Отриманий результат, може і не отримає приз на конкурсі (як і це керівництво), але все одно є точним перекладом. |
Отриманий результат, може, і не отримає приз на конкурсі (як і це керівництво), але все одно є точним перекладом. |
||
== |
==То розкажіть мені про програвач (багатослівні конструкції 'Multiwords')== |
||
Не зважаючи на те, що gramophone (грамофон) - англійське слово, воно не є найкращим перекладом. 'Gramophone' вживається, в основному, для старих програвачів з голкою та без посилення. Кращим варіантом перекладу буде 'record player' (програвач записів). Хоча це не одне слово, ми можемо працювати з ним, як з одним, використовуючи 'multiword' (багатослівні) конструкції. |
|||
Сербохорватський словник нам не знадобиться, так що відкриваємо тільки англійський та двомовний. |
|||
'record player' у множині - це 'record players', тобто використовується та ж парадигма, як для gramophone (gramophone__n) - ми просто додаємо 's'. Все, що нам потрібно зробити - це додати новий елемент у головний розділ. |
'record player' у множині --- це 'record players', тобто використовується та ж парадигма, як для gramophone (gramophone__n) - ми просто додаємо 's'. Все, що нам потрібно зробити - це додати новий елемент у головний розділ. |
||
<pre> |
<pre> |
||
Line 784: | Line 785: | ||
</pre> |
</pre> |
||
Єдина відмінність - використання |
Єдина відмінність --- використання теґу <b/>, хоча це не є чимось новим, адже ми бачили це у файлі з правилами. |
||
Перекомпілюємо та протестуємо: |
Перекомпілюємо та протестуємо: |
||
Line 796: | Line 797: | ||
</pre> |
</pre> |
||
Чудово. Величезна вигода використання 'multiwords' (багатослівні конструкції) полягає в тому, що можна |
Чудово. Величезна вигода від використання 'multiwords' (багатослівні конструкції) полягає в тому, що можна перекладати ідіоматичні вирази дослівно, без необхідності послівного перекладу. Наприклад, англійська фраза "at the moment" (зараз, у даний момент) буде переведена на сербохорватську як "trenutno" (trenutak - момент, trenutno - прислівник, утворений від нього) --- було б неможливо перекласти цю фразу сербохорватську послівно. |
||
==Незначні варіації== |
==Незначні варіації== |
||
Сербохорватська мова має кілька варіантів написання, через діалектичні варіації. Ця мова має цікаву фонетичну письмову систему --- як чується, так і пишеться. Наприклад, люди, що говорять діалектом Ієкавським, сказали б "rječnik", в той же час, як хто-небудь, хто говорить єкавським, сказав би "rečnik". Це відображає різницю у вимові праслов'янського голосного 'ят'. |
|||
===Аналіз=== |
===Аналіз=== |
||
Повинен існувати легкий спосіб боротьби |
Повинен існувати легкий спосіб боротьби із цим, і він є: знову використовувати парадигми. Вони використовуються не тільки для надання граматичних символів, але і для заміни букв та символів. Для прикладу, подивіться на парадигму для розпізнавання при аналізі "e" та "je". Ця парадигма, як і інші, повинна бути записана до cербохорватського словника. |
||
<pre> |
<pre> |
||
Line 837: | Line 838: | ||
*[[Building dictionaries]] |
*[[Building dictionaries]] |
||
*[[Finding_errors_in_dictionaries]] |
|||
*[[Cookbook]] |
*[[Cookbook]] |
||
*[[Chunking]] |
*[[Chunking]] |
||
Line 845: | Line 845: | ||
[[Category:HOWTO]] |
[[Category:HOWTO]] |
||
[[Category:Writing dictionaries]] |
[[Category:Writing dictionaries]] |
||
[[Category:Quickstart]] |
Revision as of 21:46, 2 April 2016
Contents
- 1 Як створити нову мовну пару
Як створити нову мовну пару
Цей документ містить пояснення, як створити нову мовну пару для системи машинного перекладу Apertium з нуля.
Вам не треба знати багато про лінгвистику або машинний переклад, достатньо буде розрізняти іменники й дієслова (та прийменники і т.д).
Вступ
Apertium є, як ви, певно, зрозуміли, системою машинного перекладу. Ну, не зовсім, це --- платформа машинного перекладу. Вона забезпечує вас рушієм (англ. "engine") та інструментами, з їхньою допомогою ви можете створювати ваші власні системи машинного перекладу. Ви тільки повинні записати дані. Дані скаладаються з трьох словників та кількох правил (які забезпечують перестановку слів та інші грамматичні речі).
За більш детальною інформацією ви можете звернутись до цього сайту з відмінимми статтями: Publications
Вам знадобляться
- lttoolbox (>= 3.0.0)
- libxml utils (xmllint etc.)
- apertium (>= 3.0.0)
- текстовий редактор (або спеціальний XML редактор, якщо вам так хочеться)
Цей документ не пояснює, як встановлювати ці пакети, за більш детальною інформацією будь ласка відвідайте документаційну секцію на сайті Apertium.
Із чого зроблено мовну пару
Apertium являє собою систему машинного перекладу поверхнево-передачного типу. В основному він має справу зі словниками та правилами поверхневої передачі. На практиці поверхнева передача відрізняється від глибокої передачі тим, що при ній не виконується повний синтаксичний розбір речіннь, а правила, на відміну від операцій на дереві синтаксичного розбору, являють собою операції з групами лексичних одиниць. На базовому рівні є три головних словники:
- Морфологічний словник для мови xx: він містить правила про зміну слов у мові xx. У нашому прикладі цей словник буде називатися так: apertiumh-en.sh.dix
- Морфологічний словник для мови yy: він, у свою чергу, містить інформацію про зміну слов у мові yy. У нашому прикладі він матиме назву: apertium-en.en.dix
- Двомовний словник: містить перекладні відповідності слів і символів обох мов. Він буде називатися так: apertium-sh-en.sh-en.dix
У мовній парі будь-яка з мов, що складають цю пару, може бути як вхідною, так і вихідною мовою, тобто ці терміни вживаються умовно.
Мовну пару складають також два файли з правилами передачі. Це правила, які керують перестановкою слів у реченнях, наприклад, chat noir -> кіт чорний -> чорний кіт. Також ці правила забезпечують узгодження роду у реченні, числа і т.д. Вони також можуть використовуватися і для вставки або видалення лексичних одиниць, як це буде описано нижче. Ці файли мають наступний вигляд:
- Правила передачі з мови xx до мови yy: цей файл містить правила, що описують перетворення, які повинні бути застосовані при перекладі з мови xx на мову yy. У нашому прикладі це: apertium-sh-en.sh-en.t1x
- Правила передачі з мови yy до мови xx: цей файл містить правила, що описують перетворення, які повинні бути застосовані при перекладі з мови yy на мову xx. У нашому прикладі цей файл буде називатися так: apertium-sh-en.en-sh.t1x
Багато з існуючих мовних пар містять інші файли, але ми не будемо розглядати їх в даному керівництві. Нам достатньо цих файлів для створення функціональної системи.
Мовна пара
Ви могли здогадатися з назв файлів, що для опису порядку створення базової системи в цьому керівництві будуть використовуватися приклади перекладу з сербохорватської на англійську мову. Зауважимо, що це не ідеальна пара, так як система працює краще зі спорідненими мовами. Однак у випадку простих прикладів, які приводяться тут, ми не зіткнемося з якими-небудь проблемами.
Коротко про терміни
Перед тим як продовжити, слід пояснити значення деяких термінів.
Першим з них є лема. Лема - це канонічна форма слова, слово без граматичної інформації. Наприклад, лемою слова коти є кіт. В англійській мові лема розглянутого іменника як правило співпадає з його формою однини. Для дієслів в англійській мові лема маєть вигляд інфінітива без to (або просто інфінітива в українській мові). Наприклад, лемою слова was буде be, також як лемою слова був буде бути.
Другим терміном є символ. У контексті Apertium символ означає граматичний знак. Слово коти є іменником в множині, отже, воно буде мати символ іменника та символ множини. На вході та виході модулів Apertium ці символи, зазвичай, беруться в кутові дужки, як показано нижче:
- <n>; Для іменника.
- <pl>; Для множини.
Іншими прикладами символів є <sg> (однина), <p1> (перша особа), <pri> (теперішній час дійсного способу) та інші. Треба зауважити, що в багатьох з існуючих мовних пар символи мають вигляд акронімів чи скорочень каталанською мовою. Наприклад, vbhaver - від vb (дієслово) та haver ("мати" каталонською). Символи визначаються в тегах <sdef> та використовуються в тегах <s>
Третім терміном є парадигма. У контексті системи Apertium парадигма є прикладом відмінювання / дієвідміни певної групи слів. У морфологічному словнику леми (див. вище) посилаються на парадигми, що дозволяє нам показати всі словоформи цих лем без необхідності записувати всі можливі закінчення.
Наступний приклад показує використання парадигми. Припустімо, ми хочемо додати в словник прикметники happy (веселий) та lazy (ледачий). Замість запису однакових закінчень:
* Happy, happ (y, ier, iest) * Lazy, laz (y, ier, iest)
ми можемо записати закінчення форм слова happy, а потім написати, що "lazy відмінюється як happy", або "shy відмінюється як happy", "naughty відмінюється як happy", "friendly відмінюється як happy" і т.д. У цьому прикладі happy буде парадигмою, моделлю зміни всіх інших. Точний опис визначення парадигм буде дано пізніше. Парадигми визначаються в тегах <pardef> та використовуються в тегах <par>.
Як починати
Одномовні словники
- See also: List of dictionaries and Incubator
Почнімо зі створення нашого першого словника вхідної мови. Власне словник є XML-файлом. Відкрийте ваш текстовий редактор та введіть:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> </dictionary>
Поки що файл визначає, що ми хочемо почати створювати словник. Щоб цей файл був більш корисним, ми повинні додати в нього ще кілька записів, першим з яких буде абетка. Вона визначає набір букв, які можуть використовуватися в словнику для сербохорватської мови. Цей запис виглядає як показано нижче та містить усі літери сербохорватської абетки:
<alphabet>ABCČĆDDžĐEFGHIJKLLjMNNjOPRSŠTUVZŽabcčćddžđefghijklljmnnjoprsštuvzž</alphabet>
Розмістіть абетку після тега <dictionary>.
Далі нам необхідно визначити деякі символи. Почнемо з простіших - іменник (n) в однині (sg) та множині (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 значить запис (entry).
- p значить пара (pair).
- l значить наліво (left).
- r значить направо (right).
Чому вліво та вправо? Морфологічні словники будуть пізніше скомпільовані у кінцеві автомати. Компіляція зліва направо створює аналізи слів, а справа наліво --- слова з аналізів. Наприклад:
* gramofoni (зліва направо) gramofon<n><pl> (аналіз) * gramofon<n><pl> (справа наліво) gramofoni (генерація)
Ми визначили парадигму, тепер потрібно співвіднести її з лемою --- gramofon. Ця дія виконується в раніше визначеному розділі.
Записом, який потрібно додати до < section >, є:
<e lm="gramofon"><i>gramofon</i><par n="gramofon__n"/></e>
Коротке пояснення до скорочень:
- lm означає лема (lemma).
- i означає ідентичність (identity), однаковий як при аналізі так і генерації.
- par означає парадигма (paradigm).
Цей запис визначає лему слова, gramofon, корінь слова, gramofon, та парадигму відмінювання цього слова gramofon_n. Різниця між лемою та коренем полягає в тому, що лема --- це "цитована форма" слова, у той час як корінь є частиною леми, до якої приєднуються суфікси та закінчення. Ця різниця стане зрозумілою, коли ми дійдемо до запису з різними лемою та коренем.
Тепер ми можемо перевірити наш словник. Збережіть його та поверніться до командного рядка. Насамперед ми повинні скомпілювати словника (за допомогою lt-comp), потім ми зможемо перевірити його (за допомогою lt-proc).
$ lt-comp lr apertium-sh-en.sh.dix sh-en.automorf.bin
Результатом чого має бути:
main@standard 12 12
Так як ми компілювали зліва направо, ми створили аналізатор. Створімо і генератор:
$ lt-comp rl apertium-sh-en.sh.dix sh-en.autogen.bin
Команда повинна видати так само.
Тепер ми можемо протестувати їх. Запустіть lt-proc в аналізаторі.
$ lt-proc sh-en.automorf.bin
Тепер перевірте --- введіть gramofoni, та подивіться на результат:
^gramofoni/gramofon<n><pl>$
Тепер зробіть те ж саме для англійського словника, але замініть слово gramofon англійським словом gramophone і поміняйте закінчення множини (тобто i на s). А що робити, якщо ви захочете використовувати більш правильний переклад 'record player'? Це ми пояснимо пізніше.
Тепер в теці у вас повинно бути два файли:
- apertium-sh-en.sh.dix, який містить (дуже) маленький сербохорватський морфологічний словник, та
- apertium-sh-en.en.dix, який містить (дуже) маленький англіський морфологічний словник.
Двомовний словник
Таким чином, у нас є два морфологічних словника, тепер ми перейдемо до створення двомовного словника. Двомовний словник описує відповідності слів. Всі словники мають один і той же формат (якій описаний в DTD, dix.dtd).
Створіть новий файл з ім'ям apertium-sh-en.sh-en.dix та вставте наступну основу словника:
<?xml version="1.0" encoding="UTF-8"?> <dictionary> <alphabet/> <sdefs> <sdef n="n"/> <sdef n="sg"/> <sdef n="pl"/> </sdefs> <section id="main" type="standard"> </section> </dictionary>
Тепер ми повинні додати запис (в < section >) для здійснення перекладу слів:
<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" означає "bilingual", тобто "двомовний".
Правила трансферу
Тепер ми маємо два морфологічних словника та один двомовний словник. Все що нам залишолось, це написати правила трансферу для іменників. Файли з правилами трансферу мають свій власний DTD (transfer.dtd), який може бути знайдений в пакеті Apertium. Якщо вам потрібно написати правило трансферу, то часто має сенс спочатку звернутися до файлів з правилами для інших мовних пар, так як багато правил можуть бути використані для різних мовних пар. Або ж ці правила можна використовувати в модифікованому вигляді. Наприклад, правило, наведене нижче, може бути використано для всіх нуль-суб'єктних мов.
Основна частина файлу така же:
<?xml version="1.0" encoding="UTF-8"?> <transfer> </transfer>
Так як ми не враховуємо відмінки (тобто можливі зміни відмінків при перекладі), нам необхідно створити правило, яке би просто "брало" граматичні символи на вході і, у свою чергу, видавало їх.
Спочатку нам слід визначити категорії та атрибути. Категорії та атрибути дозволяють об'єднувати граматичні символи. За допомогою категорій ми можемо об'єднувати символи для їх "зведення воєдино" (наприклад, категорія 'n. *' об'єднує всі іменники). Атрибути дозволяють нам об'єднувати символи, з яких ми далі можемо вибрати потрібний нам (наприклад, '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-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 (number = число), яке може бути або одниною (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>
Перший тег очевидний --- він визначає правило. Другий тег, pattern, означає "застосовувати це правило, якщо знайдено цей шаблон". У цьому прикладі шаблон складається з одного іменника (визначеного категорією nom). Зауважте, що шаблони накладаються в режимі "найдовше співпадіння". Так, якщо у вас є три правила, перше з яких належить до сполук слів, що відповідають шаблону "<prn><vblex><n>", друге --- шаблону "<prn><vblex>" та третє --- шаблону "<n>", вживаним (у разі відповідності сполук слів цим шаблонам) правилом буде перше.
Кожному шаблону відповідає певна дія, яка генерує відповідні вихідні дані. Вихідними даними (висновком) є лексична одиниця (lu, lexical unit).
Тег clip дозволяє користувачеві вибирати атрибути або частини лексичної одиниці вхідної (side = "sl") або вихідної (side = "tl") мови та маніпулювати ними.
Скомпілюймо та перевіримо файл. Правила трансферу компілюються так:
$ apertium-preprocess-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin
що створить файл sh-en.t1x.bin
.
Тепер все готово для перевірки нашої системи машинного перекладу. У нас ще немає одного важливого компонента, а саме, інструмента частиномовної розмітки (PoS tagger, part-of-speech tagger), однак незабаром це питання буде поясненно. Поки ми можемо перевірити систему і без нього.
Спочатку проаналізуємо слово "gramofoni":
$ echo "gramofoni" | lt-proc sh-en.automorf.bin ^gramofon/gramofon<n><pl>$
Після цього інструмент частиномовної розмітки повинен вибрати правильний варіант (правильну частину мови), але так як його поки у нас немає, ми можемо використовувати маленький gawk-скрипт (спасибі Sergio), який буде видавати перший з отриманих результатів.
$ 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.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin
Що видає:
^gramophone<n><pl>$^@
- 'Gramophone' є лема (lem) вихідной мови (side = "tl") у позиції 1 (pos = "1").
- '<n>' є a_nom (іменник) вихідной мови у позції 1.
- '<pl>' є атрибут числа (nbr) вихідной мови у позиції 1.
Спробуйте видалити один з цих clip-рядків, перекомпілювати файл і подивиться, що станеться.
Тепер у нас є вивід трансферу, і єдине, що залишається зробити --- це згенерувати словоформи (тобто належним чином відмінені або дієвідмінені форми) вихідною мовою. Для цього використовується той самий lt-proc, але в іншому режимі --- в режимі генерування.
$ echo "gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin gramophones\@
Вуаля. Тепер у вас є система машинного перекладу, яка перекладає сербохорватський іменник англійською мовою. Очевидно, що користі від такої системи не так багато, проте незабаром ми перейдемо до більш складного матеріалу. Про символ '@' теж не турбуйтеся, скоро буде пояснено, що це таке.
Спробуйте знайти / згадати інші слова, які відмінюються так само, як слово "gramofon". Про порядок їх долучення --- нам потрібно додавати лише записи (entries, які ми образно назвали "словниковими статтями") в головних розділах одномовного і двомовного словників, а не парадигми.
Додамо дієслова
Так, тепер наша система може перекладати іменники. Однак користі від цього небагато, адже ми хочемо перекладати і дієслова, і навіть цілі речення! Почнемо з дієслова "to see". У сербохорватській йому відповідає "videti". Сербохорватська мова є т.зв. нуль-суб'єктною мовою (сербохорватською перед особистими формами дієслів особисті займенники як правило не використовуються). Англійська ж не є такою. Так, наприклад, англійське "I see" буде перекладено сербохорватською як "vidim".
- Vidim
- see<p1><sg>
- I see
Примітка: <p1>
означає перша особа.
Іншими прикладами нуль-суб'єктних мов можуть слугувати іспанська, румунська та польська. Це буде важливо при написанні правил трансферу для дієслів.
"Нуль-суб'єктність" сербохорватської мови означає, що якщо в сербохорватська морфологічний словник ми додамо лише дієслово, то в англійський морфологічний словник потрібно буде додати не лише дієслово, а й особисті займенники.
Іншими формами дієслова бачити є: vidiš, vidi, vidimo, vidite, і vide. Відповідно: you see (однина), he sees, we see, you see (множина), і they see.
Ми постараємося перекласти "Vidim gramofoni" з сербохорватської на "I see gramophones" англійською. З метою економії часу ми додамо до словника тільки достатню для перекладу інформацію і залишимо опис парадигми (додавання інших особистих форм дієслова) як вправу для самостійної роботи читачеві.
Уважний читач напевно помітив, що переклад "vidim gramofoni" неправильний, так як це речення є граматично некоректним. Граматично правильним реченням є " vidim gramofone ", так як іменник має бути в знахідному відмінку. Так, ми додамо форму знахідного відмінка, проте інформацію про відмінок додавати не будемо (у цьому немає необхідності) --- потрібне нам слово буде фігурувати як другий варіант множини. Для цього необхідно скопіювати (іншими словами, "клонувати") блок 'e' для форми множини й виправити там лiтеру 'i' (у тезі <l >) на 'e'.
Перш за все ми повинні додати кілька нових символів. Для початку символ для дієслова ('verb'), який ми будемо називати "vblex" (lexical verb = значуще дієслово, на противагу модальним і іншим дієсловам). Разом з числом (number) дієслова мають категорію особи ('person') і часу ( 'tense'), так що додамо ці символи теж. Нагадаємо, що ми хотіли перекласти "I see" - значить, для особи ми додамо "p1", тобто 'перша особа', а для часу - "pri ", тобто 'present indicative'.
<sdef n="vblex"/> <sdef n="p1"/> <sdef n="pri"/>
Після цього (як і у випадку іменників) ми додамо парадигму дієвідміни дієслова. Першим рядком буде:
<pardef n="vid/eti__vblex">
Знак '/' використовується для позначення місць, де додається основа слова (частина між теґами <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'), у тезі <r> необхідно додати 'eti', суфікс інфинітива. З рештою все просто: 'vblex' є, як вже було згадано вище, скороченням від "lexical verb", 'pri' --- від "present indicative", 'p1' означає "first person" (перша особа) 'sg' є єдиним числом. Можно додати до словника й форму першої особи множини --- у нашій статті треба буде замінити суфікс 'im' суфіксом 'imo', а символ 'sg' символом 'pl'.
Далф нам слід додати до основного розділу лему й співвіднести її з вищенаведеною парадигмою:
<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">
"Основою" приймається тільки "s", так як формою минулого часу є 'saw'. Тепер ми могли б додати форми першої та другої особи, хоча вони ніяк не відрізняються. Всіма формами теперішнього часу дієслова "to see" (крім форми третьої особи однини) буде "see". З цієї причини ми додамо до словника тільки один запис з "see" та символом "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.sh-en.t1x sh-en.t1x.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.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin #see\@
Цей символ '#' означає, що генератор не може згенерувати правильну лексичну форму, тому що її нема. Чому це так?
Просто аналізи не збігаються: 'see' у словнику --- це 'see <vblex><pri>', а 'see' доставляється трансфером --- 'see<vblex><pri><p1><sg>'. Сербо-хорватська сторона має більше інформації, ніж потрібно англійській стороні. Ви можете перевірити це, додавши символи в англійський словник, перекомпілювавши та протестувавши знову.
Але існує більш парадигматичний спосіб це зробити, суть якого полягає у написанні правила. Так що, відкриваємо файл з правилами (apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin, якщо ви забули).
Ми повинні додати нову категорію для 'verb' (дієслова).
<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-рядки в попередньому прикладі правила, вони зникли з трансферу? Зараз ми робимо те ж саме. Ми беремо дієслово з повним аналізом, а на виході отримуємо тільки частковий аналіз (лема + 'verb tag' (теґ дієслова) + 'tense tag' (теґ часу)).
Тепер, якщо ми все це перекомпілюємо, то отримаємо:
$ echo "vidim" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin ^see<vblex><pri>$^@
та:
$ echo "vidim" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin see\@
Спробуйте це зі словом 'vidimo' (we see), щоб перевірити, чи ви отримали коректний висновок.
А тепер з "vidim gramafone":
$ echo "vidim gramofoni" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin see gramophones\@
А як же особисті займенники?
Все це чудово, але у нас все ще немає особистих займенників, які обов'язкові в англійській мові. Для того, щоб їх додати, спочатку нам потрібно відредагувати англійський морфологічний словник.
Як і раніше, перше, що ми робимо --- це додаємо необхідні символи:
<sdef n="prn"/> <sdef n="subj"/>
Всього два символи: prn --- pronoun (займенник) та subj --- subject (підмет).
Оскільки у таких особистих займенників немає ні кореня, ні 'леми', то ми просто додаємо pardef:
<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' пишеться з великої літери).
Тепер нам потрібно виправити правило 'verb', для виведення особового займенника та правильної форми дієслова.
Спочатку, додамо категорію:
<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" означає pronoun, а "subj" - subject., виводить пробіл.
Зауважте, що ми отримуємо інформацію про число та час безпосередньо з дієслова.
Тепер перекомпілююємо та протестуємо знову:
$ echo "vidim gramofone" | lt-proc sh-en.automorf.bin | \ gawk 'BEGIN{RS="$"; FS="/";}{nf=split($1,COMPONENTS,"^"); for(i = 1; i<nf; i++) printf COMPONENTS[i]; if($2 != "") printf("^%s$",$2);}' | \ apertium-transfer apertium-sh-en.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin I see gramophones
Отриманий результат, може, і не отримає приз на конкурсі (як і це керівництво), але все одно є точним перекладом.
То розкажіть мені про програвач (багатослівні конструкції 'Multiwords')
Не зважаючи на те, що gramophone (грамофон) - англійське слово, воно не є найкращим перекладом. 'Gramophone' вживається, в основному, для старих програвачів з голкою та без посилення. Кращим варіантом перекладу буде 'record player' (програвач записів). Хоча це не одне слово, ми можемо працювати з ним, як з одним, використовуючи 'multiword' (багатослівні) конструкції.
Сербохорватський словник нам не знадобиться, так що відкриваємо тільки англійський та двомовний.
'record player' у множині --- це 'record players', тобто використовується та ж парадигма, як для gramophone (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.sh-en.t1x sh-en.t1x.bin sh-en.autobil.bin | \ lt-proc -g sh-en.autogen.bin I see record players
Чудово. Величезна вигода від використання 'multiwords' (багатослівні конструкції) полягає в тому, що можна перекладати ідіоматичні вирази дослівно, без необхідності послівного перекладу. Наприклад, англійська фраза "at the moment" (зараз, у даний момент) буде переведена на сербохорватську як "trenutno" (trenutak - момент, trenutno - прислівник, утворений від нього) --- було б неможливо перекласти цю фразу сербохорватську послівно.
Незначні варіації
Сербохорватська мова має кілька варіантів написання, через діалектичні варіації. Ця мова має цікаву фонетичну письмову систему --- як чується, так і пишеться. Наприклад, люди, що говорять діалектом Ієкавським, сказали б "rječnik", в той же час, як хто-небудь, хто говорить єкавським, сказав би "rečnik". Це відображає різницю у вимові праслов'янського голосного 'ят'.
Аналіз
Повинен існувати легкий спосіб боротьби із цим, і він є: знову використовувати парадигми. Вони використовуються не тільки для надання граматичних символів, але і для заміни букв та символів. Для прикладу, подивіться на парадигму для розпізнавання при аналізі "e" та "je". Ця парадигма, як і інші, повинна бути записана до cербохорватського словника.
<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>
Це тільки дозволяє нам аналізувати обидві форми, а якщо ми також хочемо генерувати їх, то потрібно виконати більше роботи.