Как использовать HFST, чтобы разработать новый морфологический анализатор
- Информацию, как установить HFST, смотреть HFST
Эта страница объяснит, как начать учиться новый язык вместе с HFST. Вот некоторые ссылки с lexc и twol формализмом, например, FSMBook, но многие из них занимаются продажой запатентованым Xerox, а не бесплатным HFST.
В то время когда реальный формализм более или менее равный, команды, используемые для их компиляции не всегда те же самые. HFST гораздо более совместима с философией Unix. Так что мы будем его использовать. Большинство индо-европейских языков и изолированных языков можно легко просмотреть с lttoolbox, мы будем в состояние справиться с языком не из этой семьи, и с языком, который морфологически сложнее, с которым трудно справиться с lttoolbox.
Подготовка
Морфологический преобразователь в HFST имеет два файла, один  lexc  файл. Это определяет, как морфемы в языке соединяются вместе, морфотактики. Второй файл может быть  twol  (двухуровневое правило) или  xfst  (последовательного правила перезаписи файла). Они описывают, какие изменения происходят, когда эти морфемы соединяются вместе- морфо графемика (или морфонология). Например,
- морфотактика: wolf<n><pl>→wolf + s
- морфо графемика: wolf + s→wolves
Здесь мы будем иметь дело с  twol , двухуровневым правилом. Если вы заинтересованы в  xfst , есть хороший учебник на сайте Foma.
[1] Foma
В следующих параграфах мы собираемся начать с лексикой (lexc file) затем мы будем продолжать с морфографемикой (twol file).
Убедитесь, что у вас есть HFST3 скомпилированный.
Язык
Язык, который мы собираемся сегодня моделировать - туркменский, тюркский язык на котором говорят в Туркмении. Языковые пары, с которыми мы будем работать, турецкий - туркменский. Мы собираемся моделировать основные изменения формы слова (число, падеж) существительных. Oсновные виды изменения существительных в туркменском языке: шесть падежей, два вида чисел, имя собственное. Суффиксы могут иметь различные формы в зависимости от того, привязаны ли к основе слова гласным или согласным.
Гармония гласных
Проще говоря,[1], в основе слова на туркменском языке может быть один из двух типов, гласных - заднего или переднего ряда. Гласные заднего ряда, такие как в слове “mugallym”- “учитель” только гласные заднего ряда, и передние гласные , такие как в слове “kädi” "тыквa" есть только передние гласные. Гласными заднего ряда в туркменском языке, являются: а, у, о, и u. Гласными переднего ряда являются ä, e, i, ö, и ü. Таким образом, выбирая суффикс, мы должны знать какие гласные в основе слова , чтобы правильно выбрать гласную для добавления в суффикс.
Число
Число в туркменском может быть неопределенным (там, где нет суффикса) или множественным, где суффикс-lar или -ler. Первый используется с задними гласными, а второй с гласными переднего ряда.
Падежи
Мы более компактно покажем в таблице ниже, как используются суффиксы в изменениях по падежам. Между ‘’{‘’ и ‘’}’’ как изменяются гласные в суффиксах при изменении по падежам , и между ‘’(‘’ и ’’)’’ являются эпентезой.
| Падеж | Суффикс | Пользование | Пример | ||
|---|---|---|---|---|---|
| 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 -o 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:* ]/[ %>: ] _ ;
В основном правило говорит: "заменить {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 tk-tr.lexc.hfst -2 tk-tr.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-tr.automorf.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.
См. также
- Starting a new language with HFST
- Jaunas valodas uzsakšana ar HFST
- HFST ile yeni bir dile başlamak
- Crearea unui dictionar folosind HFST
Примечания
- ↑ На самом деле это очень сложно, но с этим примером вам получится

