Apertium has moved from SourceForge to GitHub.
If you have any questions, please come and talk to us on #apertium on irc.freenode.net or contact the GitHub migration team.

Как использовать HFST, чтобы разработать новый морфологический анализатор

From Apertium
Jump to: navigation, search

Contents

Информацию, как установить HFST, смотреть HFST

Эта страница объяснит, как начать учиться новый язык вместе с HFST. Вот некоторые ссылки с lexc и twol формализмом, например, FSMBook, но многие из них занимаются продажой запатентованым Xerox, а не бесплатным HFST.

В то время когда реальный формализм более или менее равный, команды, используемые для их компиляции не всегда те же самые. HFST гораздо более совместима с философией Unix. Так что мы будем его использовать. Большинство индо-европейских языков и изолированных языков можно легко просмотреть с lttoolbox, мы будем в состояние справиться с языком не из этой семьи, и с языком, который морфологически сложнее, с которым трудно справиться с lttoolbox.


[edit] Подготовка

Морфологический преобразователь в HFST имеет два файла, один lexc файл. Это определяет, как морфемы в языке соединяются вместе, морфотактики. Второй файл может быть twol (двухуровневое правило) или xfst (последовательного правила перезаписи файла). Они описывают, какие изменения происходят, когда эти морфемы соединяются вместе- морфо графемика (или морфонология). Например,

морфотактика: wolf<n><pl>wolf + s
морфо графемика: wolf + swolves

Здесь мы будем иметь дело с 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 (используют • чтобы отделять морфемы и <s n="A"/> для {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. Как это получит?

[edit] Вводите 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.

[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] См. также

[edit] Примечания

  1. На самом деле это очень сложно, но с этим примером вам получится

[edit] Дополнительная литература

Personal tools