Морфологический анализ — это процесс определения значений грамматических категорий слова и его начальной формы. Для примера проведем морфологический анализ слова «яблочками» — это:
- Существительное, нарицательное
- Неодушевленное
- Среднего рода
- Во множественном числе
- В творительном падеже
- Начальная форма — «яблочко»
Морфологический анализ занимает важное место в компьютерной обработке текста. Часто он применяется, чтобы подготовить данные для обучения модели или для статистического анализа. Кроме того, он используется при поиске в интернете: благодаря морфологическому анализу поисковик ищет случаи употребления слова во всех его формах, а не только в той, которая была введена в поисковой строке.
Существуют программы, которые могут проводить морфологический анализ автоматически, — они называются морфологическими анализаторами. Внутреннее устройство анализатора зависит от языка, для которого он предназначен, так как набор частей речи и их грамматических категорий отличается от языка к языку. Наиболее популярными анализаторами для русского языка являются библиотека 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.