Данная версия лемматизатора написана на языке php, поэтому ее работу можно оценить прямо здесь. Реализованный алгоритм объединяет словарную лемматизацию и набор эвристик таким образом, чтобы обеспечить максимально точную лемматизацию всех введенных в словарь слов. Код лемматизатора и вспомогательные файлы со словарем сгенерированы автоматически C#-утилитой, которая в качестве исходного материала получает список пар (слово,лемма), выгруженный из SQL-словаря. Исходный код этого лемматизатора и файлы базы данных для него входят в состав SDK Грамматического Словаря.
Введите в текстовое поле несколько русских слов, затем нажмите кнопку.
...тут появится результат лемматизации...
Online вариант лемматизатора для .NET, скомпилированный как сборка lemmatizator_fx.dll, доступен на ASP.NET портале, авторизация test/test.
В составе схемы SQL словаря есть отдельные таблицы, разработанные исключительно для выполнения лемматизации:
LEXEMES_1 пары слово-лемма, а также дополнительное поле - количество альтернативных нормальных форм.
LEXEMES_N пары слово-лемма, в отличие от предыдущей таблицы может быть несколько записей для каждого слова.
LEMMAS - вспомогательная таблица, список нормальных форм, на которые ссылаются LEXEMES_1 и LEXEMES_N.

С помощью такого запроса к базе данных
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 есть несколько вызовов, которые позволяют прямо или с дополнительными шагами выполнять приведение слова к базовой форме - лемматизацию. Большинство из них одинаково успешно работают с любым из поддерживаемых в проекте языков, разумеется при наличии соответствующего словаря.
Два основных вызова, разработанных именно как лемматизаторы:
Упрощенный, но самый быстрый вариант. Ищет единственную нормальную форму слова. Если слово может быть приведено к нескольким базовым формам, например для мою могут быть варианты мыть и мой, то используется одна любая из альтернатив на усмотрение лемматизатора.
Более сложный и медленный вариант предыдущей процедуры. Если поданное на вход слово можно лемматизировать более чем единственным способом, то возвращает все варианты.
Пример использования обеих процедур можно найти в исходных текстах демо-программы ...\demo\ai\solarix\Grammar_Engine\Lemmatizer_Russian.
Далее описаны другие процедуры API, которые решают эту же или близкую задачу.
Это быстрый поиск id словарной статьи по любой грамматической форме. Как и sol_TranslateToBase, берется первый вариант базовой формы, если есть альтернативы. Возвращается целое число - ключ словарной статьи, которое можно использовать для таким операций, как получение названия статьи, склонения и спряжения, определения грамматических свойств слова.
Медленный вариант поиск словарной статьи по любой грамматической форме.
Поиск всех возможных словарных статей, чьей грамматической формой является слово. Процедура вернет список, элементы которого позволяют получить целочисленный id подходящих словарных статей. Особенность данной процедуры в том, что ее алгоритм может для неизвестного слова попытаться подобрать статью и приставку-суффикс, чтобы найти статью-оригинал. Например, для суперкот будет найдена словарная статья кот, так как продуктивная приставка супер- включена в число проверяемых.
Расширенный вариант предыдущей процедуры, позволяет искать словарные статьи по форме с возможными опечатками - пропусками букв, заменами, лишними буквами.
В некоторых приложениях бывает полезно не просто лемматизировать слово, а получать по возможности существительное, от которого получено слово, например страшный - страх. В составе API есть соответствующий вызов:
В схеме 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 грамматического словаря
Процедурный API грамматического словаря
Примеры работы с процедурным API словаря в составе SDK
© Elijah Koziev 2010
Поисковая система
SDK Поисковой системы
Экранный переводчик
|
|
изменено 27-Dec-11 | ||||||||||||||||||||||||||||||||||||||