Филологические науки/ 3.Теоретические и методологические проблемы исследования языка

Заурбеков Д.Л., к.т.н, доц. Кайракбай Б.М.

Национальная научная лаборатория коллективного пользования информационных и космических технологий КазНТУ им.К.И.Сатпаева, Алматы, Республика Казахстан

 

Построение конечного преобразователя для морфологического анализа и генерации словоформ казахского языка

 

В статье представлена методология поэтапного построения конечного преобразователя (Finite State TransducerFST) для казахского языка с использованием технологии Xerox Finite  State  Machine (XFST) [1], с помощью которого можно осуществлять морфологический анализ и генерацию словоформ казахского языка.

Казахский язык относится к группе агглютинативных языков [2], в которых концепция слова значительно шире, чем просто набор элементов лексики, и отличается относительной регулярностью, позиционной и грамматической стабильностью морфологической структуры различных словоформ [3], что позволяет применить подход на основе конечных автоматов.

XFST формирует представление слова на базе так называемой двух-уровневой морфологии [4]: поверхностное (lower side – нижнего уровня) представление отражает то, как слово обычно записывается, а лексическое (upper side – верхнего уровня) отображает соответствующие лексические категории морфем рассматриваемого слова.

Введем базовое понятие машина конечных состояний (Finite  State  MachineFSM) или сеть конечных состояний (Finite State Network), где Сеть (network) состоит из состояний, включающих одно начальное состояние и одно или более конечных состояний. Переходы (transitions) между состояниями возможны только, если определен запрашиваемый вход. Путь (path) это последовательность переходов по дугам в определенном состоянии.

Типы FSM

– Конечный автомат (Finite State AutomatonFSA) есть FSM, которая только принимает множество строк (язык), описывающих язык.

– Конечный преобразователь (Finite State TransducerFST) является FSM, которая предоставляет набор выходов от принимаемых входов, выражает отношения между языками.

FSA (рис.1):

– Может использоваться для поиска (анализа), соответствия символов: либо принимает либо отклоняет ввод.

– Результат принимается, только если слово находится в сети данного языка.

Рисунок 1. FSA

FST (рис.2):

– Может совершать анализ (lookup) и генерацию (lookdown);

– Вход это символы поверхностного представления (бала-лар-ымыз) на пути, а выход это символы лексического представления (бала +N +Pl +P1) – устанавливают отношения между строками. Здесь  N означает имя существительное, Pl - аффикс множественного числа, P1 - аффикс первого лица.

бала +N +Pl +P1

Finite-state

transducer

 

 

 

 

 


бала-лар-ымыз

Рисунок 2. FST

Анализ (lookup):

·     Начать от Начального Состояния (Start State);

·     Сопоставление входных символов строки с символами поверхностного представления на дугах, взятие входных символов и нахождение пути к конечному состоянию;

·     Если успешно, возвратить строку лексического представления символов на пути как результат;

·     Если не успешно, ничего не возвращать.

Генерация (lookdown):

·     Начать от Начального Состояния (Start State);

·     Сопоставление входных символов строки с символами лексического представления на дугах, взятие входных символов и нахождение пути к конечному состоянию;

·     Если успешно, возвратить строку поверхностного представления символов на пути как результат;

·     Если не успешно, ничего не возвращать.

С помощью использования конечных преобразователей можно реализовать следующее:

1.       Комбинация морфем (морфотактика) может быть закодирована как сеть конечных состояний.

2.       Правила, определяющие форму каждой морфемы (чередование) могут быть реализованы как FST.

3.       Лексическая сеть (lexicon network) и правила преобразований могут быть объединены вместе в одну сеть (lexical transducer – лексический преобразователь). Он содержит всю морфологическую информацию о языке (рис.3).

 

Lexicon

Regular Expression

Lexicon

Regular Expression

Lexicon

FST

Rule

FSTs

Lexical Transducer

(a single FST)

Compiler composition

Рисунок 3. Лексическая сеть

Создание FST казахского языка

Этап 1. Создание файла lexс.

В первую очередь необходимо описать морфотактику казахского языка с помощью специального языка lexс, описание которого обычно производится в текстовом файле, с помощью простых текстовых редакторов, таких как Notepad, vi, pico и т.п.

Приведем пример для существительных. Порядок соединения морфем для существительного в казахском языке выглядит следующим образом:

КОРЕНЬ + АФФИКС МНОЖ.Ч. + ПРИТЯЖАТЕЛЬНЫЙ АФФИКС + ПАДЕЖНЫЙ АФФИКС  (+ ЛИЧНЫЕ ОКОНЧАНИЯ ПРЕДИКАТИВНОСТИ)

Строим теперь по этой схеме lexc файл:

! kaz_morph_lex.txt

! Комментарии в lexc файле пишутся за символом «восклицательный знак»

Multichar_Symbols

+Pl

+PossPl1

+PossSg1

+PossPl2

+PossSg2

+PossPl3

+PossSg3

+Case1                         

+Case2                         

+Case3                         

+Case4                         

+Case5                         

+Case6                         

+Case71                                  

