pymorphy2 icon indicating copy to clipboard operation
pymorphy2 copied to clipboard

Add Interslavic language support

Open bt2901 opened this issue 3 years ago • 6 comments

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ест прототип.

  1. Можно ли имати дискуссиjу за проект pymorphy2-словника ту? Jест ли то добро мєсто длjа того?
  2. Мысльу, же мнє потрєбно издєлати фаjлы и директориjу, подобне на ru и uk ту: https://github.com/kmike/pymorphy2/tree/master/pymorphy2/lang Правилно? Потрєбно ли нєчто jешче?
  3. Чи можно ли изчркнути анализатор длjа тега "LATN"? То jест проблем, jербо меджусловjанскы jезык користаје/употрєбјаје два алфабета: кирилицу и латиницу. В будучности буде добро издєлати кириличну и латиничну версиjу словников.

EDIT: Вєроjетно, пункт 3 се буде разрєшати, ако ли додавати units експлицитно: pymorphy2.MorphAnalyzer(units=[units.DictionaryAnalyzer(), ...])

bt2901 avatar Apr 24 '21 19:04 bt2901

Привет, я думаю, сообщество поможет, чем сможет. Юниты ты наверное для поддержки своего языка можешь зафиксировать, хватит и дефолтов, типа MorphAnalyzer('interslavic').

buriy avatar Apr 27 '21 05:04 buriy

Благодар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>

Та же самая информация табличкой:

image

Можете подсказать, что я делаю не так?

bt2901 avatar Apr 27 '21 23:04 bt2901

Может быть, потому что у слова «муж» два значения?

image

Просто мимо проходил :)

bzaar avatar Apr 28 '21 00:04 bzaar

<l t="муж"><g v="masc" /><g v="anim" /><g v="NOUN" /></l>

Не должен ли NOUN стоять первым?

ghost avatar Apr 28 '21 02:04 ghost

С лишним вариантом разбора разобрался, там дело было в том, что я писал в файл немного лишнего и замыленным взглядом долго этого не замечал. Починено.

Не должен ли NOUN стоять первым?

Вообще должен, но как я понимаю, это влияет только на порядок тэгов в результате разбора; это только визуальная штука. Исправить конечно стоит, но пока это не столь важно.

Ещё несколько вопросов к сообществу.

  1. Вопрос про юниты.

Юниты ты наверное для поддержки своего языка можешь зафиксировать, хватит и дефолтов, типа MorphAnalyzer('interslavic').

Я посмотрел на https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/ru/config.py#L169 и не смог понять, почему там какие-то юниты просто перечислены через запятую, а какие-то запакованы в массив внутри массива? На что это влияет?

  1. Как работают связи между словами, когда у них меняется часть речи? Вот у меня есть глагол "нести", от которого можно образовать глаголно име "несеньје". Или, например, прилагательное (придавник) "компјутерны", от которого образуется наречие (присловник) "компјутернєје". Как правильно организовывать такие связи и как их использовать?

  2. У меня пока что не получается выбирать те леммы, которые я ожидаю.

>>> 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 или мужской род, ед. число, именительный падеж?

bt2901 avatar May 02 '21 00:05 bt2901

On Sun, May 2, 2021 at 7:52 AM bt2901 @.***> wrote:

С лишним вариантом разбора разобрался, там дело было в том, что я писал в файл немного лишнего и замыленным взглядом долго этого не замечал. Починено.

Не должен ли NOUN стоять первым?

Вообще должен, но как я понимаю, это влияет только на порядок тэгов в результате разбора; это только визуальная штука. Исправить конечно стоит, но пока это не столь важно.

Ещё несколько вопросов к сообществу.

  1. Вопрос про юниты.

Юниты ты наверное для поддержки своего языка можешь зафиксировать, хватит и дефолтов, типа 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

buriy avatar May 03 '21 07:05 buriy