причастие - форма глагола или самостоятельная часть речи?

239 views
Skip to first unread message

igor....@gmail.com

unread,
Feb 22, 2013, 3:41:06 PM2/22/13
to pymo...@googlegroups.com
Добрый день всем присутствущим!

Использовал pymorphy для нормализации слов для подготовки словаря для автокомплита. В процессе наткнулся на то, что причастия приводились к глагольной начальной форме. Отлично помню со школьного курса, что причастие - самостоятельная часть речи, но википедия заявляет о двух точках зрения(http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D1%87%D0%B0%D1%81%D1%82%D0%B8%D0%B5_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0))

Вопрос-предложение к автору библиотеки: не стоит ли пересмотреть подход к нормализации причастий? =)

Mikhail Korobov

unread,
Feb 23, 2013, 5:15:01 AM2/23/13
to pymo...@googlegroups.com, igor....@gmail.com
Привет! Про техническую сторону вопроса расскажу.

Под нормализацией сейчас понимается примитивный "выбор первой формы в лексеме"; состав лексем определяется словарями. 

В pymorphy 0.5.6 используются словари aot.ru; там, насколько помню, формы причастия и формы глаголов не разделяются по лексемам; с этим трудно что-то сделать (хотя при большом желании можно), и pymorphy 0.5.6 чинить особой мотивации нет.

В pymorphy2 свободы больше, т.к. используются словари OpenCorpora, в которых явно доступны связи "это - формы причастия для вон тех форм глаголов". На этапе компиляции словаря в компактный формат все эти связи сейчас "разворачиваются" - лексемы объединяются, и формы причастий опять оказываются в одной лексеме с глагольными формами. Это делается вот тут: https://github.com/kmike/pymorphy2/blob/837b2efde71507b09033c3ea6f2502e2306f8eef/pymorphy2/opencorpora_dict/compile.py#L157 ; убрать объединение причастий с глаголами можно, просто добавив номер в EXCLUDED_LINK_TYPES.

Но: если просто убрать объединение глаголов с причастиями, то перестанет работать склонение слов между формами глаголов и причастий. При этом получить начальную форму причастия как причастия можно и сейчас, через метод inflect (пример для pymorphy2):

m.parse('думающему')[0].inflect({'sing', 'nomn'})

Я, наверное, соглашусь, что нормализация причастия в причастие выглядит более разумной, чем нормализация причастия в инфинитив. Метод нормализации через inflect не учитывает информацию о связях и может поэтому иногда что-то не то выдавать (хотя пример придумать не могу сейчас). При всем при этом, если просто убрать объединение глаголов и причастий в лексемы, pymorphy2 не получит новых фич (т.к. нормализовывать и сейчас можно), и некоторые вещи, которые раньше можно было сделать (склонение глагол <-> причастие), станет сделать нельзя.

Идеальным вариантом было бы (как мне кажется) как-то сохранять информацию о связях при компиляции словарей, и при нормализации указывать, какие связи учитывать, а какие нет. Это потребует переделки способа компиляции словарей (нужно будет придумать, как всю информацию запаковать так, чтоб она все еще занимала мало памяти и все еще можно было быстрые выборки делать) + придумать API для этого всего (что делать с атрибутами Parse.normal_form и Parse.normalized, например? - вариант "удалить" принимается). Задача достаточно нетривиальная (хотя вроде реализуемая вполне); сам я ее делать не буду в ближайшее время точно, но если кто-то хочет с этим поразбираться, то патчи/пулл-реквесты приветствуются :) Документация по тому, как словари компилируются сейчас - тут: http://pymorphy2.readthedocs.org/en/latest/internals/dict.html

суббота, 23 февраля 2013 г., 2:41:06 UTC+6 пользователь igor....@gmail.com написал:

Yuri Baburov

unread,
Feb 24, 2013, 11:12:47 AM2/24/13
to pymo...@googlegroups.com, igor....@gmail.com
Привет, в голову приходят два решения, немного отличающихся от того, что ты описал.
Подскажи, насколько сложно так сделать:
1) можно выбирать форму с помощью нормализации+склонения: нормализация выдала для причастия глагол, но мы знаем, что текущая форма -- причастие, и выдаём в ответ причастие.
Т.о, нужно только знать, как выглядит "нормальная форма" для каждой части речи: для существительного это им. падеж, ед. число, для прилагательного -- ещё и мужской род, итд.
2) можно сделать "частичную нормализацию": первая нормализация даёт нормальную форму текущей часть речи, а нормализация нормальной формы текущей части речи даёт ещё более нормальную форму :) И так далее.
Скажем, причастие -> глагол сов. вида -> глагол несов. вида:
цепочка для причастия "сделанный": сделанный -> сделать -> делать
подобным образом можно было бы приводить к глаголу и отглагольные прилагательные, а к существительному, прилагательные, произошедшие от существительного, итп.




