pymorphy2
pymorphy2 copied to clipboard
Add Interslavic language support
Interslavic is a (zonal) constructed language that is created in such a way that people from Slavic countries are able to understand most of it without any prior education. It has a Wikipedia page and everything.
кашл Меджусловjанскы jезык jест jезык, разумливы приблизно всим словянам без ученьjа. Два наjвыше важных линка сут steen.free.fr/interslavic/index.html и interslavic-dictionary.com
Jа jесм смогл сгенерировати фаjлы, кторе сут потрєбне для pymorphy2: https://github.com/bt2901/interslavic_utils/releases/tag/0.6
Егзистуjе много проблемов, але то jест прототип.
- Можно ли имати дискуссиjу за проект
pymorphy2
-словника ту? Jест ли то добро мєсто длjа того? - Мысльу, же мнє потрєбно издєлати фаjлы и директориjу, подобне на
ru
иuk
ту: https://github.com/kmike/pymorphy2/tree/master/pymorphy2/lang Правилно? Потрєбно ли нєчто jешче? - Чи можно ли изчркнути анализатор длjа тега "LATN"? То jест проблем, jербо меджусловjанскы jезык користаје/употрєбјаје два алфабета: кирилицу и латиницу. В будучности буде добро издєлати кириличну и латиничну версиjу словников.
EDIT: Вєроjетно, пункт 3 се буде разрєшати, ако ли додавати units
експлицитно: pymorphy2.MorphAnalyzer(units=[units.DictionaryAnalyzer(), ...])
Привет, я думаю, сообщество поможет, чем сможет. Юниты ты наверное для поддержки своего языка можешь зафиксировать, хватит и дефолтов, типа MorphAnalyzer('interslavic').
Благодарjу! Тутчас jа имам проблем с неправилным числом форм слова в разбору:
>>> import pymorphy2
>>> morph_isv = pymorphy2.MorphAnalyzer(out_dir)
>>> morph_isv.parse("муж")
[Parse(word='муж', tag=OpencorporaTag('masc,anim,NOUN'), normal_form='муж', score=1.0, methods_stack=((DictionaryAnalyzer(), 'муж', 59, 0),)), Parse(word='муж', tag=OpencorporaTag('masc,anim,NOUN nomn,sing'), normal_form='муж', score=1.0, methods_stack=((DictionaryAnalyzer(), 'муж', 59, 1),))]
>>> morph_ru = pymorphy2.MorphAnalyzer()
>>> morph_ru.parse("муж")
[Parse(word='муж', tag=OpencorporaTag('NOUN,anim,masc sing,nomn'), normal_form='муж', score=1.0, methods_stack=((DictionaryAnalyzer(), 'муж', 2066, 0),))]
Для русского языка анализатор даёт один вариант разбора: NOUN,anim,masc sing,nomn
, но для межславянского (где ситуация в целом должна быть аналогичной) откуда-то возникает ещё один "лишний" вариант разбора masc,anim,NOUN
, в котором нет "конкретных" грамем. Мне кажется, что я как-то неправильно определяю форму-лемму, но я не совсем понимаю, как это должно выглядеть.
Кусок XML, отвечающий за формы слова "муж", выглядит у меня так:
<lemma id="6121" rev="1">
<l t="муж"><g v="masc" /><g v="anim" /><g v="NOUN" /></l>
<f t="муж" /><f t="муж"><g v="nomn" /><g v="sing" /></f>
<f t="мужи"><g v="plur" /><g v="nomn" /></f>
<f t="мужа"><g v="accs" /><g v="sing" /></f>
<f t="мужев"><g v="accs" /><g v="plur" /></f>
<f t="мужа"><g v="gent" /><g v="sing" /></f>
<f t="мужев"><g v="gent" /><g v="plur" /></f>
<f t="мужу"><g v="loct" /><g v="sing" /></f>
<f t="мужах"><g v="loct" /><g v="plur" /></f>
<f t="мужу"><g v="datv" /><g v="sing" /></f>
<f t="мужам"><g v="plur" /><g v="datv" /></f>
<f t="мужем"><g v="ablt" /><g v="sing" /></f>
<f t="мужами"><g v="ablt" /><g v="plur" /></f>
<f t="мужу"><g v="voct" /><g v="sing" /></f>
<f t="мужи"><g v="voct" /><g v="plur" /></f>
</lemma>
Та же самая информация табличкой:
Можете подсказать, что я делаю не так?
Может быть, потому что у слова «муж» два значения?
Просто мимо проходил :)
<l t="муж"><g v="masc" /><g v="anim" /><g v="NOUN" /></l>
Не должен ли NOUN стоять первым?
С лишним вариантом разбора разобрался, там дело было в том, что я писал в файл немного лишнего и замыленным взглядом долго этого не замечал. Починено.
Не должен ли NOUN стоять первым?
Вообще должен, но как я понимаю, это влияет только на порядок тэгов в результате разбора; это только визуальная штука. Исправить конечно стоит, но пока это не столь важно.
Ещё несколько вопросов к сообществу.
- Вопрос про юниты.
Юниты ты наверное для поддержки своего языка можешь зафиксировать, хватит и дефолтов, типа MorphAnalyzer('interslavic').
Я посмотрел на https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/ru/config.py#L169 и не смог понять, почему там какие-то юниты просто перечислены через запятую, а какие-то запакованы в массив внутри массива? На что это влияет?
-
Как работают связи между словами, когда у них меняется часть речи? Вот у меня есть глагол "нести", от которого можно образовать глаголно име "несеньје". Или, например, прилагательное (придавник) "компјутерны", от которого образуется наречие (присловник) "компјутернєје". Как правильно организовывать такие связи и как их использовать?
-
У меня пока что не получается выбирать те леммы, которые я ожидаю.
>>> rumorph.parse("имею")[0]
Parse(word='имею', tag=OpencorporaTag('VERB,impf,tran sing,1per,pres,indc'), normal_form='иметь', score=1.0, methods_stack=((DictionaryAnalyzer(), 'имею', 1719, 1),))
>>> isv_morph.parse("имєју")[0]
Parse(word='имєју', tag=OpencorporaTag('VERB,impf,tran pres,sing,1per'), normal_form='имєл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'имєју', 61, 4),))
Почему normal_form='имєл'
, а не "имєти"? В xml я описываю это слово так:
<lemma id="3380" rev="1">
<l t="имєти"><g v="VERB" /><g v="impf" /><g v="tran" /></l>
<f t="имєл"><g v="sing" /><g v="masc" /><g v="past" /></f>
<f t="имєла"><g v="femn" /><g v="sing" /><g v="past" /></f>
<f t="имєло"><g v="sing" /><g v="past" /><g v="neut" /></f>
...
<f t="имєты"><g v="pssv" /><g v="masc" /><g v="past" /></f><f t="имєта"><g v="femn" /><g v="pssv" /><g v="past" /></f><f t="имєто"><g v="pssv" /><g v="past" /><g v="neut" /></f><f t="имєти"><g v="infn" /></f><f t="имєтје"><g v="V-be" /><g v="NOUN" /></f></lemma>
Получается, pymorphy2 считает нормальной формой первую запись без тега <l>
? Можно ли управлять этим поведением? Например, указать что нормальная форма -- это та, которая с тэгом infn
или мужской род, ед. число, именительный падеж?
On Sun, May 2, 2021 at 7:52 AM bt2901 @.***> wrote:
С лишним вариантом разбора разобрался, там дело было в том, что я писал в файл немного лишнего и замыленным взглядом долго этого не замечал. Починено.
Не должен ли NOUN стоять первым?
Вообще должен, но как я понимаю, это влияет только на порядок тэгов в результате разбора; это только визуальная штука. Исправить конечно стоит, но пока это не столь важно.
Ещё несколько вопросов к сообществу.
- Вопрос про юниты.
Юниты ты наверное для поддержки своего языка можешь зафиксировать, хватит и дефолтов, типа MorphAnalyzer('interslavic').
Я посмотрел на https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/ru/config.py#L169 и не смог понять, почему там какие-то юниты просто перечислены через запятую, а какие-то запакованы в массив внутри массива? На что это влияет?
Скорее всего, на порядок вычисления (внутри скобок -- одинаковый приоритет)
Как работают связи между словами, когда у них меняется часть речи? Вот у меня есть глагол "нести", от которого можно образовать глаголно име "несеньје". Или, например, прилагательное (придавник) "компјутерны", от которого образуется наречие (присловник) "компјутернєје". Как правильно организовывать такие связи и как их использовать?
Этот вопрос несколько раз поднимался в issues, надо поискать. Возможно, только какие-то связи частей речи используются (при объединении словоформ в один список), а другие -- нет.
У меня пока что не получается выбирать те леммы, которые я ожидаю.
rumorph.parse("имею")[0] Parse(word='имею', tag=OpencorporaTag('VERB,impf,tran sing,1per,pres,indc'), normal_form='иметь', score=1.0, methods_stack=((DictionaryAnalyzer(), 'имею', 1719, 1),)) isv_morph.parse("имєју")[0] Parse(word='имєју', tag=OpencorporaTag('VERB,impf,tran pres,sing,1per'), normal_form='имєл', score=1.0, methods_stack=((DictionaryAnalyzer(), 'имєју', 61, 4),))
Почему normal_form='имєл', а не "имєти"? В xml я описываю это слово так:
... Получается, pymorphy2 считает нормальной формой первую запись без тега
? Можно ли управлять этим поведением? Например, указать что нормальная форма -- это та, которая с тэгом infn или мужской род, ед. число, именительный падеж?
Все эти вопросы решаются взглядом на исходный код и, при необходимости, отладкой. Лучше не воспринимать программные пакеты как чёрные ящики -- очень долго придётся отлаживать код :)
-- Best regards, Yuri V. Baburov, Skype: yuri.baburov