Модуль реализован в виде динамической библиотеки Win32, содержит словари в виде ресурсов и экспортирует функции в C-стиле (то есть для их вызова требуется декларация extern “C”).
Модуль работает с ASCIIZ-строками, то есть строками, где один символ кодируется одним байтом, а нулевой символ обозначает конец строки, и подразумевает, что строки на вход ему подаются в кодировке 1251 (Windows Cyrillic).
Словарь модуля объемом около 120000 слов при генерации разбивается на страницы размером менее 64К, что позволяет оптимально организовать работу с памятью и использовать короткое слово (16 бит) для адресации внутри страницы с другой. Алгоритм модуля предельно прост и представляет собой интерпретатор таблиц переходов конечного автомата, в то время как страницы словаря являются этими самыми таблицами.
Благодаря этим решениям словарь модуля не превышает размером один мегабайт, устойчиво работает при объеме доступной памяти около 200К, а при наличии свободного мегабайта оперативной памяти загружает все страницы и выходит на максимальную производительность не менее (а реально более) 10000 слов в секунду (в режиме проверки правописания, процессор Pentium 100). Производительность модуля в режиме лемматизации (построения текстов нормальных форм слова) несколько ниже, так как приходится просматривать весь словарь, и составляет не менее 2000 слов в секунду (в тех же условиях).
wInfo & 0x3F | Мнемоника | Часть речи украинская |
---|---|---|
' . $pspkey . ' | ' . $psparr[0] . ' | ' . $psparr[1] . ' |
Ниже приведены мнемоники из файла прототипов со значениями и толкованиями каждого из них:
Признак | Значение | Толкование | Встречается у | ' . $grinfo[0] . ' | 0x' . sprintf( "%04X", $grinfo[1] ) . ' | ' . $grinfo[2] . ' | ' . $grinfo[3] . ' | ' . "\n"; ?>
---|
Признак | Значение | Толкование |
---|---|---|
afAnimated | 0x01 | Данная форма прилагательного или причастия согласуется только с одушевленными существительными |
afNotAlive | 0x02 | Данная форма прилагательного или причастия согласуется только с неодушевленными существительными |
afHardForm | 0x04 | Затрудненная форма, отождествление которой возможно лишь в режиме распознавания затрудненных форм слов |
Часть речи | 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 | возвратное |
Код ошибки | Значение | Толкование |
---|---|---|
LEMMBUFF_FAILED | -1 | При лемматизации переполнился массив нормальных форм |
LIDSBUFF_FAILED | -2 | При лемматизации переполнился массив идентификаторов лексем |
GRAMBUFF_FAILED | -3 | При лемматизации переполнился массив грамматических описаний |
WORDBUFF_FAILED | -4 | Слишком длинное исходное слово |
PAGELOAD_FAILED | -5 | Не удалась загрузка страницы словаря |
PAGELOCK_FAILED | -6 |
Настройка | Значение | Толкование |
---|---|---|
sfStopAfterFirst | 0x0001 | Достаточно одного отождествления |
sfIgnoreCapitals | 0x0002 | Игнорировать корректность капитализации |
sfHardForms | 0x0004 | Разрешать затрудненные словоформы |
Аргументы: 'ASCIIZ-строка, украинское слово, правописание которого следует проверить;', 'options' => 'настройки морфологического анализатора.' ) ); ?>
Функция возвращает 0, если слово не опознано, 1 – если слово написано правильно или отрицательный код ошибки.
'ASCIIZ-строка, слово, которое следует проанализировать;', 'options' => 'настройки морфологического анализатора;', 'lpLemm' => 'указатель на массив, принимающий нормальные формы слов, или NULL, если тексты нормальных форм не требуются;', 'lpLIDs' => 'указатель на массив, принимающий идентификаторы лексем, или NULL, если идентификаторы лексем не требуются;', 'lpGram' => 'указатель на массив, принимающий грамматические описания, или NULL, если они не требуются;', 'ccLemm' => 'размерность массива lpLemm в байтах;', 'cdwLID' => 'размерность массива lpLIDs в двойных словах;', 'cbGram' => 'размерность массива lpGram в байтах.' ) ); ?>
Тексты нормальных форм восстанавливаются в минимально допустимой степени капитализации, то есть если слово может быть написано всеми строчными буквами, оно восстанавливается всеми строчными, если только с заглавной буквы - то с заглавной, и т. д.
Грамматические описания восстанавливаются в “плавающем” формате. После отождествления массив psGInfo содержит количество блоков грамматических описаний, равное количеству нормальных форм. При этом каждый блок грамматического описания в начале содержит байт, указывающий количество структур SGramInfo, лежащих сразу после него.
Аргументы: 'ASCIIZ-строка, слово, которое следует проанализировать, или NULL, если задан идентификатор лексемы;', 'dwLexId' => 'идентификатор лексемы слова или 0, если построение формы идет по ключу – строке;', 'options' => 'настройки морфологического анализатора;', 'idForm' => 'идентификатор требуемой формы слова;', 'lpDest' => 'указатель на массив, принимающий построенные формы;', 'ccDest' => 'размерность массива lpDest в байтах.' ) ); ?>
Аргументы: 'ASCIIZ-строка, слово, которое следует проанализировать, или NULL, если задан идентификатор лексемы;', 'dwLexId' => 'идентификатор лексемы слова или 0, если построение формы идет по ключу – строке;', 'options' => 'настройки морфологического анализатора;', 'grInfo' => 'расширенное грамматическое описание требуемой формы слова;', 'bflags' => 'дополнительные грамматические флажки;', 'lpDest' => 'указатель на массив, принимающий построенные формы;', 'ccDest' => 'размерность массива lpDest в байтах.' ) ); ?>
Аргументы:
'адрес функции обработки лексемы;', 'lpv' => 'пользовательский параметр, передаваемый функции enumproc.' ) ); ?>
Прототип callback-функции перебора лексем:
Аргументы:
'идентификатор лексемы;', 'lpv' => 'параметр, переданный пользователем функции mlmaukEnumWords.' ) ); ?>
Аргументы:
'идентификатор лексемы слова;', 'wdinfo' => 'указатель на байт, получающий часть речи.' ) ); ?>' . sprintf( '%02X', $i ) . ''; ?> | ' . sprintf( '%02X', $i * 0x10 ) . ' | '; for ( $j = 0; $j < 16; ++$j ) echo (strstr( $uchars, chr($i * 16 + $j) ) ? '' . chr($i * 16 + $j) : ' | ') . ' | '; echo '' . "\n"; } ?>
---|