Как использовать 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

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

Язык

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

парадигмы

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

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






неживой мужского рода (hrěch " грех ")

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

! единственное число
Именительный hrěch

color:#cceeff">hrěchi

Родительный
Дательный
Винительный hrěch

hrěchaj || hrěchi

Инструментальные
Местный

hrěchach

Звательный hrěcho! hrěchaj! hrěchi!

|| hrěcha || hrěchow || hrěchow

|| hrěchej || hrěchomaj || hrěcham

|| hrěchom || hrěchomaj || hrěchami

|| hrěchu || hrěchomaj ||

женский (wróna "ворона")

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

! единственное число
Именительный
Родительный wrónu wrónow

wrónow

Дательный wrónje wrónomaj

wrónam

Винительный
Инструментальные wrónu wrónomaj wrónami
Местный wrónje wrónomaj

wrónach

Звательный

|| wróna || wrónje || wróny

|| wrónu || wrónje || wróny

|| wróna! || wrónje! || wrónu!

средний род (trašidło " чудовище ")

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

! единственное число
Именительный
Родительный trašidła trašidłow

trašidłow

Дательный trašidłu trašidłomaj

trašidłam

Винительный
Инструментальные 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

|| trašidło || trašidłe || trašidła

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

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

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

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


<sdefs>
 <sdef n="n" c="Noun"/>

 <sdef n="ma" c="Masculine (animate)"/>
 <sdef n="mi" c="Masculine (inanimate)"/>
 <sdef n="nt" c="Neuter"/>
 <sdef n="f" c="Feminine"/>

 <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

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

Это главное преимущество над относящимися к программного обеспечения (например, HFST). Если вы не введете определение символа, то вы получите сообщение от проверки скрипта, например, следующие:

$ 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< code> (для общего мужского суффикс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>

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

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

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

Примечания

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

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

См. также