Стеммер

Назначение стеммера

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

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

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

Использование связки из стеммера и лемматизатора для поиска текста с учетом морфологии реализовано в библиотеке StringLib.NET.

Генерация кода стеммера

Стеммер доступен в виде исходного кода на нескольких языках программирования, включая C, C# и PHP. Код стеммера создается автоматически по информации из словаря, загруженого в SQL базу данных. Таким образом, не требуется отдельно вручную задавать правила стемминга, как это делается, к примеру, в стеммере Портера.

Генератор написан на языке C# и находится в папке ...\demo\ai\solarix\ygres\StemmerBuilder\StemmerBuilder. Он доступен в исходном тексте, вместе с утилитами для автоматического тестирования, в дистрибутиве SDK Pro.

.NET версия стеммера

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

Online-версия стеммера на PHP

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

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

Ошибки, допускаемые стеммером

Допускаемые при стемминге ошибки можно классифицировать следующим образом.

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

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

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

При работе со стеммером могут быть полезны материалы:

Вызов стеммера из прикладного кода

Особенности словобразования русских глаголов и стемматизация

Лемматизатор

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

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

Поиск текста в строке с учетом морфологии

Склонение существительных в русском языке

Спряжение глаголов в русском языке

Склонение прилагательных в русском языке

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

  © Козиев Илья 2019
изменено 23-Aug-11