Як створити нову мовну пару
Як створити нову мовну пару.
Цій документ пояснить вам як почати нову мовну пару для Apertium, системи машинного перекладу з нуля.
Вам не треба знати багато про лінгвистику або машинний переклад, аби ви знали як розрізняті іменники від дієслов (та прийменники і т.д)
Contents
Введення
Apertium є, як ви певно зрозуміли, система машинного перекладу. Ну, не зовсім, це платформа машинного перекладу. Вона забеспечює вас з двигуном (англ. "engine") та інструментами, з їхньою допомогою ви можете створювати ваші власні системи машинного перекладу. Ви тільки повинні записати данні. Данні скаладаються з трьох словників та кілька правил (які забезпечують перестановку слів та інші грамматичні речі).
За болі підрібною інформацією, ви можете відвідати сайт з відмінимми статтями тут: Publications
Вам знадобиться
- lttoolbox (>= 3.0.0)
- libxml utils (xmllint etc.)
- apertium (>= 3.0.0)
- текстовий редактор (або спеціальний XML редактор, якщо вам так хочеться)
Цій документ не пояснює як устанавлювати ці пакети, за болі підрібною інформацією будь ласка відвідайте документаційну секцію на сайті Aperitum.
Із чого зроблена мовна пара
Apertium являє собою систему машинного перекладу поверхнево-передачного типу. В основному він має справу зі словниками та правилами поверхневій передачі. На практиці поверхнева передача відрізняється від глибокої передачі тим, що при ній не виконується повний синтаксичний розбір речіннь, а правила, на відміну від операцій на дереві синтаксичного розбору, являють собою операції з групами лексичних одиниць. Є три таких словників:
- Морфологічний словник для мови xx: він містить правила про зміну слов у мові xx. У нашому прикладі цей словник буде називатися так: apertiumh-en.sh.dix
- Морфологічний словник для мови yy: він, у свою чергу, містить інформацію про зміну слов у мові yy. У нашому прикладі він має назву: apertium-sh-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. Ця дія виконується в раніше визначеному розділі.
Запис, який потрібно додати в </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>.
Потім флексію для першої особи однини:
<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 - прислівник, утворене від нього) - було б неможливо перевести цю фразу на сербо-хорватську послівно.