Skip to content
This repository

Метод inflect неудобен, если у слова есть второй предложный/винительный/родительный падеж #8

Closed
kmike opened this Issue · 15 comments

3 participants

Mikhail Korobov Yuri Baburov Ivan Virabyan
Mikhail Korobov
Owner

Т.к. в этом случае, например, вместо loct указывается граммема loc1. Думаю, лучше, чтоб в методе inflect loct и loc1 считались эквивалентными.

Mikhail Korobov
Owner
kmike commented

Мне кажется, что решать этот тикет лучше так:

  • если запрашивалась форма с loct/accs/gent и она не найдена, то пробовать loc1/acc1/gen1;
  • если запрашивалась форма с loc2/acc2/gen2 и она не найдена, то пробовать loct/accs/gent.
Yuri Baburov
buriy commented

Привет, по поводу этих loc1, loc2, где-нибудь они и их отличия от loct задокументированы?
У opencorpora с документацией вообще плохо, да?

Ivan Virabyan

а можно пример, что это за второй падеж?

Mikhail Korobov
Owner
kmike commented

Там все просто: если есть loc2, то вместо loct пишется loc1.

Примеры для loc2 и т.д. я вот тут пытался задокументировать: http://pymorphy2.readthedocs.org/en/latest/user/grammemes.html

Mikhail Korobov
Owner
kmike commented

acc2 сейчас в словаре не проставлены (ни у одного слова этой граммемы нет), но, возможно, появятся потом; см. https://code.google.com/p/opencorpora/issues/detail?id=386&colspec=ID%20Type%20Status%20Priority%20Owner%20Summary

Mikhail Korobov
Owner
kmike commented

Можно еще на этапе препроцессинга словаря loc1/acc1/gen1 в loct/accs/gent преобразовывать. Кажется, что между loc1 и loct никаких отличий нет, но я все же не лингвист и не скажу точно - сначала бы узнать, почему в OpencCorpora loc1/acc1/gen1 появились (их специально делали зачем-то). Если смысла в них нет, то лучше в OpenCorpora их заменить, а не тут.

Yuri Baburov
buriy commented

Хм, я бы заменил loc1/acc1/gen1 на loct, accs, gent тогда, в т.ч. в базе.
Ведь понятие "loc1" не несет специального смысла, кроме того, что "существует немного другой падеж".
Т.е. чтобы был только "loct" и "loc2", аналогично accs и acc2, gent и gen2.

Поиск первой формы:
сейчас: (find inflect where case='loct' or case='loc1')
вариант1: (find inflect where case='loct')

Поиск второй формы:
сейчас: (find inflect where case='loct' or case='loc2')
потом: find inflect where case='loc2'; if no results find inflect 'loct'.

В opencorpora, я думаю, нужен был быстрый поиск слов с пометкой loc1 в базе. Кроме того, как сделать быстрый поиск по всем loc1 (но не loct) в новом варианте (когда пишется loct вместо loc1)?
Кстати, есть у opencorpora где-нибудь интерфейс поиска слов с определенными пометками?

Mikhail Korobov
Owner
kmike commented

"Существует другой падеж" может означать, что "Форма второго падежа не совпадает с формой первого". Тогда loc1 отличается от loct тем, что слово с loc1 не может встречаться в конструкции, в которой требуется loc2, а слово с loct - может (ну и для других падежей то же самое). Так ли это на самом деле - я без понятия.

Онлайн-интерфейса я не знаю; локально со словарем можно общаться так:

[p for p in m.iter_known_word_parses() if {'gen1', 'sing'} in p.tag]
Yuri Baburov
buriy commented

Хм, в общем, всё утыкается в вопрос, как оформить правила сопоставления, когда нужен матчинг именно с loc2 или loct, но не loc1. Если объединить loc1 и loct, то это будет невозможно без if-а, а значит, задания приоритетов правил. Вывод: объединять нельзя, нужно править матчинг в pymorphy2, чтобы:
loct matches loc1
loct matches loc2
loc1 matches loc1
loc2 matches loc2
no other matches are possible.
Ты, таким образом, при управлении существительного числительным, будешь должен искать не gent, а gen1 (родительный падеж, но не партитив).

Mikhail Korobov
Owner
kmike commented

Все упирается в то, встречаются ли случаи, когда нужно loc2 или loct, но не loc1. Если нет, то лучше поправить словарь OpenCorpora, а не матчинг в pymorphy2.

А что такое "matches" у тебя? Не будет проблем из-за его некоммутативности?

Что насчет loc2 => loct? См., например, https://bitbucket.org/kmike/pymorphy/issue/8/2
Ну и в общем виде поправить сопоставление граммем может быть проблематично (например, что делать с множеством tag.gramemmes - не очень понятно).

Из конкретных шагов - мне кажется, есть смысл поправить метод inflect, как написано в этом комменте: #8 (comment) - это не очень сложно, и должно решить все проблемы со склонением.

Про остальное мне сейчас не до конца все понятно.

Yuri Baburov
buriy commented

А что такое "matches" у тебя? Не будет проблем из-за его некоммутативности?

Ну, я предлагаю, как оно должно работать на практике, чтобы можно было искать нужную форму через inflect.
Да и для синтаксического анализа тоже такое же представление наиболее удобно.
Оно отражает онтологическую связь между признаками: loc1 -- это (разновидность) loct, loc2 -- это (разновидность) loct. Но не наоборот.

Yuri Baburov
buriy commented

Что насчет loc2 => loct? См., например, https://bitbucket.org/kmike/pymorphy/issue/8/2

Абсолютно верно, это то же самое преобразование, только в обратную форму.
Ведь у слова указан loct, если loc1 == loc2, и не указан, если loc1 != loc2.
Значит, если просят дать loc2, мы сматчим его с loc2 или с loct по этому же правилу.

Mikhail Korobov
Owner
kmike commented

А можешь конкретнее написать, что ты предлагаешь?

Одно дело поменять метод inflect, другое - __eq__ у граммем, третье - __contains__ у OpencorporaTag (может, еще места есть). Например, возвращать True для 'loc2' in tag, если у тега loct - странно как-то, и неожиданно (скорее всего, именно loc2 интересовало пользователя в этом случае, иначе бы loct написал). А склонять в loct, если вызвали inflect({'loc2'}) и нет формы с loc2 - не странно.

Кроме того, я не уверен в том, что loct указан, когда loc1 == loc2. Может, он указан, когда нет формы loc2, и loct==loc1. Это лучше у лингвистов разузнать.

Yuri Baburov
buriy commented
Mikhail Korobov kmike referenced this issue from a commit
Mikhail Korobov (backwards-incompatible) dictionary preprocessing. loc1,gen1 and acc1…
… grammemes are now loct,gent and accs. Tags that differs only in grammeme order are unified. See #8.
098f4fc
Mikhail Korobov kmike closed this in 65a3fc2
Mikhail Korobov
Owner
kmike commented

Насколько я понял, loc1/gen1 - это все-таки ровно то же самое, что и loct/gent. Поэтому они теперь преобразуются на этапе компиляции словаря (нужно обновить pymorphy2-dicts до версии >= 2.2).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.