February 9, 2021

Программируем этап стемминга текста

В  этой статье я хочу поделиться готовыми функциями на Python для  приведения грамматических форм списка слов к базовому виду (стемминг) в  соответствии с ранее описанными рекомендациями.

Вспомним, что мы располагаем Pandas DataFrame, который  содержит в качестве индексов сокращенные версии слов, полученные путем применения Snowball стеммера,  а в качестве двух столбцов -  базовую версию слова и его грамматические  формы, разделенные символом ":". Вот, как выглядит эта таблица:

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

Принцип ее функционирования такой же, как у алгоритма, указанного в этой статье. По сокращенной версии (stem_word) мы ищем строки таблицы dict_stem,  значение индекса которых совпадает с ней. Затем в зависимости от того,  сколько строк найдено, получим промежуточный объект в виде DataFrame или Series, в которых уже ищем исходную форму слова и в случае успеха получаем инфинитив из той же строки.

Теперь, реализуем более общую функцию, которая получает список слов, объект стеммера (в нашем случае SnowballStemmer), словарь и возвращает список базовых версий:

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

В  случае неудачи функция пытается найти совпадения слова в нижнем  регистре в словаре. Если и это не удается, то слово помещается в новый  список в исходном виде.

Теперь  продемонстрируем работу функции на практике. Зададим в качестве  исходного списка слов следующие - 'Абхазии', 'здоровьем', 'черпал':

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