Лемматизация

Online-версия лемматизатора

Данная версия лемматизатора написана на языке php, поэтому ее работу можно оценить прямо здесь. Реализованный алгоритм объединяет словарную лемматизацию и набор эвристик таким образом, чтобы обеспечить максимально точную лемматизацию всех введенных в словарь слов. Код лемматизатора и вспомогательные файлы со словарем сгенерированы автоматически C#-утилитой, которая в качестве исходного материала получает список пар (слово,лемма), выгруженный из SQL-словаря. Исходный код этого лемматизатора и файлы базы данных для него входят в состав SDK Грамматического Словаря.

Введите в текстовое поле несколько русских слов, затем нажмите кнопку.

...тут появится результат лемматизации...

.NET версия лемматизатора

Online вариант лемматизатора для .NET, скомпилированный как сборка lemmatizator_fx.dll, доступен на ASP.NET портале, авторизация test/test.

Таблицы лемматизатора

В составе схемы SQL словаря есть отдельные таблицы, разработанные исключительно для выполнения лемматизации:

LEXEMES_1 пары слово-лемма, а также дополнительное поле - количество альтернативных нормальных форм.

LEXEMES_N пары слово-лемма, в отличие от предыдущей таблицы может быть несколько записей для каждого слова.

LEMMAS - вспомогательная таблица, список нормальных форм, на которые ссылаются LEXEMES_1 и LEXEMES_N.

лемматизатор SQL

С помощью такого запроса к базе данных

SELECT lemma_COUNT, COUNT(*)
 FROM lexemes_1
 GROUP BY lemma_COUNT

можно определить, насколько велик в естественном языке процент слов, которые дают неоднозначную лемматизацию, например для русского языка:

распределение слов по числу альтернативных лемматизаций

Таким образом, примерно 1% слов русского языка могут доставить некоторые трудности при приведении к нормальной грамматической форме. Следует учесть, что данное распределение не берет в расчет частоту употребления соответствующих слов.

К примеру, такой запрос к базе данных словаря

SELECT lexeme, lemma
 FROM lexemes_n, lemmas
 WHERE lemmas.id=id_lemma AND lexemes_n.lexeme='РОЙ'

даст такие варианты лемматизации:

неоднозначная лемматизация

Вполне ожидаемый результат - повелительная форма глагола рыть и две падежные формы существительного рой текстуально совпадают.

Выбор между быстрой, но иногда неполной лемматизацией, и медленной и исчерпывающей, зависит от решаемой задачи.

Например, в поисковой системе скорость индексирования играет решающую роль, так как лемматизация миллионов лексем становится основным занятием процессора. Поэтому индексатор с командой -index wordforms использует упрощенную лемматизацию - берет первую нормальную форму, игнорируя остальные варианты.

С другой стороны машинный переводчик должен максимально аккуратно учитывать все возможные нормальные формы переводимых слов, поэтому скорость лемматизации приносится в жертву точности.

Процедуры API Грамматического Словаря для лемматизации

В API есть несколько вызовов, которые позволяют прямо или с дополнительными шагами выполнять приведение слова к базовой форме - лемматизацию. Большинство из них одинаково успешно работают с любым из поддерживаемых в проекте языков, разумеется при наличии соответствующего словаря.

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

Два основных вызова, разработанных именно как лемматизаторы:

sol_TranslateToBase

Упрощенный, но самый быстрый вариант. Ищет единственную нормальную форму слова. Если слово может быть приведено к нескольким базовым формам, например для мою могут быть варианты мыть и мой, то используется одна любая из альтернатив на усмотрение лемматизатора.

sol_TranslateToBases

Более сложный и медленный вариант предыдущей процедуры. Если поданное на вход слово можно лемматизировать более чем единственным способом, то возвращает все варианты.

Пример использования обеих процедур можно найти в исходных текстах демо-программы ...\demo\ai\solarix\Grammar_Engine\Lemmatizer_Russian.

Прочие процедуры для получения леммы

Далее описаны другие процедуры API, которые решают эту же или близкую задачу.

sol_SeekWord

Это быстрый поиск id словарной статьи по любой грамматической форме. Как и sol_TranslateToBase, берется первый вариант базовой формы, если есть альтернативы. Возвращается целое число - ключ словарной статьи, которое можно использовать для таким операций, как получение названия статьи, склонения и спряжения, определения грамматических свойств слова.

sol_FindWord

Медленный вариант поиск словарной статьи по любой грамматической форме.

sol_ProjectWord

Поиск всех возможных словарных статей, чьей грамматической формой является слово. Процедура вернет список, элементы которого позволяют получить целочисленный id подходящих словарных статей. Особенность данной процедуры в том, что ее алгоритм может для неизвестного слова попытаться подобрать статью и приставку-суффикс, чтобы найти статью-оригинал. Например, для суперкот будет найдена словарная статья кот, так как продуктивная приставка супер- включена в число проверяемых.

