Модуль морфологического анализа, проверки орфографии и лемматизации украинского языка
1.Общее описание модуля
Как и следует из названия, модуль предназначен для проверки правописания отдельных слов (правильно - неправильно), лемматизации (построения нормальных форм слов по произвольной форме), извлечения грамматических описаний тех форм, с которыми совпала поданная строка, и морфологического синтеза форм по нормальной форме и грамматическому описанию, и построения списка возможных правильных начертаний для неправильного слова (подсказка).Модуль реализован в виде динамической библиотеки Win32, содержит словари в виде ресурсов и экспортирует функции в C-стиле (то есть для их вызова требуется декларация extern “C”).
Модуль работает с ASCIIZ-строками, то есть строками, где один символ кодируется одним байтом, а нулевой символ обозначает конец строки, и подразумевает, что строки на вход ему подаются в кодировке 1251 (Windows Cyrillic).
Словарь модуля объемом около 120000 слов при генерации разбивается на страницы размером менее 64К, что позволяет оптимально организовать работу с памятью и использовать короткое слово (16 бит) для адресации внутри страницы с другой. Алгоритм модуля предельно прост и представляет собой интерпретатор таблиц переходов конечного автомата, в то время как страницы словаря являются этими самыми таблицами.
Благодаря этим решениям словарь модуля не превышает размером один мегабайт, устойчиво работает при объеме доступной памяти около 200К, а при наличии свободного мегабайта оперативной памяти загружает все страницы и выходит на максимальную производительность не менее (а реально более) 10000 слов в секунду (в режиме проверки правописания, процессор Pentium 100). Производительность модуля в режиме лемматизации (построения текстов нормальных форм слова) несколько ниже, так как приходится просматривать весь словарь, и составляет не менее 2000 слов в секунду (в тех же условиях).
2.Форматы данных
При построении нормальных форм слова, равно как и при морфологическом синтезе, модуль морфологического анализа оперирует частями речи и грамматическими описаниями форм. Часть речи и грамматическое описание вместе составляют грамматическую информацию, описываемую структурой SGramInfo:
2.1.Часть речи
Часть речи, извлекаемая из поля wInfo грамматической информации, может быть использована, например, для определения признака значимости анализируемого слова или для иных целей.Чтобы определить часть речи, следует замаскировать служебные биты wInfo маской 0x3F, после чего воспользоваться таблицей соответствий:
wInfo & 0x3F | Мнемоника | Часть речи украинская |
---|---|---|
1 | ч | Неодушевленное существительное мужского рода |
2 | чi | Одушевленное существительное мужского рода |
3 | ч/ж | Неодушевленное существительное общего рода |
4 | чi/жi | Одушевленное существительное общего рода |
5 | ч/с | Неодушевленное существительное мужского/среднего рода |
6 | чi/сi | Одушевленное существительное мужского/среднего рода |
7 | ж | Неодушевленное существительное женского рода |
8 | жi | Одушевленное существительное женского рода |
9 | ж/с | Неодушевленное существительное женского/среднего рода |
10 | с | Неодушевленное существительное среднего рода |
11 | сi | Одушевленное существительное среднего рода |
12 | мн | Неодушевленное существительное множественного числа |
13 | мнi | Одушевленное существительное множественного числа |
14 | ч-ж | Неодушевленное существительное мужского рода, изменяющееся по схеме женского |
15 | чi-жi | Одушевленное существительное мужского рода, изменяющееся по схеме женского |
16 | п | Прилагательное |
17 | числ | Числительное |
18 | числ_2 | Числительное “два” (имеющее род) |
19 | числ_п | Порядковое числительное |
20 | з | Личное местоимение (местоимение - существительное, например, “вiн” - он) |
21 | зп | Местоимение - прилагательное |
22 | ipf | Глагол несовершенного вида |
24 | pf | Глагол совершенного вида |
26 | pfipf | Двувидовой глагол |
28 | виг. | Междометье |
29 | прийм. | Предлог |
30 | присл. | Наречие |
31 | спол. | Союз |
32 | част. | Частица |
33 | незм. | Неизменяемое слово без указания части речи |
34 | вводн. | Вводное слово |
35 | аб. | Аббревиатура |
2.2.Грамматическое описание
Грамматическое описание является точным двоичным идентификатором некоторой формы слова, но обладает свойством аддитивности, то есть короткое слово (шестнадцать бит) разделено на зоны, каждая из которых отвечает за некоторый грамматический признак.Ниже приведены мнемоники из файла прототипов со значениями и толкованиями каждого из них:
Признак | Значение | Толкование | Встречается у |
---|---|---|---|
gfRetForms | 0x8000 | Признак возвратности | прилагательных, глаголов |
gfFormMask | 0x7000 | Маска зоны указания падежа | глаголов, прилагательных, существительных, числительных, местоимений |
gfNominative | 0x0000 | Именительный падеж | —”— |
gfGenative | 0x1000 | Родительный падеж | —”— |
gfDative | 0x2000 | Дательный падеж | —”— |
gfAccusative | 0x3000 | Винительный падеж | —”— |
gfInstrumental | 0x4000 | Творительный падеж | —”— |
gfPrepositional | 0x5000 | Предложный падеж | —”— |
gfCalling | 0x6000 | Звательный падеж | —”— |
gfGendMask | 0x0E00 | Маска зоны рода и числа | —”— |
gfMasculine | 0x0200 | Мужской род | —”— |
gfFeminine | 0x0400 | Женский род | —”— |
gfNewtral | 0x0600 | Средний род | —”— |
gfMultiple | 0x0800 | Множественное число | —”— |
gfVerbForm | 0x0060 | Маска зоны личностности | глаголов |
vfPersonal | 0x0000 | Личная форма | —”— |
vfActive | 0x0020 | Действительное причастие | —”— |
vfPassiv | 0x0040 | Страдательное причастие | —”— |
vfGerund | 0x0060 | Деепричастие | —”— |
gfVerbFace | 0x0018 | Маска зоны лица | —”— |
vbFirstFace | 0x0008 | Первое лицо | —”— |
vbSecondFace | 0x0010 | Второе лицо | —”— |
vbThirdFace | 0x0018 | Третье лицо | —”— |
gfVerbTime | 0x0007 | Маска зоны времени | —”— |
vtInfinitiv | 0x0001 | Инфинитив (неопределенная форма) | —”— |
vtImperativ | 0x0002 | Императив (повелительное наклонение) | —”— |
vtFuture | 0x0003 | Будущее время | —”— |
vtPresent | 0x0004 | Настоящее время | —”— |
vtPast | 0x0005 | Прошедшее время | —”— |
2.3.Дополнительные признаки
К дополнительным относятся такие признаки, как одушевленность-неодушевленность и затрудненность формы:Признак | Значение | Толкование |
---|---|---|
afAnimated | 0x01 | Данная форма прилагательного или причастия согласуется только с одушевленными существительными |
afNotAlive | 0x02 | Данная форма прилагательного или причастия согласуется только с неодушевленными существительными |
afHardForm | 0x04 | Затрудненная форма, отождествление которой возможно лишь в режиме распознавания затрудненных форм слов |
2.4.Идентификаторы форм
Часть речи | FID | Толкование | ||||
---|---|---|---|---|---|---|
существительное | 0 | ед. | именительный падеж | |||
1 | родительный падеж | |||||
2 | дательный падеж | |||||
3 | винительный падеж | |||||
5 | творительный падеж | |||||
6 | предложный падеж | |||||
7 | звательный падеж | |||||
10 | мн. | именительный падеж | ||||
11 | родительный падеж | |||||
12 | дательный падеж | |||||
13 | винительный падеж | |||||
15 | творительный падеж | |||||
16 | предложный падеж | |||||
17 | звательный падеж | |||||
прилагательное | 0 | муж. | именительный падеж | |||
1 | родительный падеж | |||||
2 | дательный падеж | |||||
3 | винительный падеж, неодушевлённый | |||||
4 | винительный падеж, одушевлённый | |||||
5 | творительный падеж | |||||
6 | предложный падеж | |||||
8-13 | жен. | см. мужской род, формы 0 - 6 | ||||
16-22 | ср. | |||||
24-30 | мн. | |||||
глагол | 0 | инфинитив | регулярная форма | |||
1 | возвратная форма | |||||
2 | повелительное | невозвратный | ед. | |||
3 | мн. | |||||
4 | возвратный | ед. | ||||
5 | мн. | |||||
6 | буд. | 1-е лицо | невозвратная | ед. | ||
7 | мн. | |||||
8 | возвратная | ед. | ||||
9 | мн. | |||||
10 | 2-е лицо | невозвратная | ед. | |||
11 | мн. | |||||
12 | возвратная | ед. | ||||
13 | мн. | |||||
14 | 3-е лицо | невозвратная | ед. | |||
15 | мн. | |||||
16 | возвратная | ед. | ||||
17 | мн. | |||||
18 | наст. | 1-е лицо | невозвратная | ед. | ||
19 | мн. | |||||
20 | возвратная | ед. | ||||
21 | мн. | |||||
22 | 2-е лицо | невозвратная | ед. | |||
23 | мн. | |||||
24 | возвратная | ед. | ||||
25 | мн. | |||||
26 | 3-е лицо | невозвратная | ед. | |||
27 | мн. | |||||
28 | возвратная | ед. | ||||
29 | мн. | |||||
30-61 | причастие | действительное | невозвратное | словоизменение по схеме прилагательного | ||
62-93 | возвратное | |||||
94-125 | страдательное | |||||
126 | деепричастие | невозвратное | ||||
127 | возвратное | |||||
128 | прош. | невозвратные | муж. | |||
129 | жен. | |||||
130 | ср. | |||||
131 | мн. | |||||
132 | возвратные | муж. | ||||
133 | жен. | |||||
134 | ср. | |||||
135 | мн. | |||||
136-167 | причастие | действительное | невозвратное | словоизменение по схеме прилагательного | ||
168-199 | возвратное | |||||
200-231 | страдательное | |||||
232 | деепричастие | невозвратное | ||||
233 | возвратное |
3.Программный интерфейс
3.1.Коды ошибок
Код ошибки | Значение | Толкование |
---|---|---|
LEMMBUFF_FAILED | -1 | При лемматизации переполнился массив нормальных форм |
LIDSBUFF_FAILED | -2 | При лемматизации переполнился массив идентификаторов лексем |
GRAMBUFF_FAILED | -3 | При лемматизации переполнился массив грамматических описаний |
WORDBUFF_FAILED | -4 | Слишком длинное исходное слово |
PAGELOAD_FAILED | -5 | Не удалась загрузка страницы словаря |
PAGELOCK_FAILED | -6 |
3.2.Флаги настройки – options
Настройка | Значение | Толкование |
---|---|---|
sfStopAfterFirst | 0x0001 | Достаточно одного отождествления |
sfIgnoreCapitals | 0x0002 | Игнорировать корректность капитализации |
sfHardForms | 0x0004 | Разрешать затрудненные словоформы |
3.3.Проверка правописания
Аргументы:
lpWord | – ASCIIZ-строка, украинское слово, правописание которого следует проверить; |
options | – настройки морфологического анализатора. |
Функция возвращает 0, если слово не опознано, 1 – если слово написано правильно или отрицательный код ошибки.
3.4.Построение списка нормальных форм
lpWord | – ASCIIZ-строка, слово, которое следует проанализировать; |
options | – настройки морфологического анализатора; |
lpLemm | – указатель на массив, принимающий нормальные формы слов, или NULL, если тексты нормальных форм не требуются; |
lpLIDs | – указатель на массив, принимающий идентификаторы лексем, или NULL, если идентификаторы лексем не требуются; |
lpGram | – указатель на массив, принимающий грамматические описания, или NULL, если они не требуются; |
ccLemm | – размерность массива lpLemm в байтах; |
cdwLID | – размерность массива lpLIDs в двойных словах; |
cbGram | – размерность массива lpGram в байтах. |
Тексты нормальных форм восстанавливаются в минимально допустимой степени капитализации, то есть если слово может быть написано всеми строчными буквами, оно восстанавливается всеми строчными, если только с заглавной буквы - то с заглавной, и т. д.
Грамматические описания восстанавливаются в “плавающем” формате. После отождествления массив psGInfo содержит количество блоков грамматических описаний, равное количеству нормальных форм. При этом каждый блок грамматического описания в начале содержит байт, указывающий количество структур SGramInfo, лежащих сразу после него.
3.5.Построение формы слова по идентификатору
Аргументы:
lpWord | – ASCIIZ-строка, слово, которое следует проанализировать, или NULL, если задан идентификатор лексемы; |
dwLexId | – идентификатор лексемы слова или 0, если построение формы идет по ключу – строке; |
options | – настройки морфологического анализатора; |
idForm | – идентификатор требуемой формы слова; |
lpDest | – указатель на массив, принимающий построенные формы; |
ccDest | – размерность массива lpDest в байтах. |
3.6.Построение формы слова по грамматическому описанию
Аргументы:
lpWord | – ASCIIZ-строка, слово, которое следует проанализировать, или NULL, если задан идентификатор лексемы; |
dwLexId | – идентификатор лексемы слова или 0, если построение формы идет по ключу – строке; |
options | – настройки морфологического анализатора; |
grInfo | – расширенное грамматическое описание требуемой формы слова; |
bflags | – дополнительные грамматические флажки; |
lpDest | – указатель на массив, принимающий построенные формы; |
ccDest | – размерность массива lpDest в байтах. |
3.7.Перебор лексем (enumeration)
Аргументы:
enumproc | – адрес функции обработки лексемы; |
lpv | – пользовательский параметр, передаваемый функции enumproc. |
Прототип callback-функции перебора лексем:
Аргументы:
lid | – идентификатор лексемы; |
lpv | – параметр, переданный пользователем функции mlmaukEnumWords. |
3.8.Извлечение части речи лексемы
Аргументы:
dwLexId | – идентификатор лексемы слова; |
wdinfo | – указатель на байт, получающий часть речи. |
4.Украинский алфавит
Украинский алфавит очень близок к русскому, однако не совсем с ним совпадает. Так, в нем нет русских букв Ёё, Ыы, Ээ, однако есть некоторые дополнительные, отсутствующие в русском алфавите и, что хуже, выпадающие из общего массива кириллицы - Ґґ, Єє, Її, Іі.В то же время в реальных текстах вместо Іі часто встречается латинское Ii, сходное по начертанию с украинским. Кроме того, апостроф используется для смягчения предыдущей согласной и иногда играет роль мягкого знака, то есть обязателен при начертании и входит в состав слова.
Для решения этой проблемы ниже приводится таблица, в которой заполнены ячейки, соответствующие символам, которые могут встречаться в составе украинских слов. Символы, вместо которых стоит *, в украинском алфавите отсутствуют, хотя и являются кириллицей.
При выделении слов для подачи модулю также следует учесть возможные огрехи некоторых кириллических драйверов клавиатуры, которых великое множество, и которые не всегда корректно отрабатывают символы, сходные по начертанию с соответствующими латинскими.
Кроме того, при обработке HTML следует учитывать, что символы, не попадающие в интервал А-я, практически всегда записываются в виде специальных последовательностей, начинающихся &.
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
20 | ' | - | ||||||||||||||
30 | ||||||||||||||||
40 | I | |||||||||||||||
50 | ||||||||||||||||
60 | ` | i | ||||||||||||||
70 | ||||||||||||||||
80 | ||||||||||||||||
90 | ||||||||||||||||
A0 | Ґ | Є | Ї | |||||||||||||
B0 | І | і | ґ | |||||||||||||
C0 | А | Б | В | Г | Д | Е | Ж | З | И | Й | К | Л | М | Н | О | П |
D0 | Р | С | Т | У | Ф | Х | Ц | Ч | Ш | Щ | Ъ | Ь | Ю | Я | ||
E0 | а | б | в | г | д | е | ж | з | и | й | к | л | м | н | о | п |
F0 | р | с | т | у | ф | х | ц | ч | ш | щ | ъ | ь | ю | я |