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

From Apertium
Jump to navigation Jump to search
m
 
(8 intermediate revisions by 3 users not shown)
Line 114: Line 114:
 
Символы <code>&lt;</code> и <code>&gt;</code> зарезервированы в <code>lexc</code>, так что нам нужно избежать их с <code>%</code>
 
Символы <code>&lt;</code> и <code>&gt;</code> зарезервированы в <code>lexc</code>, так что нам нужно избежать их с <code>%</code>
   
Мы также должны определить <code>Root</code> словарь, который будет указывать на основе слова <code>NounStems</code>. <code>Root</code> словарь аналог <code><section id="main" type="standard"></code> в [[lttoolbox]]:
+
Мы также должны определить <code>Root</code> словарь, который будет указывать на основе слова <code>NounStems</code>. <code>Root</code> словарь аналог <code>&lt;section id="main" type="standard"&gt;</code> в [[lttoolbox]]:
   
 
<pre>
 
<pre>
Line 154: Line 154:
 
</pre>
 
</pre>
   
(если у вас не установлен <code>hfst-lexc</code>, тогда у вас проблема- возможно вам надо компилировать с <code>--enable-lexc</code>, но в то же времени вы можете использовать <code>hfst-lexc2fst</code> в места <code>hfst-lexc</code>)
+
(если у вас не установлен <code>hfst-lexc</code>, тогда у вас проблема- возможно вам надо компилировать с <code>--enable-lexc</code>, но в то же времени вы можете использовать <code>hfst-lexc2fst</code> вместо <code>hfst-lexc</code>)
   
 
и оба мы можем проверить с <code>hfst-fst2strings</code>:
 
и оба мы можем проверить с <code>hfst-fst2strings</code>:
Line 186: Line 186:
 
| <code>:</code> || Символ <code>:</code> разделяет левую и правую сторону
 
| <code>:</code> || Символ <code>:</code> разделяет левую и правую сторону
 
|-
 
|-
| <code>%&gt;%&gt;l%{A%}r</code> || Это поверхность формы, которая разделена на:
+
| <code>%&gt;l%{A%}r</code> || Это поверхность формы, которая разделена на: <!-- %&gt;%&gt;l%{A%}r-->
 
|-
 
|-
 
|&nbsp;&nbsp;&nbsp; <code>%&gt;</code> || Разделитель границы морфемы
 
|&nbsp;&nbsp;&nbsp; <code>%&gt;</code> || Разделитель границы морфемы
Line 229: Line 229:
   
 
<pre>
 
<pre>
$ hfst-lexc apertium-tr-tk.tk.lexc > tk-tr.lexc.hfst
+
$ hfst-lexc apertium-tr-tk.tk.lexc -o tk-tr.lexc.hfst
 
</pre>
 
</pre>
   
Line 248: Line 248:
 
Идея <code>Twol</code> взять форму, которая построена на lexc и применить правила к ним, чтобы изменить их в реальные формы. Так вот, это то и есть где мы изменяем ''-l{A}r'' на ''-lar'' или ''-ler''.
 
Идея <code>Twol</code> взять форму, которая построена на lexc и применить правила к ним, чтобы изменить их в реальные формы. Так вот, это то и есть где мы изменяем ''-l{A}r'' на ''-lar'' или ''-ler''.
   
 
Етим мы хотим сказать, "если основа содержит гласные переднего ряда, мы хотим изменить гласные переднего ряда, если основа содержит гласные заднего ряда, то мы хотим изменить гласные заднего ряда.". И в то же время удалить границы морфемы. Давайте попробуем.
 
Етим мы хотим сказать, "если основа содержит гласные переднего ряда, мы хотим изменить гласные переднего ряда, если основа содержит гласные заднего ряда, то мы хотим изменить гласные заднего ряда.". И в то же время удалить границы морфемы.Давайте попробуем.
 
   
 
Мы сделаем новый файл <code>apertium-tr-tk.tk.twol</code>.
 
Мы сделаем новый файл <code>apertium-tr-tk.tk.twol</code>.
Line 299: Line 298:
 
 
 
"Front harmony in suffixes"
 
"Front harmony in suffixes"
%{A%}:e <=> FrontVowel: NonBack:* %>: NonBack:* _ ;
+
%{A%}:e <=> [ FrontVowel: NonBack:* ]/[ %>: ] _ ;
   
 
</pre>
 
</pre>
Line 322: Line 321:
   
 
<pre>
 
<pre>
$ hfst-compose-intersect -1 tr-tk.lexc.hfst -2 tr-tk.twol.hfst -o tr-tk.autogen.hfst
+
$ hfst-compose-intersect -1 tk-tr.lexc.hfst -2 tk-tr.twol.hfst -o tr-tk.autogen.hfst
 
</pre>
 
</pre>
   
Line 362: Line 361:
 
$ hfst-invert -i tr-tk.autogen.hfst -o tk-tr.automorf.hfst
 
$ hfst-invert -i tr-tk.autogen.hfst -o tk-tr.automorf.hfst
   
$ hfst-fst2strings tk-mor.hfst
+
$ hfst-fst2strings tk-tr.automorf.hfst
 
maşgala:maşgala<n>
 
maşgala:maşgala<n>
 
maşgalalar:maşgala<n><pl>
 
maşgalalar:maşgala<n><pl>

Latest revision as of 17:57, 22 March 2017

Информацию, как установить 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 (используют • чтобы отделять морфемы и для {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]

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

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

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