Как использовать lttoolbox, чтобы разработать новый морфологический анализатор

From Apertium
Jump to navigation Jump to search
Информация о том, как установить lttoolbox смотрите lttoolbox и minimal installation from SVN

Здесь мы объясним, как изучать новый язык с lttoolbox. lttoolbox на самом деле не подходит для агглютинативных языков, или языков со сложной и регулярной морфо-фонологией (или по крайней мере никто не написал словарь с нуля, используя lttoolbox для одного из этих языков), мы будем работать над таким с языком с простой и менее регулярной морфологией. В частности, мы рекомендуем людям использовать lttoolbox возможности; lttoolbox имеет простой синтаксис, есть несколько очень полезных функций для проверки и является канонической частью Apertium, не требующей никакого специального программного обеспечения для установки.

Подготовка

Морфологический переводчик в lttoolbox имеет обычно один файл, .dix файл. Это определяет как морфемы в языке соединяются вместе,морфотактики, и как изменения происходят, когда эти морфемы соединяются вместе, морфографемика (или морфофонология). Например,

  • морфотактика: wolf<n><pl> → wolf + s
  • морфографемика: wolf + s → wolves

Oба рассматриваются в том же файле.

Язык

Язык который мы будем моделировать- Верхний сербский, славянский язык на котором говорят в Германии. Существует ограниченная грамматика на английском языке здесь, и это то, что мы будем использовать для нашего анализа.Часть речи, на которую мы будем смотреть в этой небольшой инструкции- существительные . Существительные в Верхнем сербскoм имеют семь падежей (именительный, родительный, дательный, винительный, местный, инструментальный, звательный), три числа (единственное, двойственное, множественное) и три рода (мужской, женский, средний). Как и в других славянских языках, живые выделяется в мужской род .[1].

Парадигмы

Здесь мы дадим четыре парадигмы, они станут основой реализации нашего достижения.

живой мужского рода (nan "отец")
Единственное число Двойственное число Mножественное число
Именительный nan nanaj nanojo
Родительный nana nanow nanow
Дательный nanej nanomaj nanam
Винительный nana nanow nanow
Инструментальный nanom nanomaj nanami
Местный nanje nanomaj nanach
Звательный nano! nanaj! nanojo!
неживой мужского рода (hrěch "грех")

Отличия от живого мужского рода парадигмы указаны синим цветом.

Единственное число Двойственное число Mножественное число
Именительный hrěch hrěchaj hrěchi
Родительный hrěcha hrěchow hrěchow
Дательный hrěchej hrěchomaj hrěcham
Винительный hrěch hrěchaj hrěchi
Инструментальный hrěchom hrěchomaj hrěchami
Местный hrěchu hrěchomaj hrěchach
Звательный hrěcho! hrěchaj! hrěchi!
женский род (wróna "ворона")

Общие части с парадигмами мужского рода выделены зеленым цветом.

Единственное число Двойственное число Mножественное число
Именительный wróna wrónje wróny
Родительный wrónu wrónow wrónow
Дательный wrónje wrónomaj wrónam
Винительный wrónu wrónje wróny
Инструментальный wrónu wrónomaj wrónami
Местный wrónje wrónomaj wrónach
Звательный wróna! wrónje! wrónu!
средний род (trašidło "чудовище")

Формы общего мужского и женского рода парадигм, выделены красным цветом.

Единственное число Двойственное число Mножественное число
Именительный trašidło trašidłe trašidła
Родительный trašidła trašidłow trašidłow
Дательный trašidłu trašidłomaj trašidłam
Винительный trašidło trašidłe trašidła
Инструментальный trašidłom trašidłomaj trašidłami
Местный trašidłe trašidłomaj trašidłach
Звательный trašidło! trašidłe! trašidła!

Лексикон

Учитывая описание выше, как мы можем начать писать морфологическое описание в lttoolbox? Ну, во-первых, мы начнем с нашего файла, hsb.dix , так что откройте текстовый редактор и сохраните пустой документ с таким именем.

Основы

Скелет

Основной скелет словаря lttoolbox выглядит следующим образом:

<dictionary>
<alphabet>abc...</alphabet>
<sdefs>
  ...
</sdefs>
<pardefs>
  ...
</pardefs>
<section id="main" type="standard">
  ...
</section>
</dictionary>