+Case72                                  

+PersPl1                       

+PersSg1                      

+PersPl2                       

+PersSg2                      

+PersPlResp2               

+PersSgResp2              

! Определяем корни, в нашем случае только существительные Nouns

LEXICON Root

Nouns                                                    ;

! Объявим несколько корней существительных

LEXICON Nouns

бала                                          Plural ;

адам                                          Plural ;

сұрақ                                        Plural ;

! Объявляем аффикс множественного числа

LEXICON Plural

%+Pl:[л]ар                                Possessive;

%+Sg:0                                     Possessive;

! Объявляем притяжательные аффиксы

LEXICON Possessive

%+PossPl1:[ы]мыз       Case;

%+PossSg1:[ы]м          Case;

%+PossPl2:[ы]ңыз       Case;

%+PossSg2:[ы]ң           Case;

%+PossPl3:[с]ы            Case;

%+PossSg3:[с]ы           Case;

                                      Case;

! Объявляем аффиксы падежей

LEXICON Case

%+Case1:0                    Personal;

%+Case2:[д]ың            Personal;         

%+Case3:[қ]а                Personal;         

%+Case4:[д]ы              Personal;         

%+Case5:[т]а                Personal;         

%+Case6:[д]ан             Personal;         

%+Case71:[м]ен           Personal;         

%+Case72:[м]енен       Personal;

! Объявляем личные окончания (символ решетки говорит о конце строки)

LEXICON Personal

%+PersPl1:[м]ыз                      #;        

%+PersSg1:[м]ын                    #;        

%+PersPl2:сыңдар                   #;        

%+PersSg2:сың                        #;        

%+PersPlResp2:сыздар            #;        

%+PersSgResp2:сыз                 #;                    

                                                 #;

Этап 2. Введение регулярных выражений.

Регулярные выражения нам необходимы выполнения закона сингармонизма казахского языка. Можно заметить, что при создании lexc файла некоторые буквы в аффиксах были помещены в квадратные скобки, например:

%+Pl:[л]ар             Possessive;

Таким образом помечаем буквы, которые могут быть подвергнуты изменениям в регулярных выражениях.

Регулярные выражения можно вводить непосредственно в консоль xfst или же в скриптовом файле. Нам необходимо ввести правила замены букв согласно правилам ассимиляции. Регулярные выражения замены имеют следующий вид:

[ A -> B ||  _  ] ,

где A – символ (или набор символов), которые нужно заменить; B – символ (или набор символов), которыми необходимо произвести замену;

Символ нижнего подчеркивания « _ » обозначает позицию заменяемого символа. До и после этого знака мы можем указать соседние символы.

Приведем пример,

define rule [ л  -> д || [л | м | н | ң | ж | з] _ е р , [л | м | н | ң | ж | з] _ а р ];

Директива define это команда xfst, которая позволяет объявить регулярное выражение под каким либо именем. В данном случае мы определили регулярное выражение с именем rule, которое говорит о том что необходимо заменять букву «л» на «д», если ей предшествует одна из букв [л | м | н | ң | ж | з], а после нее следуют «ер» или «ар» (пробелы между буквами в «е р» и «а р» обязательны). Например, словоформа, которая будет сгенерирована нашим lexc файлом, адамлар будет подвергнута изменению регулярным выражением, и будет преобразована в адамдар.

Приведем фрагмент скриптового файла kaz_morph_fst.script, который может быть создан в любом текстовом редакторе:

# Комментарии в файлах xfst пишутся за знаком «решетка»

# Для начала объявим алфавит и регулярные наборы букв которые участвуют

# в правилах ассимиляции

# Vowels

define Vowel [ а | ә | о | ө | ы | і | у | ұ | ү | э | и | ю | я | е | ё ];

# Consonants or specials

define Cons [ б | в | г | ғ | д | ж | з | й | к | қ | л | м | н | ң | п | р | с | т | ф | х | Һ | ц | ч | ш | щ | ъ | ь ]; # 25 cons 2 special

# Alphabet

define Alphabet [ Vowel | Cons ];

define VoicelessCons [ к | қ | п | с | т | ш | щ | ф | х | ц | ч ];

define VoicedCons [ б | г | ғ | й | д | ж | з | һ | в | р | л | м | н | ң ];

define ChangeVoiceless [ б | г | ғ ];

define ChangeVoiced [ к | қ | п ];

define JZ [ ж | з ];

define BVGD [ б | в | г | д ];

...

define Sonorant [ р | л | й | у | м | н | ң ];

define possAfx1 [ ы м | і м | м | ы м ы з | і м і з | м ы з | м і з ];

...

define possAfx [ possAfx1 | possAfx2 | possAfx3 ];

# Теперь напишем регулярные выражения для аффиксов описанных в lexc файле

# Специальное обозначение «.о.», которое будет встречаться в некоторых примерах, обозначает операцию «композиции» между регулярными выражениями. Композиция [A .o. B] обозначает, что если А содержит пару строк <x,y>, а В содержит <y,z>, то отношение композиции [A .o. B] содержит <x,z>. В простом понимании это позволяет нам объединить несколько регулярных выражений воедино.

