Как использовать HFST, чтобы разработать новый морфологический анализатор
- Информацию, как установить HFST, смотреть HFST
Эта страница объяснит, как начать учиться новый язык вместе с HFST. Вот некоторые ссылки с lexc и twol формализмом, например, FSMBook, но многие из них занимаются продажой запатентованым Xerox, а не бесплатным HFST.
В то время когда реальный формализм более или менее равный, команды, используемые для их компиляции не всегда те же самые. HFST гораздо более совместима с философией Unix. Так что мы будем его использовать. Большинство индо-европейских языков и изолированных языков можно легко просмотреть с lttoolbox, мы будем в состояние справиться с языком не из этой семьи, и с языком, который морфологически сложнее, с которым трудно справиться с lttoolbox.
Подготовка
Морфологический преобразователь в HFST имеет два файла, один lexc </ code> файл. Это определяет, как морфемы в языке соединяются вместе, морфотактики. Второй файл может быть
twol </ code> (двухуровневое правило) или
xfst </ code> (последовательного правила перезаписи файла). Они описывают, какие изменения происходят, когда эти морфемы соединяются вместе- морфо графемика (или морфонология). Например,
- морфотактика:
wolf<n><pl>
→ wolf + s
- морфо графемика:
wolf + s
→ wolves
Здесь мы будем иметь дело с </ code>, двухуровневым правилом. Если вы заинтересованы в xfst </ code>, есть хороший учебник на сайте Foma.
[1] Foma
В следующих параграфах мы собираемся начать с лексикой (lexc
file) затем мы будем продолжать с морфографемикой (twol
file).
Убедитесь, что у вас есть HFST3 скомпилированный.
Язык
Язык, который мы собираемся сегодня моделировать - туркменский, тюркский язык на котором говорят в Туркмении.Языковые пары, с которыми мы будем работать, турецкий - туркменский. Мы собираемся моделировать основные изменения формы слова (число, падеж) существительных. Oсновные виды изменения существительных в туркменском языке: шесть падежей, два вида чисел, имя собственное. Суффиксы могут иметь различные формы в зависимости от того, привязаны ли к основе слова гласным или согласным.
Гармония гласных
Проще говоря <ref>, в основе слова на туркменском языке может быть один из двух типов, гласных - заднего или переднего ряда.
Гласные заднего ряда, такие как в слове “mugallym”- “учитель” только гласные заднего ряда, и передние гласные , такие как в слове “kädi” "тыквa" есть только передние гласные. Гласными заднего ряда в туркменском языке, являются: а, у, о, и u. Гласными переднего ряда являются ä, e, i, ö, и ü.
Таким образом, выбирая суффикс, мы должны знать какие гласные в основе слова , чтобы правильно выбрать гласную для добавления в суффикс.
Число
Число в туркменском может быть неопределенным (там, где нет суффикса) или множественным, где суффикс-lar или -ler. Первый используется с задними гласными, а второй с гласными переднего ряда.
падежи
Мы более компактно покажем в таблице ниже, как используются суффиксы в изменениях по падежам. Между ‘’{‘’ и ‘’}’’ как изменяются гласные в суффиксах при изменнении по падежам , и между ‘’(‘’ и ’’)’’ являются эпентезои.
epentheses.
Падеж
Суффикс
Пользование
Пример
V
C
V
C
Именительный падеж
Указывает на предмет предложения
pagta
gazan
Родительный падеж
-n{y,i,u,ü}ň
-{y,i,u,ü}ň
Указывает положение
pagtanyň
gazanyň
Дательный падеж
-{a,ä} , -n{a,e}
-{a,e}
Неопределенный объект (направленное действие)
pagta
gazana
Винительный падеж
-n{y,i}
-{y,i}
Определенный объект
pagtany
gazany
Творительный падеж
-(n)d{a,e}
-d{a,e}
Время/ место
pagtada
gazanda
Предложный падеж
-(n)d{a,e}n
-d{a,e}n
Происхождение
pagtadan
gazandan
Полный пример
Примечание: Это не включает притяжательный падеж
maşgala " семья "
Падеж
Единственное число
Множественное число
Именительный падеж
maşgala
maşgalalar
Родительный падеж
maşgalanyň
maşgalalaryň
Дательный падеж
maşgala
maşgalalara
Винительный падеж
maşgalany
maşgalalary
Творительный падеж
maşgalada
maşgalalarda
Предложный падеж
maşgaladan
maşgalalardan
esger " солдат "
Падеж
Единственное число
Множественное число
Именительный падеж
esger
esgerler
Родительный падеж
esgeriň
esgerleriň
Дательный падеж
esgere
esgerlere
Винительный падеж
esgeri
esgerleri
Творительный падеж
esgerde
esgerlerde
Предложный падеж
esgerden
esgerlerden
Словарный запас
Таким образом, после описания, давайте начнем с лексики. Файл, который мы создадим называется apertium-tr-tk.tk.lexc
, и он содержит словарный запас из преобразователя. Вам необходимо открыть текстовый редактор.
Основы
Первое, что нужно для дефинировать этикетки которые мы хотим создать. В lttoolbox, это возможно с <sdefs>
часть ю.dix
фаила.
Multichar_Symbols
%<n%> ! Noun
%<nom%> ! Nominative
%<pl%> ! Plural
Символы <
и >
зарезервированы в lexc
, так что нам нужно избежать их с %
Мы также должны определить Root
словарь, который будет указывать на основе слова NounStems
. Root
словарь аналог <section id="main" type="standard">
в lttoolbox:
LEXICON Root
NounStems ;
Теперь давайте добавим наши слова:
LEXICON NounStems
maşgala Ninfl ; ! " семья "
esger Ninfl ; ! "солдат"
Сначала поставим основа слова, затем пример (или продолжение класса ) который принадлежит здесь, в этом случае Ninfl
, и наконец, в комментариях (символ комментарий !
) положим перевод.
И дефинируем падеж, который прикреплен к основе слова с <n> чтобы указать существительное:
LEXICON Ninfl
%<n%>: # ;
LEXICON
должен быть перед NounStems
словаре. Этот #
символ является рубежом последнего слова . этот символ очень важен потому что он показывает окончание предложение.
Компиляция
Итак, теперь у нас есть простой словарь, компилируем и проверим его. Мы компилируем его с hfst-lexc
:
$ hfst-lexc apertium-tr-tk.tk.lexc -o tk-tr.lexc.hfst
(если у вас не установлен hfst-lexc
, тогда у вас проблема- возможно вам надо компилировать с --enable-lexc
, но в то же времени вы можете использоватьhfst-lexc2fst
в места hfst-lexc
)
и оба мы можем проверить с hfst-fst2strings
:
$ hfst-fst2strings tk-tr.lexc.hfst
maşgala<n>:maşgala
esger<n>:esger
Продолжение словаря
Итак мы узнали, что maşgala и esger существительное, но как со склонением. Это где '’продолжительная лексика’’ начинается. Например парадигма в lttoolbox.
Простые морфотактике туркменских существительних является :
stem plural? possessive? case copula?
в которым ?
обозначает необязательность. здесь мы работаем только с числами и склонениями, так что давайте опишем склонения, во-первых, мы можем начать с числами. В разделе файла LEXICON Ninfl
, добавьте следующую строку:
%<n%>%<pl%>:%>l%{A%}r # ;
Это выглядит очень сложно но у каждой строчке есть своя причина:
часть
описание
%<n%>%<pl%>
часть на левой стороне определяет анализ, в данном случае существительного, во множественном числе. Заметите, что это, в отличие от lttoolbox, где анализ, как правило, на правой стороне.
:
-
%>%>l%{A%}r
Это поверхность формы, которая разделена на:
%>
Разделитель границы морфемы
l%{A%}r
Поверхность морфемы, в данном случае -lar или -ler
%{A%}
это место для гласного который может быть а или е
#
конец ряда слов
;
конец ряда
Одна из причин почему это кажется трудно- все %
символы. Если мы бы убрали их тогда было бы гораздо легче прочитать:
<n><pl>:>l{A}r # ;
(они вам дальше необходимы)
Для сравнения, в lttoolbox (используют • чтобы отделять морфемы и для {A}), это выглядит примерно так:
<e><p><l>•l<s n="A"/>r</l><r><s n="n"/><s n="pl"/></e>
Итак, мы добавили первый из наших склонений, во множественном числе. Нам нужно сделать две вещи, прежде чем мы сможем проверить это. Для начала нам нужно добавить %{A%}
в разделе Multichar_Symbols
, так что идите вверх и добавьте его, у вас должно получится:
Multichar_Symbols
%<n%> ! noun
%<nom%> ! nominative
%<pl%> ! plural
%{A%} ! гласный 'a' или 'e'
Теперь сохраните файл. Следующее, что нам нужно сделать, это скомпилировать еще раз:
$ hfst-lexc apertium-tr-tk.tk.lexc > tk-tr.lexc.hfst
И тогда мы можем проверить:
$ hfst-fst2strings tk-tr.lexc.hfst
maşgala<n><pl>:maşgala>l{A}r
maşgala<n>:maşgala
esger<n><pl>:esger>l{A}r
esger<n>:esger
Итак, это здорово, но это не настоящие формы. Mы некогда не увидим esger>l{A}r в тексте. Формы которые мы ищем- esgerler. Как это получит?
Вводите twol
Идея Twol
взять форму, которая построена на lexc и применить правила к ним, чтобы изменить их в реальные формы. Так вот, это то и есть где мы изменяем -l{A}r на -lar или -ler.
Етим мы хотим сказать, "если основа содержит гласные переднего ряда, мы хотим изменить гласные переднего ряда, если основа содержит гласные заднего ряда, то мы хотим изменить гласные заднего ряда.". И в то же время удалить границы морфемы.Давайте попробуем.
Мы сделаем новый файл apertium-tr-tk.tk.twol
.
Сначала мы должны определить алфавит:
Alphabet
A B Ç D E Ä F G H I J Ž K L M N Ň O Ö P R S Ş T U Ü W Y Ý Z
a b ç d e ä f g h i j ž k l m n ň o ö p r s ş t u ü w y ý z
%{A%}:a ;
Вы не должны разделить большие и маленькие буквы на отдельные строчке, но это может помочь ориентироваться в них проще.
Мы также хотим удалить границы морфемы %>
из формы, поэтому добавьте следующию строчку снизу сточки с маленькими буквами и перед ;
:
%>:0
Здесь на левой стороне морфоматичная форма и на правой стороне основная форма. Делая %>:0
изменения %>
на 0
, это то же самое, что и удаление. Символ 0
не показывается.
Так что в конце алфавит будет выглядеть так:
Alphabet
A B Ç D E Ä F G H I J Ž K L M N Ň O Ö P R S Ş T U Ü W Y Ý Z
a b ç d e ä f g h i j ž k l m n ň o ö p r s ş t u ü w y ý z
%{A%}:a %>:0 ;
Далее нам нужно определить некоторые "наборы" для работы, это в основном для придания мнемоники к функциям, как "передние гласные" и "гласные заднего ряда", мы хотим чтобы они позднее пологались на правила:
Sets
Consonant = B Ç D F G H J Ž K L M N Ň P R S Ş T W Z
b ç d f g h j ž k l m n ň p r s ş t w z ;
Vowel = A E Ä I O Ö U Ü Y Ý
a e ä i o ö u ü y ý ;
FrontVowel = Ä E I Ö Ü ä e i ö ü ;
BackVowel = A Y O U a y o u ;
NonBack = Consonant FrontVowel %> ;
NonFront = Consonant BackVowel %> ;
Так что теперь у нас есть все, для добавления правил. Cуществует новый раздел Rules
:
Rules
"Front harmony in suffixes"
%{A%}:e <=> FrontVowel: NonBack:* %>: NonBack:* _ ;
В основном правило говорит: "заменить {A} с e’’, если предыдущие буквы любые, кроме гласних заднего ряда, потом есть граница морфем, и тогда там нет гласних заднего ряда, и в какойто момент есть гласные переднего ряда"
Затем, составим правило и проверим его:
$ hfst-twolc -R -i apertium-tr-tk.tk.twol -o tk-tr.twol.hfst
Reading input from tk.twol.
Writing output to tk.twol.hfst.
Reading alphabet.
Reading sets.
Reading rules and compiling their contexts and centers.
Compiling and storing rules.
Compiling rules.
Storing rules.
С силой пересекаем состав!
Для того чтобы получить окончательный преобразователь, что нам нужно сделать, это объединить модель морфотактике (lexc
) с моделом морфогафики (twol
). Способ сделать это называется "пересечения состав", который является довольно эффективным. Существует также инструмент в HFST, которий называется hfst-compose-intersect
, что мы и будем использовать.
$ hfst-compose-intersect -1 tr-tk.lexc.hfst -2 tr-tk.twol.hfst -o tr-tk.autogen.hfst
Теперь мы можем проверить окончательный преобразователь:
$ hfst-fst2strings tr-tk.autogen.hfst
maşgala<n>:maşgala
maşgala<n><pl>:maşgalalar
esger<n>:esger
esger<n><pl>:esgerler
Отлично! У нас есть желаемые формы.
Анализ и генерация
Преобразователь мы сделали выше, был для генерации, но мы пока не можем использовать его с hfst-proc
из-за формата. Если мы хотим использовать его с hfst-proc
, все, что нужно сделать, это изменить формат, с помощью следующей команды:
$ hfst-fst2fst -O -i tr-tk.autogen.hfst -o tr-tk.autogen.hfst.ol
Теперь мы должны быть способны генерировать оба наших множественных чисел:
$ echo "^maşgala<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol
maşgalalar
и
$ echo "^esger<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol
esgerler
Но что, если мы хотим анализировать какое-то слова? Ну, тогда нам нужно переконфигурировать преобразователь. То есть изменить левую сторону с правой, давайте сделаем это в два этапа, чтобы мы смогли увидеть результаты:
$ hfst-invert -i tr-tk.autogen.hfst -o tk-tr.automorf.hfst
$ hfst-fst2strings tk-mor.hfst
maşgala:maşgala<n>
maşgalalar:maşgala<n><pl>
esger:esger<n>
esgerler:esger<n><pl>
Как видим, теперь левая сторона основной формы, а правая сторона анализа. Теперь просто надо конвертировать анализатор для оптимизированного просмотра формате:
$ hfst-fst2fst -O -i tk-tr.automorf.hfst -o tk-tr.automorf.hfst.ol
И сделать анализ:
$ echo "maşgalalar" | hfst-proc tk-tr.automorf.hfst.ol
^maşgalalar/maşgala<n><pl>$
$ echo "esgerler" | hfst-proc tk-tr.automorf.hfst.ol
^esgerler/esger<n><pl>$
Устранение неполадок
Вот краткий Контрольный список устранения неполадок, когда вы что-то сделали, но это не работает:
- Все ли ваши символы, дефинированы? В том числе гласные / согласные. Если вы думаете, что добавили их проверьте еше раз. Это касается проблем в
twol
а также в lexc
.
Примечания
Дополнительная литература