2013/2/23 Mikhail Korobov <kmi...@gmail.com>

--
Вы получили это сообщение, поскольку подписаны на группу pymorphy.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес pymorphy+u...@googlegroups.com.
Подробнее о функциях можно узнать на странице https://groups.google.com/groups/opt_out.
 
 



--
Best regards, Yuri V. Baburov, Skype: yuri.baburov, MSN: bu...@live.com

Mikhail Korobov

unread,
Feb 25, 2013, 1:19:54 PM2/25/13
to pymo...@googlegroups.com, igor....@gmail.com
Привет.

воскресенье, 24 февраля 2013 г., 22:12:47 UTC+6 пользователь Yuri Baburov написал:
Привет, в голову приходят два решения, немного отличающихся от того, что ты описал.
Подскажи, насколько сложно так сделать:
1) можно выбирать форму с помощью нормализации+склонения: нормализация выдала для причастия глагол, но мы знаем, что текущая форма -- причастие, и выдаём в ответ причастие.
Т.о, нужно только знать, как выглядит "нормальная форма" для каждой части речи: для существительного это им. падеж, ед. число, для прилагательного -- ещё и мужской род, итд.

Что имеется в виду под "реализовать"? Сейчас можно написать (хоть в коде пользователя, хоть в коде библиотеки) 

    m.parse('думающему')[0].inflect({'PRTF', 'sing', 'nomn'}) 

и как-то аналогично для остальных частей речи, это оно? Возможно, если в 0-м разборе нет всех нужных граммем (и inflect ничего не вернул), использовать 1й и т.д.

Еще вариант - выбирать первую форму в лексеме, у которой та же часть речи. Но тогда, например, "красивее" не перейдет в "красивый". 

Мне кажется (на данный момент), что способ нормализации может зависеть от задачи. Когда-то лучше компаратив нормализовывать в прилагательное, когда-то нет. Нормализация - это предварительный этап для каких-то дальшейших алгоритмов, и оценивать то, какой способ нормализации лучше, хорошо бы по тому, насколько он полезен для последующих действий (по сравнению с другими способами нормализации). У меня никаких количественных данных об этом нет.

Зашить какое-то определенное правило нормализации в библиотеку можно. Но ведь сейчас как раз одно из возможных правил и зашито. У зашитого в настоящий момент правила плюс в том, что оно работает быстро и как-бы само получилось; через inflect, думаю, это будут тысячи слов в секунду, а не десятки тысяч. 

Чтоб правила работали быстро, нужна поддержка от словаря или какая-то другая сильная переделка; "наивная" поддержка склонения причастие -> причастие ухудшает возможности pymorphy2 по склонению слов; для "ненаивной" нужно закопаться в формат словарей и понять, как ее делать.

 
2) можно сделать "частичную нормализацию": первая нормализация даёт нормальную форму текущей часть речи, а нормализация нормальной формы текущей части речи даёт ещё более нормальную форму :) И так далее.
Скажем, причастие -> глагол сов. вида -> глагол несов. вида:
цепочка для причастия "сделанный": сделанный -> сделать -> делать
подобным образом можно было бы приводить к глаголу и отглагольные прилагательные, а к существительному, прилагательные, произошедшие от существительного, итп.


Такие цепочки, по сути, и есть в словарях OpenCorpora (не все, но многие). Их поддержки в pymorphy2 сейчас нет; то, что видите - это результат разворачивания всех цепочек. Сделать как-то поддержку этих цепочек - хорошая фича.

Прилагательное к существительному не выйдет - в словарях этой связи нет. Совершенный-несовершенный вид - тоже. Можно предложить ребятам из OpenCorpora связь добавить и, чтоб помочь, как-то автоматизированно списки слов для вычитки составить, но это в любом случае очень много работы: для связи NOUN-ADJF - это несколько десятков или даже сотен тысяч слов проверить вручную (причем, видимо, не нами, что дело усложняет), + потом словарь как-то обновить.

Mikhail Korobov

unread,
Feb 25, 2013, 1:23:10 PM2/25/13
to pymo...@googlegroups.com, igor....@gmail.com
пример тикета по теме: http://code.google.com/p/opencorpora/issues/detail?id=110&colspec=ID%20Type%20Status%20Priority%20Owner%20Summary

вторник, 26 февраля 2013 г., 0:19:54 UTC+6 пользователь Mikhail Korobov написал:
Reply all
Reply to author
Forward
0 new messages