Компоненты лемматизатора и примеры его использования входят в состав SDK Грамматического Словаря. В демо-версию SDK лемматизатор также включен, но без примеров использования.
Данный вариант лемматизатора имеет следующие особенности:
1. Аккуратная лемматизация - для всех слов, присутствующих в текущей версии словаря, лемматизация выполняется безошибочно, если слово допускает неоднозначную лемматизацию (роем - рыть или рой), то лемматизатор найдет все эти варианты.
2. Минимальный объем потребляемой памяти, данные хранятся на диске в сжатом виде, после открытия базы она занимает в памяти около 1 Мб в экономном режиме (см. флаги sol_LoadLemmatizator).
3. Поддержка любых языков, реализованных в проекте, таким образом генерируемый при сборке англо-русского словаря лемматизатор будет работать и с английскими, и с русскими словами.
Динамическая библиотека лемматизации lemmatizator.dll (lemmatizator.so) собирается для 32х и 64х битных платформ Windows и Linux, а также Mac OS X.
Для платформы .NET в состав SDK включена обертка lemmatizator_fx.dll и пример использования на C#.
Лемматизация для PHP выполняется с помощью модуля, который доступен в составе SDK Грамматического Словаря в виде исходного кода Lemmatizator.php. Текст этого модуля и база данных для него генерируются автоматически отдельной служебной утилитой на C#. Все файлы PHP лемматизатора находятся в подкаталоге ...\demo\ai\solarix\Grammar_Engine\Lemmatizator\PHP.
Основное и единственное назначение лемматизатора - вернуть для исходного слова его базовую словарную форму. Например, для русских существительных это форма именительного падежа единственного числа, для глаголов - форма инфинитива. Существует и обратная операция - получение нужной грамматической формы слова из базовой, для существительных она называется склонение, для глаголов - спряжение.
В ходе морфологического разбора слова в качестве одного из "побочных" результатов также получается нормальная форма слова, благодаря тому, что морфологический анализатор распознает исходное слово как форму конкретной словарной статьи. Но в отличие от лемматизатора назначение морфологического разбора включает в себя получение множества другой информации о морфологических свойствах слова. Например, при морфологическом разборе существительного определяется его постоянные свойства (грамматические атрибуты) - переходность, одушевленность, род, и непостоянные (грамматические измерения) - падеж, число.
Таким образом, лемматизатор - это максимально оптимизированный морфологический анализатор. С точки зрения прикладного программиста использование лемматизатора тоже намного проще, если сравнивать с набором функций полного морфологического анализа. Среди заложенных конструктивных недостатков лемматизатора необходимо отметить то, что он не учитывает контекст слова и таким образом не может сам выбрать часть речи, к которой необходимо нормализовать слово. Например, при лемматизации слова простынь получается две леммы - существительное простынь и глагол простыть. Морфологический анализатор текста умеет учитывать контекст слова и отбрасывать недопустимые варианты.
Некоторые функции API лемматизатора реализованы в 3х вариантах для удобства использования на разных платформах и языках:
суффикс W - юникод, широкие строки (wchar_t, WideChar)
суффикс A - однобайтовая кодировка ASCII текущей локали
суффикс 8 - многобайтовая кодировка utf-8
HLEM sol_LoadLemmatizatorW( const wchar_t * Filepath, int Flags )
HLEM sol_LoadLemmatizatorA( const char * Filepath, int Flags )
HLEM sol_LoadLemmatizator8( const char * Filepath, int Flags )
Открывается база лемматизатора, созданная при компиляции словаря с опцией -save_lemmatizer.
Аргументы:
Filepath - путь к базе лемматизатора, обычно в рамках проекта это файл lemmatizator.db.
Flags - дополнительные параметры для управления работы лемматизатором. Значение LEME_DEFAULT открывает базу в самом экономном, но самом медленном режиме лемматизации. При указании флага LEME_FASTER движок будет работать немного быстрее, несколько увеличив потребление памяти. Наконец, флаг LEME_FASTEST многократно ускорит лемматизацию, но загрузит базу данных в оперативную память, увеличив свои накладные расходы.
Возвращает:
Возвращаемое значение является дескриптором объекта лемматизатора. Дескриптор указывается почти во всех
остальных функциях API.
void sol_DeleteLemmatizator( HLEM hEngine )
Закрывается база, подсоединенная предыдущим вызовом sol_LoadLemmatizatorX.
int sol_GetLemmaW( HLEM hEngine, const wchar_t * Word, wchar_t * Result, int BufSize )
int sol_GetLemmaA( HLEM hEngine, const char * Word, char * Result, int BufSize )
int sol_GetLemma8( HLEM hEngine, const char * Word, char * Result, int BufSize )
Выполняется лемматизация слова Word, результат копируется в буфер Result длиной BufSize символов.
Возвращает:
Число вариантов лемматизации, если 1 - значит найдена и возвращена в буфере единственная нормальная форма, если > 1, то в буфер помещается какая-то первая из списка. Ниже описаны функции, которые могут работать со всеми вариантами лемматизации.
Для оценки количества слов, которые приводятся к более чем одной нормальной форме, можно воспользоваться словарем, загруженным в MS SQL и запросом:

