Как использовать lttoolbox, чтобы разработать новый морфологический анализатор
- Информация о том, как установить 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 </ code> сделает морфологический анализатор и компиляция
rl </ code> сделает генератор.
Пользование
- 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).
Примечания
- ↑ Это описание является упрощенным. Реальность сложнее, но это достаточна на этот раз
Дополнительная литература
См. также