Bпишите это в файл, и это даcт набросок нашей основной части морфологии: алфавит; символы, которые дают нам полезные мнемоники для грамматических особенностей; <pardefs> раздел, который дает наши флективные парадигмы и, наконец, основной раздел файла, который содержит наши лексические элементы.

Символa (tag) определения

первым делом мы начнем сo спискa символов, которые будут кодировать наши грамматические особенности (речь, пол, число, падеж). Страница list of symbols дает некоторые общие тaги в Apertium. Вообще мы стараемся сохранить черты, которые названы одинаково среди языков одинаковой меткой и, таким образом, к примеру, тaг "именительный" будет <nom>, независимо от того, если мы говорим о румынском, сербско-хорватском, исландском или албанцком. Символы определены в <sdefs> разделe <sdef> элементов.

<sdefs>
  <sdef n="n"  c="Имя существительное"/>
  <sdef n="ma" c="Masculine (animate)"/>
  <sdef n="mi" c="Masculine (inanimate)"/>
  <sdef n="nt" c="Neuter"/>
  <sdef n="f"   c="Женский род"/>

  <sdef n="sg" c="Singular"/>
  <sdef n="du" c="Dual"/>
  <sdef n="pl" c="Plural"/>

  <sdef n="nom" c=" Nominative "/>
  <sdef n="gen" c=" Genitive "/>
  <sdef n="dat" c=" Dative "/>
  <sdef n="acc" c=" Accusative "/>
  <sdef n="ins" c=" Instrumental "/>
  <sdef n="loc" c=" Locative "/>
  <sdef n="voc" c=" Vocative "/>
</sdefs>

c после каждого символа определения означает комментарий (это не обязательно, но весьма удобно, если у вас есть много тaгов и нужнa быстрая ссылкa на то, что они означают)

Наша первая парадигма

После того как мы определили наши символы, то следующее, что нужно сделать, это написать нашу первую парадигму. Мы начнем с парадигмой nan "отец". Существует конвенции в Apertium, что идентификатор каждой основной парадигмы состоит из по крайней мере имя образцом слова и части речи. В этом случае мы также добавим пол.

Парадигмы состоят из серии записей. Каждая запись имеет пару (<p>), у которой есть левая сторона (<l>) и правая сторона (<r>). Как правило surface form находится на левой стороне и lexical form справа.

Мы можем использовать символы, которые мы определили ранее с <sdef> тaги, называя их с <s> элементoм.

<pardefs>
  <pardef n="nan__n_ma">
    <e><p><l></l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="nom"/></r></p></e>
    <e><p><l>a</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="gen"/></r></p></e>
    <e><p><l>ej</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="dat"/></r></p></e>
    <e><p><l>a</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="acc"/></r></p></e>
    <e><p><l>om</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="ins"/></r></p></e>
    <e><p><l>je</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="loc"/></r></p></e>
    <e><p><l>o</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="voc"/></r></p></e>

    <e><p><l>aj</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="nom"/></r></p></e>
    <e><p><l>ow</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="gen"/></r></p></e>
    <e><p><l>omaj</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="dat"/></r></p></e>
    <e><p><l>ow</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="acc"/></r></p></e>
    <e><p><l>omaj</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="ins"/></r></p></e>
    <e><p><l>omaj</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="loc"/></r></p></e>
    <e><p><l>aj</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="voc"/></r></p></e>

    <e><p><l>ojo</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="nom"/></r></p></e>
    <e><p><l>ow</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="gen"/></r></p></e>
    <e><p><l>am</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="dat"/></r></p></e>
    <e><p><l>ow</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="acc"/></r></p></e>
    <e><p><l>ami</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="ins"/></r></p></e>
    <e><p><l>ach</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="loc"/></r></p></e>
    <e><p><l>ojo</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="voc"/></r></p></e>
  </pardef>
</pardefs>
Использование Парадигмы

Теперь, когда мы определили парадигму, мы можем добавить слово, которое использует его. Очевидным выбором является "nan", являясь, как имя парадигмы.

<section id="main" type="standard">
  <e lm="nan"><i>nan</i><par n="nan__n_ma"/></e>
</section>

<e> элемент такой же, как в парадигме, но в случае лексических записей (в отличие от морфологических элементов), он обычно содержит атрибут lm "lemma". <i> тaг означает «инвариант» и означает, что левая сторона такая же, как правaя стороны.