sol_ProjectMisspelledWord

Расширенный вариант предыдущей процедуры, позволяет искать словарные статьи по форме с возможными опечатками - пропусками букв, заменами, лишними буквами.

В некоторых приложениях бывает полезно не просто лемматизировать слово, а получать по возможности существительное, от которого получено слово, например страшный - страх. В составе API есть соответствующий вызов:

sol_TranslateToNoun

Выполнение лемматизации с SQL словарем

В схеме SQL словаря есть несколько таблиц, которые можно создавать и использовать автономно, позволяющих выполнять поиск базовых форм слов.

Для русского языка, как уже отмечалось в описании процедуры лемматизации через API грамматического словаря, главная проблема - наличие неоднозначностей.

С помощью несложного запроса можно увидеть, что всего в русском лексиконе имеется чуть больше 400 пар существительное-глагол, у которых хотя бы одна грамматическая форма омонимична.

Этот запрос к базе данных словаря:

SELECT DISTINCT E1.name AS "сущ", E2.name AS "глаг", F2.name AS "форма"
 FROM  sg_form F1, sg_form F2, sg_entry E1, sg_entry E2
 WHERE E1.id_class=8 AND -- русские существительные
       F1.id_entry=E1.id AND -- их грамматические формы
       F2.name=F1.name AND -- формы совпадают
       E2.id=F2.id_entry AND E2.id_class IN (13,14) -- русские глаголы и инфинитивы

дает примерно такую таблицу (показано несколько записей):

сущ глаг форма
явь явить яви
штурман штурмануть штурману
шлем слать шлем
шило шить шило
шило шить шила
шило шить шил
шея шить шей
шаль шалить шали
чертенок чертить чертят

Теперь рассмотрим, как получить базовую форму слова по любой грамматической.

Запрос к базе словаря очень простой:

SELECT DISTINCT Lower(sg_class.name), sg_entry.name
 FROM  sg_form, sg_entry, sg_class
 WHERE sg_form.name='пни' AND
       sg_entry.id=sg_form.id_entry AND
       sg_class.id=sg_entry.id_class -- покажем часть речи 

Обратите внимание, что мы никак не фиксируем язык обрабатываемых слов.

Результат вышеприведенного запроса, в котором ищутся базовые формы для слова пни, такой:

результаты лемматизации

Стемминг и лемматизация для поиска текста с учетом морфологии

Стеммер - это упрощенный алгоритм морфологического разбора слова, оптимизированный под максимально быстрое нахождение префикса, общего для всех грамматических форм заданного слова. Обычно получамая при стемминге основа включает в себя морфологический корень, вместе с приставкой. У стеммера всегда есть некоторый процент ошибок, проистекающих из особенностей словоизменения естественного языка и невозможности согласовать примитивную идею отсечения "окончаний" со русским словоизменением, а тем более с такими языковыми явлениями, как беглые гласные. В русском лексиконе примерно 1.7% словоформ имеют такую особенность, например мешок-мешки, взять-возьму. Даже такой регулярный язык, как английский, имеет обширный набор исключений из регулярных правил - неправильные глаголы и существительные, склоняющиеся не по общему правилу.

Несомненный плюс стеммера - возможность реализации без использования внешней базы данных. К примеру, программная реализация алгоритма стемминга для платформы .NET компилируется как единственная dll без дополнительных зависимостей и файлов данных. Для ее использования достаточно включить сборку StemmerFX.dll в проект - смотрите online пример.

С другой стороны, словарный лемматизатор, имеющийся в грамматическом словаре, позволяет с намного более высокой точностью находить базовую форму слова из любой грамматической. Из общих соображений понятно, что если сравнивать результат лемматизации искомого ключевого слова и слов, читаемых из текста, то мы получим как раз поиск текста с учетом морфологии. Однако операция лемматизации выполняется медленее, чем стемминг, поэтому возникает идея объединить оба этих алгоритма для быстрого и релевантного поиска ключевых слов. Такой подход реализован в библиотеке StringLib для платформы .NET. Она позволяет выполнять поиск ключевого слова, находя все вхождения любой его грамматической формы.

Выполнение лемматизации в случае многоязычного словаря

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

Лемматизация и субстантивация

Наличие тезауруса, ориентированного на машинную обработку текста, позволяет реализовывать более сложные преобразования слов. К примеру, вместо простой лемматизации можно одним запросом возвращать базовую форму существительного, к которому приводится словарная статья. Например, прилагательное кошачий является деривативом от существительного кошка. Можно приводить не только к форме существительного, но и к форме инфинитива, например причастие бегающий приводится к инфинитиву бегать. Более того, инфинитив бегать связан с существительным бег. Все эти связи, образующие сложную семантическую сеть, доступны для SQL запросов, пример одного из которых показан далее.

