Стеммер Портера для русского языка
Стеммер Портера — алгоритм стемминга (нахождения основы слова для заданного исходного слова), опубликованный Мартином Портером. Алгоритм не использует баз основ слов, а работает, последовательно применяя ряд правил отсечения окончаний и суффиксов.
Сначала введем некоторые определения:
- Гласные буквы —
а
,е
,и
,о
,у
,ы
,э
,ю
,я
. Букваё
считается равнозначной буквее
. RV
— область слова после первой гласной. Она может быть пустой, если гласные в слове отсутствуют.R1
— область слова после первого сочетания “гласная-согласная”.R2
— областьR1
после первого сочетания “гласная-согласная”.
Пример
В слове противоестественном:
RV
=тивоестественном
.R1
=ивоестественном
.R2
=оестественном
.
Теперь определим несколько классов окончаний слова. Я оставлю их оригинальные названия из исходного описания алгоритма.
PERFECTIVE GERUND
- Группа 1:
в
,вши
,вшись
. - Группа 2:
ив
,ивши
,ившись
,ыв
,ывши
,ывшись
.
Окончаниям из группы 1 должна предшествовать буква а
или я
.
ADJECTIVE
ее
, ие
, ые
, ое
, ими
, ыми
, ей
, ий
, ый
, ой
, ем
, им
, ым
, ом
, его
, ого
, ему
, ому
, их
, ых
, ую
, юю
, ая
, яя
, ою
, ею
.
PARTICIPLE
- Группа 1:
ем
,нн
,вш
,ющ
,щ
. - Группа 2:
ивш
,ывш
,ующ
.
Окончаниям из группы 1 должна предшествовать буква а
или я
.
REFLEXIVE
ся
, сь
.
VERB
- Группа 1:
ла
,на
,ете
,йте
,ли
,й
,л
,ем
,н
,ло
,но
,ет
,ют
,ны
,ть
,ешь
,нно
. - Группа 2:
ила
,ыла
,ена
,ейте
,уйте
,ите
,или
,ыли
,ей
,уй
,ил
,ыл
,им
,ым
,ен
,ило
,ыло
,ено
,ят
,ует
,уют
,ит
,ыт
,ены
,ить
,ыть
,ишь
,ую
,ю
.
Окончаниям из группы 1 должна предшествовать буква а
или я
.
NOUN
а
, ев
, ов
, ие
, ье
, е
, иями
, ями
, ами
, еи
, ии
, и
, ией
, ей
, ой
, ий
, й
, иям
, ям
, ием
, ем
, ам
, ом
, о
, у
, ах
, иях
, ях
, ы
, ь
, ию
, ью
, ю
, ия
, ья
, я
.
SUPERLATIVE
ейш
, ейше
.
DERIVATIONAL
ост
, ость
.
ADJECTIVAL
ADJECTIVAL определяется как ADJECTIVE или PARTICIPLE + ADJECTIVE. Например: бегавшая
= бега
+ вш
+ ая
.
При поиске окончания из всех возможных выбирается наиболее длинное. Например, в слове величие выбираем окончание ие
, а не е
.
Все проверки производятся над областью RV
. Так, при проверке на PERFECTIVE GERUND предшествующие буквы а
и я
также должны быть внутри RV
. Буквы перед RV
не участвуют в проверках вообще.
Шаг 1
Найти окончание PERFECTIVE GERUND. Если оно существует — удалить его и завершить этот шаг.
Иначе, удаляем окончание REFLEXIVE (если оно существует). Затем в следующем порядке пробуем удалить окончания: ADJECTIVAL, VERB, NOUN. Как только одно из них найдено — шаг завершается.
Шаг 2
Если слово оканчивается на и
— удаляем и
.
Шаг 3
Если в R2
найдется окончание DERIVATIONAL — удаляем его.
Шаг 4
Возможен один из трех вариантов:
- Если слово оканчивается на
нн
— удаляем последнюю букву. - Если слово оканчивается на SUPERLATIVE — удаляем его и снова удаляем последнюю букву, если слово оканчивается на
нн
. - Если слово оканчивается на
ь
— удаляем его.
Алгоритм реализован на Python 3 и проходит тест Портера. Актуальный исходный код можно найти на GitHub’е.
По мотивам Russian stemming algorithm.