Так к этому моменту мы должны иметь целый словарь с одного слова в нем. Сохраните файл.

Компиляция

После того как вы сохранили файл, вы можете пойти к командной строке и попытаться проверить его. Предполагая, что файл называется hsb.dix , то следующий будет проверять его от определениях:

$ apertium-validate-dictionary hsb.dix

Если словарь еще в силе, вы не должны получить вывода.

Если вы не введете определение символа, то вы получите сообщение от проверки скрипта, например, следующие:

$ apertium-validate-dictionary hsb.dix
hsb.dix:25: element s: validity error : IDREF attribute n references an unknown ID "nom"
hsb.dix:33: element s: validity error : IDREF attribute n references an unknown ID "nom"
hsb.dix:41: element s: validity error : IDREF attribute n references an unknown ID "nom"
Document hsb.dix does not validate against /home/fran/local/share/apertium/dix.dtd

В этом случае лучше вернуться и проверить, что все ваши символы определены.

Если предположить, что наш словарь действующий, мы можем перейти к следующему шагу и скомпилировать его.

$ lt-comp lr hsb.dix hsb-mor.bin
main@standard 29 45
$ lt-comp rl hsb.dix hsb-gen.bin
main@standard 29 45

lr и rl на стенде команд компиляции для "слева направо" и "справа налево", соответственно. Предполагая, что у нас есть форма поверхности слева и лексическая формa справа, компиляция lr сделает морфологический анализатор и компиляция rl сделает генератор.

Пользование

See also: lttoolbox

Затем мы можем проверить их обоих следующим образом:

$ echo "nanow" | lt-proc hsb-mor.bin
^nanow/nan<n><ma><du><gen>/nan<n><ma><du><acc>/nan<n><ma><pl><gen>/
nan<n><ma><pl><acc>$
$ echo "^nan<n><ma><pl><gen>$" | lt-proc -g hsb-gen.bin
nanow

Чтобы получить полный список словаря, команда lt-expand может быть использована:

$ lt-expand hsb.dix
nan:nan<n><ma><sg><nom>
nana:nan<n><ma><sg><gen>
nanej:nan<n><ma><sg><dat>
nana:nan<n><ma><sg><acc>
nanom:nan<n><ma><sg><ins>
nanje:nan<n><ma><sg><loc>
nano:nan<n><ma><sg><voc>
nanaj:nan<n><ma><du><nom>
nanow:nan<n><ma><du><gen>
...

У нас все готово для создания словаря. Теперь переходим к нашему следующему слову.

Организация парадигмы

Что нужно сделать при добавлении словаhrěch "грех" это дублировать nan__n_ma парадигму, но изменить пол и поверхности формы, которые отличаются. Тогда мы в итоге будем с новой парадигмой, что-то вроде:

<pardef n="hrěch__n_mi">
  <e><p><l></l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="nom"/></r></p></e>
  <e><p><l>a</l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="gen"/></r></p></e>
  <e><p><l>ej</l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="dat"/></r></p></e>
  <e><p><l></l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="acc"/></r></p></e>
  <e><p><l>om</l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="ins"/></r></p></e>
  <e><p><l>u</l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="loc"/></r></p></e>
  <e><p><l>o</l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="voc"/></r></p></e>

  <e><p><l>aj</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="nom"/></r></p></e> 
  <e><p><l>ow</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="gen"/></r></p></e>
  <e><p><l>omaj</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="dat"/></r></p></e>
  <e><p><l>oj</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="acc"/></r></p></e>
  <e><p><l>omaj</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="ins"/></r></p></e>
  <e><p><l>omaj</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="loc"/></r></p></e>
  <e><p><l>aj</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="voc"/></r></p></e>

  <e><p><l>i</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="nom"/></r></p></e>
  <e><p><l>ow</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="gen"/></r></p></e>
  <e><p><l>am</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="dat"/></r></p></e>
  <e><p><l>i</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="acc"/></r></p></e>
  <e><p><l>ami</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="ins"/></r></p></e>
  <e><p><l>ach</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="loc"/></r></p></e>
  <e><p><l>i</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="voc"/></r></p></e>
</pardef>

Мы добавляем запись в основном разделе:


<e lm="hrěch"><i>hrěch</i><par n="hrěch__n_mi"/></e>

Все отлично, и это хорошее место для начала, но если мы посмотрим на таблицу выше, парадигмаnan и парадигмаhrěchимеют много суффиксов. Мы можем назвать парадигмы от других парадигм, так почему мы должны дублировать их?

В качестве альтернативы, первое, что мы делаем, это разделения общих суффиксах в отдельную парадигму. Давайте назовем это common__m (для общего мужского суффиксa).

<pardef n="common__m">
  <e><p><l></l><r><s n="sg"/><s n="nom"/></r></p></e>
  <e><p><l>a</l><r><s n="sg"/><s n="gen"/></r></p></e>
  <e><p><l>ej</l><r><s n="sg"/><s n="dat"/></r></p></e>
  <e><p><l>om</l><r><s n="sg"/><s n="ins"/></r></p></e>
  <e><p><l>o</l><r><s n="sg"/><s n="voc"/></r></p></e>

  <e><p><l>aj</l><r><s n="du"/><s n="nom"/></r></p></e>
  <e><p><l>ow</l><r><s n="du"/><s n="gen"/></r></p></e>
  <e><p><l>omaj</l><r><s n="du"/><s n="dat"/></r></p></e>
  <e><p><l>omaj</l><r><s n="du"/><s n="ins"/></r></p></e>
  <e><p><l>omaj</l><r><s n="du"/><s n="loc"/></r></p></e>
  <e><p><l>aj</l><r><s n="du"/><s n="voc"/></r></p></e>

  <e><p><l>ow</l><r><s n="pl"/><s n="gen"/></r></p></e>
  <e><p><l>am</l><r><s n="pl"/><s n="dat"/></r></p></e>
  <e><p><l>ami</l><r><s n="pl"/><s n="ins"/></r></p></e>
  <e><p><l>ach</l><r><s n="pl"/><s n="loc"/></r></p></e>
</pardef>

(Примечание: Мы не включаем части речи или пола, так как это отличается в зависимости от lemma.)

Теперь с этой "общей" доступной парадигмой, мы можем упростить nan__n_ma и hrěch__n_mi парадигмы, таким образом:

<pardef n="nan__n_ma">
  <e><p><l></l><r><s n="n"/><s n="ma"/></r></p><par n="common__m"/></e>
  <e><p><l>a</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="acc"/></r></p></e>
  <e><p><l>je</l><r><s n="n"/><s n="ma"/><s n="sg"/><s n="loc"/></r></p></e>

  <e><p><l>ow</l><r><s n="n"/><s n="ma"/><s n="du"/><s n="acc"/></r></p></e>

  <e><p><l>ojo</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="nom"/></r></p></e>
  <e><p><l>ow</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="acc"/></r></p></e>
  <e><p><l>ojo</l><r><s n="n"/><s n="ma"/><s n="pl"/><s n="voc"/></r></p></e>
</pardef>
<pardef n="hrěch__n_mi">
  <e><p><l></l><r><s n="n"/><s n="mi"/></r></p><par n="common__m"/></e>
  <e><p><l></l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="acc"/></r></p></e>
  <e><p><l>u</l><r><s n="n"/><s n="mi"/><s n="sg"/><s n="loc"/></r></p></e>

  <e><p><l>oj</l><r><s n="n"/><s n="mi"/><s n="du"/><s n="acc"/></r></p></e>

  <e><p><l>i</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="nom"/></r></p></e>
  <e><p><l>i</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="acc"/></r></p></e>
  <e><p><l>i</l><r><s n="n"/><s n="mi"/><s n="pl"/><s n="voc"/></r></p></e>
</pardef>

Bыработка общих суффиксах парадигмы делает их более легким в обслуживании, но и более сложным для понимания. Особенности языка, Глубина описание и интуиции человека, пишущего словарь будет определять, в какой мере части могут быть выработанами на этом пути.

Теперь попробуйте и добавьте другие два слова в словарь, а также их флективные парадигмы. Решение можно найти на talk page.

Вы также можете попробовать добавить альтернативные формы (например, hrěchu качестве возможного родительного падежа единственного числа hrěch).

Примечания

  1. Это описание является упрощенным. Реальность сложнее, но это достаточна на этот раз

Дополнительная литература

См. также