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