Pymorphy

Материал из NLPub
Well.svg Данная статья была создана в рамках учебного задания.
Студент: Участник:Дарья Родионова
Преподаватель: Антон Алексеев
Срок: 15 декабря 2017

В настоящее время задание завершено и проверено. Данная страница может свободно правиться другими участниками NLPub.


pymorphy2 — морфологический анализатор, разработанный на языке программирования Python. Выполняет лемматизацию и анализ слов, способен осуществлять склонение по заданным грамматическим характеристикам слов. Работает со словарём OpenCorpora, а для незнакомых слов строит гипотезы. Поддерживаются русский и украинский языки.

Установка

Чтобы установить анализатор, воспользуетесь pip:

pip install pymorphy2

Также доступна оптимизированная версия анализатора:

pip install pymorphy2[fast]

Наконец можно склонировать репозиторий pymorphy2 с Github и запустить файл setup.py.

Для обновления словарей pymorphy2 следует воспользоваться следующими командами:

pip install -U pymorphy2-dicts-ru
pip install -U pymorphy2-dicts-uk

Использование

Python

Перед началом работы работы надо создать объект класса MorphAnalyzer.

import pymorphy2
morph = pymorphy2.MorphAnalyzer()

Для анализа украинского языка надо просто укажите в конструкторе класса параметр lang='uk'.

Основной механизм анализатора - это метод parse, который делает морфологический разбор слова. Если разборов много, то можно выбрать подходящий вариант. Каждый разбор представляет из себя объект Parse, содержащий теги OpenCorpora, нормализованную лексему, скоринг разбора и алгоритм разбора (слово найдено в словаре OpenCorpora, сравнение по известному окончанию и т. д).

morph.parse('варусянка')

>>> [Parse(word='варусянка', tag=OpencorporaTag('NOUN,anim,femn,Name sing,nomn'), normal_form='варусянка', score=0.5454545454545454, methods_stack=((<DictionaryAnalyzer>, 'янка', 185, 0), (<UnknownPrefixAnalyzer>, 'варус'))),
     Parse(word='варусянка', tag=OpencorporaTag('NOUN,inan,femn sing,nomn'), normal_form='варусянка', score=0.45454545454545453, methods_stack=((<FakeDictionary>, 'варусянка', 8, 0), (<KnownSuffixAnalyzer>, 'сянка')))]

Чтобы получить теги OpenCorpora отдельно, стоит применить к слову метод tag.

morph.tag('варусянка')

>>> [OpencorporaTag('NOUN,anim,femn,Name sing,nomn'), OpencorporaTag('NOUN,inan,femn sing,nomn')]

Множество тегов разбора включает в себя граммемы Открытого корпуса. Полный список граммем можно найти на сайте анализатора. Проверить наличие тега во множестве разбора можно стандартными средствами Python.

'femn' in morph.parse('варусянка')[0].tag
>>> True

{'gent', 'masc'} in morph.parse('варусянка')[0].tag
>>> False

Кроме того, можно анализатор позволяет получать морфологические характеристики разбора. Для этого надо просто обратиться к атрибутам тега:

morph.parse('варусянка')[0].tag.POS # часть речи
>>> NOUN 

morph.parse('варусянка')[0].tag.gender # род
>>> femn

morph.parse('варусянка')[0].tag. number # число
>>> sign

morph.parse('варусянка')[0].tag.case # падеж
>>> nomn

Чтобы найти нормальную форму слова, достаточно спросить у объекта Parse атрибуты normal_form или normalized. Однако, если требуется своя лемматизация, то для этого есть метод inflect, в который подставляются нужные граммемы.

morph.parse('играющих')[0].normal_form # выведет главгол, а не причастие
>>> играть

morph.parse('играющих')[0].inflect({'sing', 'nomn'}).word # а здесь уже будет причастие
>>> играющий

Если удобнее работать с кириллическими названиями тегов, то в pymorphy2 можно получить множество тегов в виде строки:

morph.parse('варусянка')[0].tag.cyr_repr
>>> СУЩ,од,жр,имя ед,им

Также можно преобразовывать строки с тегами в кириллицу и обратно с помощью следующих функция:

morph.cyr2lat('СУЩ,од,жр,имя ед,им')
>>> NOUN,anim,femn,Name sing,nomn

morph.lat2cyr('NOUN,anim,femn,Name sing,nomn')
>>> СУЩ,од,жр,имя ед,им

Выбор правильного разбора

Как говорилось ранее, для каждого разбора анализатор вычисляет скоринг. Скоринг разбора - это условная вероятность тега P(tag|word), которая вычисляется на основе частот OpenCorpora для всех неоднозначных слов со снятой неоднозначностью. Для каждого такого слова оценивается количество сопоставлений ему данного тега и частота данного слова в корпусе (с использованием сглаживания Лапласа). Все разборы слова сортируются по убыванию скоринга.

morph.parse('стали')
>>> [Parse(word='стали', 
          tag=OpencorporaTag('VERB,perf,intr plur,past,indc'), 
          normal_form='стать', 
          score=0.984662, methods_stack=((<DictionaryAnalyzer>, 'стали', 904, 4),)), 
     Parse(word='стали', 
          tag=OpencorporaTag('NOUN,inan,femn sing,gent'), 
          normal_form='сталь', 
          score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 1),)), 
     Parse(word='стали', 
          tag=OpencorporaTag('NOUN,inan,femn sing,datv'), 
          normal_form='сталь', 
          score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 2),)), 
     Parse(word='стали', 
          tag=OpencorporaTag('NOUN,inan,femn sing,loct'), 
          normal_form='сталь', 
          score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 5),)), 
     Parse(word='стали', 
          tag=OpencorporaTag('NOUN,inan,femn plur,nomn'), 
          normal_form='сталь', 
          score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 6),)), 
     Parse(word='стали', 
          tag=OpencorporaTag('NOUN,inan,femn plur,accs'), 
          normal_form='сталь', 
          score=0.003067, methods_stack=((<DictionaryAnalyzer>, 'стали', 13, 9),))]

На данный момент не все слова имеют оценку P(tag|word). При 250 тыс. наблюдениях условная вероятность тега оценена лишь для 20 тысяч слов. Для остальных слов вероятность либо считается равномерной (если слово словарное), либо оценивается на основе эмпирических правил (незнакомое слово). Также данная оценка пока недоступна для украинского языка.

Однако оценки P(tag|word) не всегда помогают выбрать правильный разбор слова. Так как pymorphy2 работает со словом не в контексте, а как с отдельной единицей. Условная вероятность оценена на сбалансированных текстах, в то время как в специализированных текстах оценки тегов могут быть другими (например, в металлургических текстах P(NOUN|стали) > P(VERB|стали)). Для улучшения оценки условной вероятности необходимо размечать задания OpenCorpora, таким образом снимается неоднозначность с большинства слов.

Ссылки

Полная документация с примерами и описанием работы: pymorphy2

Приложения морфологического анализатора: Инструменты для извлечения именованных сущностей: Yargy и Natasha

См. также

Примечания