Итак, мы имеем несколько слов, принадлежащих к разным частям речи. Нам нужно для каждого из них выполнить лемматизацию, а затем по возможности найти форму существительного. Обратите внимание, что результат лемматизации может не допускать приведения к существительному - в этом случае мы вернем простую лемматизацию.

В справочнике типов связей можно найти числовой код нужного нам типа в_сущ=39.

Составляем запрос к базе словаря:

SELECT DISTINCT COALESCE( E2.name, E1.name )
 FROM  sg_form, sg_entry E1 LEFT JOIN sg_link ON id_entry1=E1.id
                                             AND istate=39 -- тип связи <в_сущ>
                           LEFT JOIN sg_entry E2 ON E2.id=id_entry2
 WHERE sg_form.name IN ( 'сияющими', 'звенело', 'по-кошачьи' )
       AND E1.id=sg_form.id_entry 

Результат его исполнения:

результаты субстантивации

Параметры лемматизатора

Лемматизатор может использоваться как автономно, так и загружаться в составе грамматического словаря. Параметры подключения и работы лемматизатора в этих случаях задаются в файле конфигурации словаря в отдельном XML-узле - см. здесь.

Дополнительные алгоритмы лемматизации текста

Кроме специализированного лемматизатора, описанного выше, нормализация текста может быть выполнена другими способами. Отметим из них два самых интересных.

Морфологический анализатор неявно дает на выходе информацию о леммах, так как он распознает для каждого исходного слова принадлежность к определенной словарной статье. У словарной статьи можно получить начальную форму слова, и таким образом решить задачу. Побочным эффектом такого алгоритма будет учет контекста слова и отбрасывание альтернативных вариантов распознавания.

Можно пойти дальше, и учесть информацию из тезауруса. Взяв результаты морфологического анализа предложения, можно для каждого слова проверить, не является ли оно уменьшительной (котик) или усилительной (котище) формой слова, и привести к нейтральной (кот). Более того, можно воспользоваться информацией о дериватах, к примеру выполнить приведение глаголов, деепричастий и причастий к форме абстрактного существительного движения или действия: изменять-изменение.

Далее представлено наглядное сравнение всех имеющихся видов лемматизации текста для одного и того же предложения.

Простая лемматизация:

лемматизация

Приведение к леммам как результат морфологического разбора предложения:

лемматизация

Глубокая нормализация текста с приведением к существительным с помощью тезауруса:

лемматизация

Дополнительные материалы по грамматике

Приобретение SDK грамматического словаря

Стеммер

Глубокая нормализация текста

Структура SQL словаря

Процедурный API грамматического словаря

API лемматизатора

Примеры работы с процедурным API словаря в составе SDK

  © Elijah Koziev 2010
прикладные проекты на основе грамматического словаря API грамматической машины компоненты для доступа к грамматическому словарю условия получения SDK токенизатор и сегментатор морфологический анализ и синтез лемматизатор база N-грамм синтаксический анализатор словоформы морфология и синтаксис русского языка падеж число род совершенный и несовершенный вид экспорт в SQL формат экспорт в XML формат скрипт SQL словаря структура SQL словаря структура XML словаря компоненты для доступа к грамматическому словарю ORM Persistent Dictionary Library лемматизация стемминг примеры использования грамматического словаря склонение существительных в русском языке склонение русских прилагательных спряжение глаголов в русском языке поиск текста с учетом морфологии OCR подсистема расширенные регулярные выражения генератор текста генератор случайного текста и имитатор рандомизатор синонимизатор перефразировщик Статистика буквенных паттернов

Грамматический словарь русского языка



Грамматический словарь
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
требования: 512 Mb свободной памяти, 300 Мб на диске
размер:         34 Мб

  скачать грамматический словарь купить грамматический словарь SDK грамматического словаря
грамматический словарь русского языка



SDK Грамматического словаря



SDK Грамматического Словаря
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
размер:         13 Мб

SQL словарь (демо):
sqlite mysql oracle firebird mssql

скачать демо-версию SDK купить SDK API грамматического словаря



Поисковая система



Integra
настольная и сетевая поисковая система 

платформа:  Windows XP ... Windows 7
требования: 512 Mb свободной памяти
размер:         21 Мб

Дополнительные компоненты:
MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать поисковую систему SDK поисковой системыописание поисковой системы



SDK Поисковой системы



SDK Поискового движка
API для настольной и сетевой поисковая система 

платформа:  Windows XP ... Windows 7
размер:         17 Мб

Дополнительные компоненты:

MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать SDK SDK поисковой системы



Экранный переводчик



Translator
экранный переводчик

платформа:  Windows XP ... Windows 7
требования: 256 Mb свободной памяти
размер:         4.4 Мб

Дополнительные компоненты:
расширенный англо-русский словарь 6.4 Мб


скачать экранный переводчикописание экранного переводчика



изменено 14-Feb-12