Он дает такую табличку для русского лексикона:

Таким образом, доля слов, которые имеют более одной нормальной формы, не превышает 1%.
HLEMMAS sol_GetLemmasW( HLEM hEngine, const wchar_t * Word )
HLEMMAS sol_GetLemmasA( HLEM hEngine, const char * Word )
HLEMMAS sol_GetLemmas8( HLEM hEngine, const char * Word )
Выполняется лемматизация слова Word и все альтернативные варианты возвращаются в виде дескриптора списка. Для работы с этим списком далее описано несколько функций.
int sol_CountLemmas( HLEMMAS hList )
Возвращает количество элементов в списке лемматизаций hList.
int sol_GetLemmaStringW( HLEMMAS hList, int Index, wchar_t * Result, int Bufsize )
int sol_GetLemmaStringA( HLEMMAS hList, int Index, char * Result, int Bufsize )
int sol_GetLemmaString8( HLEMMAS hList, int Index, char * Result, int Bufsize )
Копирование в предоставленный буфер Result размером BufSize строки с индексом Index из списка лемматизаций hList.
void sol_DeleteLemmas( HLEMMAS hList )
Удаляется список нормальных форм, возвращенный sol_GetLemmasX.
function Lemmatize( $word )
Возвращает лемму для слова-аргумента, символы должны быть в кодировке cp1251.
function LemmatizePhrase( $str )
Возвращает лемматизированную строку - каждое слово из входной строки проходит нормализацию. Текст должен быть в кодировке cp1251.
Пример на C++:
#include "lemmatizator_engine.h"
...
HLEM hEngine = sol_LoadLemmatizatorA( "../../../../../../bin-linux64/lemmatizer.db", LEME_DEFAULT );
char utf8[256];
int nlem = sol_GetLemma8( hEngine, "верифицировали", utf8, sizeof(utf8) );
printf( "%s\n", utf8 );
HLEMMAS hList = sol_GetLemmas8( hEngine, "роем" );
if( hList!=NULL )
{
int nlemma = sol_CountLemmas(hList);
for( int i=0; i<nlemma; ++i )
{
sol_GetLemmaString8( hList, i, utf8, sizeof(utf8) );
printf( "%s\n", utf8 );
}
sol_DeleteLemmas(hList);
}
sol_DeleteLemmatizator(hEngine);
В составе SDK Грамматического Словаря есть исходный код примера вызова вышеописанных процедур для C++ и C#, а также проекты для VisualStudio и make-файлы для сборки примеров.
Основной пример на C++ располагается в подкаталоге ...\demo\ai\solarix\Grammar_Engine\Lemmatizator\C. Пример компилируется для всех поддерживаемых платформ - 32- и 64-битных Windows, Linux и Mac OS X. Он имеет двойное назначение.
Во-первых, он демонстрирует использование всех функций API лемматизатора.
Во-вторых, он проверяет корректность приведения слов к базовым формам по эталонным спискам. Сами эти списки экспортированы из SQL хранилища словаря с помощью несложных запросов, и содержат исчерпывающий перечень для двух случаев - когда слово приводится однозначно к единственной лемме, и когда слово является формой двух словарных статей. Например, список слов, которые лемматизируются двумя альтернативными путями, используется такой запрос для MS SQL:
select rTrim(X1.lexeme) + ';' + rTrim(Y1.lemma) + ';' + rTrim(Y2.lemma)
from lexemes_1 Z1, lexemes_n X1, lemmas Y1, lexemes_n X2, lemmas Y2
where Z1.lemma_count=2 AND
X1.lexeme=Z1.lexeme AND
Y1.id=X1.id_lemma AND
Y2.id=X2.id_lemma AND
X1.lexeme=X2.lexeme AND
X1.id<X2.id
Результаты выполнения запроса выгружаются прямо из SQL Server Management Studio в текстовый файл, в кодировке utf-8.
Приобретение SDK грамматического словаря
Все способы лемматизации в грамматическом словаре и поисковой системе
© Elijah Koziev 2010
Поисковая система
SDK Поисковой системы
Экранный переводчик
|
|
изменено 25-Aug-11 | ||||||||||||||||||||||||||||||||||||||