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