Читать нас в Telegram

Морфологический анализ  — это процесс определения значений грамматических категорий слова и его начальной формы. Для примера проведем морфологический анализ слова «яблочками»  — это:

  • Существительное, нарицательное
  • Неодушевленное
  • Среднего рода
  • Во множественном числе
  • В творительном падеже
  • Начальная форма  — «яблочко»

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

Существуют программы, которые могут проводить морфологический анализ автоматически,  — они называются морфологическими анализаторами. Внутреннее устройство анализатора зависит от языка, для которого он предназначен, так как набор частей речи и их грамматических категорий отличается от языка к языку. Наиболее популярными анализаторами для русского языка являются библиотека pymorphy2 для Python и программа mystem, работающие на основе словаря и системы правил. 

Проведем морфологический анализ слова «яблочками» с помощью pymorphy2. Импортируем анализатор и загрузим его:

from pymorphy2 import MorphAnalyzer
morph = MorphAnalyzer()

Теперь им можно пользоваться. Основной функцией является parse  — она выдает результат морфологического анализа слова.

word_parse = morph.parse('яблочками')[0]

Из word_parse можно получить список грамматических характеристик слова:

word_parse.tag
>>> OpencorporaTag('NOUN,inan,neut plur,ablt')

Для записи используются теги словаря OpenCorpora. NOUN означает существительное, inan  — неодушевленность, neut  — средний род, plur  — множественное число, а ablt  — творительный падеж.

Список тегов и их значения можно посмотреть здесь.

Можно также вывести каждый тег отдельно. Для примера выведем часть речи (part of speech):

word_parse.tag.POS 
>>> ‘NOUN’

Кроме того, в word_parse хранится начальная форма слова. Часто получение начальной формы (лемматизация) и является целью морфологического анализа.

word_parse.normal_form
>>> ‘яблочко’

Возможно, вы обратили внимание на индекс 0 в конце этой строчки. 

word_parse = morph.parse('яблочками')[0]

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

  • Инфинитив глагола «пасти» («пасти коров»)
  • Существительное «пасть» («пасть льва») в различных формах: в единственном числе в родительном, дательном и предложном падеже, во множественном числе в именительном и винительном падеже 

Языковую неоднозначность ярко иллюстрирует известная фраза «Эти типы стали есть в цехе», где слова «типы», «стали» и «есть» даже в контексте предложения не могут быть проанализированы однозначно. 

На практике при обработке текста обычно выбирают статистически наиболее вероятный вариант разбора или разрешают неоднозначность с помощью дополнительного анализа. Однако иногда могут быть интересны все варианты разбора.Самостоятельно запустить примеры и поразбирать слова можно в Google Colab.