# **************************************************

#     Множественное число

# **************************************************

define plural1 [ %[ л %] -> д || LMNN | JZ _ е р, LMNN | JZ _ а р];

define plural2 [ %[ л %] -> т || VoicelessCons | BVGD _ е р , VoicelessCons | BVGD _ а р];

define plural3 [ %[ л %] -> л || Vowel | RUI _ е р, Vowel | RUI _ а р];

# **************************************************

#     Притяжательные аффиксы

# **************************************************

define possessive1 [ %[ і %] -> 0 || Vowel _ м і з, Vowel _ ң і з, Vowel _ ң, Vowel _ м];

define possessive2 [ %[ ы %] -> 0 || Vowel _ м ы з, Vowel _ ң ы з, Vowel _ ң, Vowel _ м];

...

# **************************************************

#     Падежи

# **************************************************

define case21 [ %[ д %] -> д || LRUI | JZ _ ы ң, LRUI | JZ _ і ң];

define case22 [ %[ д %] -> т || VoicelessCons | BVGD _ ы ң, VoicelessCons | BVGD _ і ң];

define case23 [ %[ д %] -> н || Vowel | MNN | possAfx3 _ ы ң, Vowel | MNN | possAfx3 _ і ң];

define case31 [ [ %[ қ %] -> ғ || Vowel | Sonorant | JZ _ а] .o.

                        [ %[ к %] -> г || Vowel | Sonorant | JZ _ е] ];

# **************************************************

#     Личные окончания предикативности

# **************************************************

define pers1 [ [%[ м %] -> б || JZ _ ы н , JZ _ і н] .o.

                        [%[ м %] -> п || VoicelessCons _ ы н , VoicelessCons _ і н] .o.      

              [%[ м %] -> м || [Alphabet - [JZ | VoicelessCons]] _ ы н , [Alphabet - [JZ | VoicelessCons]] _ і н] ];

define pers2 [ [%[ м %] -> б || JZ _ ы з , JZ _ і з] .o.

              [%[ м %] -> п || VoicelessCons _ ы з , VoicelessCons _ і з] .o.

              [%[ м %] -> м || [Alphabet - [VoicelessCons | JZ]] _ ы з , [Alphabet - [VoicelessCons | JZ]] _ і з] ];

# Теперь неоходимо объеденить наши регулярные выражения и поместить

# объявленные регулярные выражения в стек

# Делается это с помощью команды regex

regex [

          plural1 .o. plural2 .o. plural3

          .o. possessive1 .o. possessive2 .o. possessive3 .o. possessive4 .o. possessive5

          .о. possessive6

          .o. case21 .o. case22 .o. case23 .o. case31 .o. case32 .o. case33 .o. case34

          .o. case41 .o. case42 .o. case43 .o. case44 .o. case51 .o. case52 .o. case53

          .o. case61 .o. case62 .o. case63 .o. case71 .o. case72 .o. case73

          .o. pers1 .o. pers2

          ];

Этап 3. Объединение lexc и регулярных выражений в морфологический генератор/анализатор.

Для удобства напишем скрипт в файл KazFST.script:

# Очистим стек, если в нем что-то присутствовало до этого командой clear

clear

# Загрузим наш lexc файл в стек с помощью следующей команды

read lexc < kaz_morph_lex.txt

# Загрузим регулярные выражения из скрипта kaz_morph_fst.script

source kaz_morph_fst.script

# Меняем местами, загруженные в стек сети

turn stack

# Объединяем сети lexc и регулярных выражений

compose net

# Выведем полученные словоформы в файл words.txt

print lower-words >words.txt

Теперь можно загрузить наш FST, выполнив приведенный выше скрипт. Для этого в консоли xfst выполним команду:

source KazFST.script

Теперь мы имеем следующие файлы:

Запустим xfst.exe и введем команду source KazFST.script:

После этого увидим вот такой результат:

Будет создан файл words.txt, в котором будут все сгенерированные нашим скриптом словоформы.

Для генерации и анализа используются команды apply down и apply up, соответственно. Например, для анализа формы слова «балалар» мы можем написать следующую команду:

Данная команда выдает в результате бала+Pl+Case1, из которой можно увидеть корень бала, +Pl обозначает множественное число, а +Case1 именительный падеж, т.е. слово балалар  находится в именительном падеже и множественном числе.

Для генерации воспользуемся командой apply down, и получим следующую форму слова бала во множественном числе и родительном падеже: балалардың.

Литература

 

1.    Beesley, Kenneth R. & Lauri Karttunen. Finite State Morphology. – Stanford, CA: CSLI Publications, 2003. – 503 pp.

2.    Баскаков Н.А. Алтайская семья языков и ее изучение. – М.: Наука, 1981. – 135 с.

3.    Сопоставительная грамматика русского и казахского языков. Морфология. – Алма-Ата: Наука, 1966. – 459 с.

4.    Koskenniemi Kimmo. Two-level morphology. – University of Helsinki, publication No.11, 1983. – 160 pp.