Giter Site home page Giter Site logo

pymorphy2's Introduction

pymorphy2

Morphological analyzer (POS tagger + inflection engine) for Russian and Ukrainian languages. License is MIT.

PyPI Version Build Status Code Coverage Documentation

Citing

Korobov M.: Morphological Analyzer and Generator for Russian and
Ukrainian Languages // Analysis of Images, Social Networks and Texts,
pp 320-332 (2015).

Links:

BibTeX:

@incollection{
   year={2015},
   isbn={978-3-319-26122-5},
   booktitle={Analysis of Images, Social Networks and Texts},
   volume={542},
   series={Communications in Computer and Information Science},
   editor={Khachay, Mikhail Yu. and Konstantinova, Natalia and Panchenko, Alexander and Ignatov, Dmitry I. and Labunets, Valeri G.},
   doi={10.1007/978-3-319-26123-2_31},
   title={Morphological Analyzer and Generator for Russian and Ukrainian Languages},
   url={http://dx.doi.org/10.1007/978-3-319-26123-2_31},
   publisher={Springer International Publishing},
   keywords={Morphological analyzer; Russian; Ukrainian; Morphological generator; Open source; OpenCorpora; LanguageTool; pymorphy2; pymorphy},
   author={Korobov, Mikhail},
   pages={320-332},
   language={English}
}

pymorphy2's People

Contributors

bubavv avatar insolor avatar ivirabyan avatar kmike avatar suor avatar yuego avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pymorphy2's Issues

в лексемах составных слов (с дефисом) могут "теряться" некоторые граммемы

Пример:

>>> for p in m.parse('человек-гора')[0].lexeme:
...    print("%-15s %s" % (p.word, p.tag))
человек-гора    NOUN,anim,masc sing,nomn
человека-горы   NOUN,anim,masc sing,gent
человеку-горе   NOUN,anim,masc sing,datv
человека-гору   NOUN,anim,masc sing,accs
человеком-горой NOUN,anim,masc sing,ablt
человеком-горою NOUN,anim,masc sing,ablt
человеке-горе   NOUN,anim,masc sing,loct
люди-горы       NOUN,anim,masc plur,nomn
людей-гор       NOUN,anim,masc plur,gent
людям-горам     NOUN,anim,masc plur,datv
людей-горы      NOUN,anim,masc plur,accs
людьми-горами   NOUN,anim,masc plur,ablt
людях-горах     NOUN,anim,masc plur,loct

у "человеком-горою" потерялась граммема "V-oy"

Проверить PARTICLES_AFTER_HYPHEN для украинского языка

В этой константе содержится список частиц, которые могут цепляться к словам через дефис.
См. https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/uk/config.py и аналогичный список для русского (https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/ru/config.py).

//сс @dchaplinsky @mariana-scorp

Предсказатель: предсказывать пропущенный дефис?

Например, "повидимому". Мне кажется, такие вещи могу часто встречаться. Но делать это только после того, как разбор слов с дефисом будет готов (вдруг само заработает, понять пока не могу), и после проверки, что ошибка действительно стоит того.

Ошибка при компиляции словаря

KeyError                                  Traceback (most recent call last)
/home/alexk/projects/test_pymorphy/<ipython-input-6-91afa2c0de53> in <module>()
----> 1 cli.compile_dict('dict.opcorpora.xml')

/home/alexk/v/uaprom-arch/lib/python2.7/site-packages/pymorphy2/cli.pyc in compile_dict(in_filename, out_folder, overwrite, prediction_options)
     24     if out_folder is None:
     25         out_folder = 'dict'
---> 26     opencorpora_dict.to_pymorphy2_format(in_filename, out_folder, overwrite, prediction_options=prediction_options)
     27 
     28 def xml_to_json(in_filename, out_filename):

/home/alexk/v/uaprom-arch/lib/python2.7/site-packages/pymorphy2/opencorpora_dict.pyc in to_pymorphy2_format(opencorpora_dict_path, out_path, overwrite, prediction_options)
    383     lemmas, links, grammemes, version, revision = _load_json_or_xml_dict(opencorpora_dict_path)
    384     gramtab, suffixes, paradigms, words_dawg, prediction_suffixes_dawg = _gram_structures(
--> 385         lemmas, links, prediction_options=prediction_options
    386     )
    387     prediction_prefixes_dawg = dawg.DAWG(PREDICTION_PREFIXES)

/home/alexk/v/uaprom-arch/lib/python2.7/site-packages/pymorphy2/opencorpora_dict.pyc in _gram_structures(lemmas, links, prediction_options)
    287 
    288     logger.info("inlining lemma links...")
--> 289     lemmas = _join_lemmas(lemmas, links)
    290 
    291     logger.info('building paradigms...')

/home/alexk/v/uaprom-arch/lib/python2.7/site-packages/pymorphy2/opencorpora_dict.pyc in _join_lemmas(lemmas, links)
    210 #            continue

    211 
--> 212         move_lemma(link_end, link_start)
    213 
    214     lemma_ids = sorted(lemmas.keys(), key=int)
/home/alexk/v/uaprom-arch/lib/python2.7/site-packages/pymorphy2/opencorpora_dict.pyc in move_lemma(from_id, to_id)
    193 
    194     def move_lemma(from_id, to_id):
--> 195         lm = lemmas[str(from_id)]
    196 
    197         while to_id in moves:

KeyError: '6'

Не требовать слова в нижнем регистре

Нужно посмотреть, вдруг получится сделать так, чтоб регистр слов сохранялся без особых провалов по скорости. А то вопросов много.

Кстати, видимо, из-за этого у AOT верхний регистр был - с ним проще заметить, что слова в верхнем регистре передавать нужно.

Кроме того, для морфологического анализатора было бы правильно использовать информацию о том, большая буква или маленькая.

Проверить KNOWN_PREFIXES для украинского языка

В этой константе содержатся префиксы, которые можно приписать к слову так, что его грамматические характеристики не изменятся. См. https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/uk.py и аналогичный список для русского https://github.com/kmike/pymorphy2/blob/master/pymorphy2/lang/ru.py.

Сейчас там набор констант, взятый из LT. В LT они обрабатываются только если есть дефис, поэтому я добавил только варианты с дефисом. В русском списке есть префиксы и с дефисом, и без - может, в украинском тоже? Аналоги "не", "без", "до", "недо", "меж" и т.д.

//сс @dchaplinsky @mariana-scorp

Предсказатель: единственного разбора на часть речи не всегда хватает

Пример:

>>> m.parse('больнично-арестантский')
[Parse(word='больнично-арестантский', tag=OpencorporaTag('ADJF inan,masc,sing,accs'), normal_form='больнично-арестантский', para_id=15, idx=4, estimate=0.49624530663329164),
 Parse(word='больнично-арестантский', tag=OpencorporaTag('NOUN,anim,masc sing,nomn'), normal_form='больнично-арестантский', para_id=451, idx=0, estimate=0.0031289111389236545)]

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

>>> m.parse('больнично-арестантский')[0].lexeme
[Parse(word='больнично-арестантский', tag=OpencorporaTag('ADJF masc,sing,nomn'), normal_form='больнично-арестантский', para_id=15, idx=0, estimate=0.49624530663329164),
 Parse(word='больнично-арестантского', tag=OpencorporaTag('ADJF masc,sing,gent'), normal_form='больнично-арестантский', para_id=15, idx=1, estimate=0.49624530663329164),
 Parse(word='больнично-арестантскому', tag=OpencorporaTag('ADJF masc,sing,datv'), normal_form='больнично-арестантский', para_id=15, idx=2, estimate=0.49624530663329164),
 Parse(word='больнично-арестантского', tag=OpencorporaTag('ADJF anim,masc,sing,accs'), normal_form='больнично-арестантский', para_id=15, idx=3, estimate=0.49624530663329164),
 Parse(word='больнично-арестантский', tag=OpencorporaTag('ADJF inan,masc,sing,accs'), normal_form='больнично-арестантский', para_id=15, idx=4, estimate=0.49624530663329164),
 Parse(word='больнично-арестантским', tag=OpencorporaTag('ADJF masc,sing,ablt'), normal_form='больнично-арестантский', para_id=15, idx=5, estimate=0.49624530663329164),
 Parse(word='больнично-арестантском', tag=OpencorporaTag('ADJF masc,sing,loct'), normal_form='больнично-арестантский', para_id=15, idx=6, estimate=0.49624530663329164),
 Parse(word='больнично-арестантская', tag=OpencorporaTag('ADJF femn,sing,nomn'), normal_form='больнично-арестантский', para_id=15, idx=7, estimate=0.49624530663329164),
 Parse(word='больнично-арестантской', tag=OpencorporaTag('ADJF femn,sing,gent'), normal_form='больнично-арестантский', para_id=15, idx=8, estimate=0.49624530663329164),
 Parse(word='больнично-арестантской', tag=OpencorporaTag('ADJF femn,sing,datv'), normal_form='больнично-арестантский', para_id=15, idx=9, estimate=0.49624530663329164),
 Parse(word='больнично-арестантскую', tag=OpencorporaTag('ADJF femn,sing,accs'), normal_form='больнично-арестантский', para_id=15, idx=10, estimate=0.49624530663329164),
 Parse(word='больнично-арестантской', tag=OpencorporaTag('ADJF femn,sing,ablt'), normal_form='больнично-арестантский', para_id=15, idx=11, estimate=0.49624530663329164),
 Parse(word='больнично-арестантскою', tag=OpencorporaTag('ADJF femn,sing,ablt,V-oy'), normal_form='больнично-арестантский', para_id=15, idx=12, estimate=0.49624530663329164),
 Parse(word='больнично-арестантской', tag=OpencorporaTag('ADJF femn,sing,loct'), normal_form='больнично-арестантский', para_id=15, idx=13, estimate=0.49624530663329164),
 Parse(word='больнично-арестантское', tag=OpencorporaTag('ADJF neut,sing,nomn'), normal_form='больнично-арестантский', para_id=15, idx=14, estimate=0.49624530663329164),
 Parse(word='больнично-арестантского', tag=OpencorporaTag('ADJF neut,sing,gent'), normal_form='больнично-арестантский', para_id=15, idx=15, estimate=0.49624530663329164),
 Parse(word='больнично-арестантскому', tag=OpencorporaTag('ADJF neut,sing,datv'), normal_form='больнично-арестантский', para_id=15, idx=16, estimate=0.49624530663329164),
 Parse(word='больнично-арестантское', tag=OpencorporaTag('ADJF neut,sing,accs'), normal_form='больнично-арестантский', para_id=15, idx=17, estimate=0.49624530663329164),
 Parse(word='больнично-арестантским', tag=OpencorporaTag('ADJF neut,sing,ablt'), normal_form='больнично-арестантский', para_id=15, idx=18, estimate=0.49624530663329164),
 Parse(word='больнично-арестантском', tag=OpencorporaTag('ADJF neut,sing,loct'), normal_form='больнично-арестантский', para_id=15, idx=19, estimate=0.49624530663329164),
 Parse(word='больнично-арестантские', tag=OpencorporaTag('ADJF plur,nomn'), normal_form='больнично-арестантский', para_id=15, idx=20, estimate=0.49624530663329164),
 Parse(word='больнично-арестантских', tag=OpencorporaTag('ADJF plur,gent'), normal_form='больнично-арестантский', para_id=15, idx=21, estimate=0.49624530663329164),
 Parse(word='больнично-арестантским', tag=OpencorporaTag('ADJF plur,datv'), normal_form='больнично-арестантский', para_id=15, idx=22, estimate=0.49624530663329164),
 Parse(word='больнично-арестантских', tag=OpencorporaTag('ADJF anim,plur,accs'), normal_form='больнично-арестантский', para_id=15, idx=23, estimate=0.49624530663329164),
 Parse(word='больнично-арестантские', tag=OpencorporaTag('ADJF inan,plur,accs'), normal_form='больнично-арестантский', para_id=15, idx=24, estimate=0.49624530663329164),
 Parse(word='больнично-арестантскими', tag=OpencorporaTag('ADJF plur,ablt'), normal_form='больнично-арестантский', para_id=15, idx=25, estimate=0.49624530663329164),
 Parse(word='больнично-арестантских', tag=OpencorporaTag('ADJF plur,loct'), normal_form='больнично-арестантский', para_id=15, idx=26, estimate=0.49624530663329164)]

Склонятор для имен и фамилий

Добрый вечер, Михаил.
Планируется ли в pymorphy2 сделать поддержку склонятора имен и фамилий?

То, что творится в склонении фамилий сейчас:

In [12]: for w in [u'Путин', u'Медведев', u'Собянин', u'Веселов', u'Прохоров', u'Миронов', u'Зюганов']:
    word = morph.parse(w)[0]
    print word.inflect({'gent'}).word
   ....:     
Путиного
Медведев
Собянин
Веселового
Прохоров
Миронов
Зюганового

Ошибки под высокой нагрузкой

Используем pymorphy2 на главной странице сайта. Под высокой нагрузкой сыпятся ошибки:

File "/usr/local/lib/python2.7/dist-packages/pymorphy2/analyzer.py", line 135, in __init__
    self._units = [cls(self) for cls in units]

  File "/usr/local/lib/python2.7/dist-packages/pymorphy2/units/by_shape.py", line 57, in __init__
    self._tag = self.morph.TagClass(self.TAG_STR)

  File "/usr/local/lib/python2.7/dist-packages/pymorphy2/tagset.py", line 272, in __init__
    self._assert_grammemes_are_known(set(grammemes_tuple))

  File "/usr/local/lib/python2.7/dist-packages/pymorphy2/tagset.py", line 364, in _assert_grammemes_are_known
    raise ValueError("Grammemes are unknown: {%s}" % unknown_repr)

ValueError: Grammemes are unknown: {'ROMN'}

При низкой нагрузке все нормально. С чем это может быть связано и что с этим делать?

AttributeError: 'module' object has no attribute 'get_POS'

$ pymorphy dict compile dict.opcorpora.xml
parsing xml...
inlining lemma links...
building paradigms...
Traceback (most recent call last):
File "/home/dontcare/projects/words_ranger/env/bin/pymorphy", line 7, in
execfile(file)
File "/home/dontcare/projects/words_ranger/env/src/pymorphy2/bin/pymorphy", line 4, in
sys.exit(cli.main())
File "/home/dontcare/projects/words_ranger/env/src/pymorphy2/pymorphy2/cli.py", line 151, in main
return compile_dict(args['<IN_FILE>'], args['--out'], args['--force'], prediction_options)
File "/home/dontcare/projects/words_ranger/env/src/pymorphy2/pymorphy2/cli.py", line 26, in compile_dict
opencorpora_dict.to_pymorphy2_format(in_filename, out_folder, overwrite, prediction_options=prediction_options)
File "/home/dontcare/projects/words_ranger/env/src/pymorphy2/pymorphy2/opencorpora_dict.py", line 374, in to_pymorphy2_format
lemmas, links, prediction_options=prediction_options
File "/home/dontcare/projects/words_ranger/env/src/pymorphy2/pymorphy2/opencorpora_dict.py", line 338, in _gram_structures
suffixes_dawg_data = _suffixes_prediction_data(words, popularity, gramtab, paradigms, **prediction_options)
File "/home/dontcare/projects/words_ranger/env/src/pymorphy2/pymorphy2/opencorpora_dict.py", line 243, in _suffixes_prediction_data
cls = tagset.get_POS(tag)
AttributeError: 'module' object has no attribute 'get_POS'

Предлог "из" и существительное "иза"

Добрый день.
Почему-то предлог "из" имеет атрибуты ('NOUN,anim,femn,Name plur,gent') и начальную форму "иза", хотя эта начальная форма настолько редка, что я ее ни разу в жизни не встречала, а "из", напротив, высокочастотный предлог.
Я бы сама поправила в словаре, но боюсь, что какую-нибудь зависимость не учту..

С благодарностью за проделанную вами работу,
Катерина

Ошибка после установки из pypi

Установил из pypi версию 0.3.5
а также pymorphy2-dicts и DAWG-Python

при попытке подключения пакета pymorphy2 выдаёт ошибку импорта tagset

>>> import pymorphy2
Traceback (most recent call last):
  File "<pyshell#66>", line 1, in <module>
    import pymorphy2
  File "/usr/local/lib/python2.7/dist-packages/pymorphy2/__init__.py", line 3, in <module>
    from .analyzer import MorphAnalyzer
  File "/usr/local/lib/python2.7/dist-packages/pymorphy2/analyzer.py", line 8, in <module>
    from pymorphy2 import opencorpora_dict
  File "/usr/local/lib/python2.7/dist-packages/pymorphy2/opencorpora_dict/__init__.py", line 4, in <module>
    from .storage import load_dict as load
  File "/usr/local/lib/python2.7/dist-packages/pymorphy2/opencorpora_dict/storage.py", line 21, in <module>
    from pymorphy2 import tagset
ImportError: cannot import name tagset

Анализатор падает на слове Ретро-FM


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-17-de50d5a3121e> in <module>()
----> 1 m.parse('Ретро-FM')

/Users/kmike/envs/pymorphy-3/lib/python3.3/site-packages/pymorphy2/analyzer.py in parse(self, word)
    163 
    164         for analyzer in self._units:
--> 165             res.extend(analyzer.parse(word, word_lower, seen))
    166 
    167             if res and analyzer.terminal:

/Users/kmike/envs/pymorphy-3/lib/python3.3/site-packages/pymorphy2/units/by_analogy.py in parse(self, word, word_lower, seen_parses)
     65                 )
     66 
---> 67                 add_parse_if_not_seen(parse, result, seen_parses)
     68 
     69         return result

/Users/kmike/envs/pymorphy-3/lib/python3.3/site-packages/pymorphy2/units/utils.py in add_parse_if_not_seen(parse, result_list, seen_parses)
      4 
      5 def add_parse_if_not_seen(parse, result_list, seen_parses):
----> 6     para_id = parse[4][0][2]
      7     word = parse[0]
      8     tag = parse[1]

IndexError: tuple index out of range

выделение приставок pymorpy2.opencorpora_dict.compile

Функция _to_paradigm не выделяет приставку, если она начинается с той же буквы, что и стем.

Для леммы

<lemma id="240004" rev="240004"><l t="платиновее"><g v="COMP"/><g v="Qual"/></l><f t="платиновее"></f><f t="платиновей"><g v="V-ej"/></f><f t="поплатиновее"><g v="Cmp2"/></f><f t="поплатиновей"><g v="Cmp2"/><g v="V-ej"/></f></lemma>

создатся следующая парадигма:

п {латиновее, латиновей, оплатиновее, оплатиновей}

в _to_paradigm 3я строчка
stem = os.path.commonprefix(forms) нужно сразу брать longest_common_substring(forms)

В результате вместо 5000 парадигм, получаем 2800

Предложение по работе с тегами

Достаточно сложно работать с тегами, приходится городить кучу лишнего кода или писать свою обертку. Например, чтобы узнать часть речи и одушевленность:

# все возможные части речи
PARTS_OF_SPEECH = set(['NOUN', 'ADJF', 'ADJS', 'INFN', 'VERB', ...])
# возможные одушевленности
ANIMACY = set(['anim', 'inan'])

# часть речи обязательно должна присутствовать
part = iter(tag.grammemes.intersect(PARTS_OF_SPEECH)).next()
# получаем одушевленность (может отсутствовать)
try:
    animacy = iter(tag.grammemes.intersection(ANIMACY)).next()
except StopIteration:
    animacy = None
# альтернативный вариант
animacy_set = tag.grammemes.intersection(ANIMACY)
if animacy_set:
    animacy = iter(animacy_set).next()
else:
    animacy = None

То же самое приходится делать, чтобы получить род, падежи, множественность, время, спряжение и прочее.
Почему бы не создать специальные атрибуты:

tag.part
tag.animacy
tag.gender
tag.case
tag.number
tag.tense
# и т. д.

Инсталляция через pip

Было бы неплохо иметь возможность инсталлировать пакетом. Для pymorphy 0.5.6 пакет есть. Планируется ли для pymorphy2?

Склонение имен человеческих

Всем привет,

нигде в доках не смогли найти примера, какие граммемы лучше использовать для склонения имен. Мы поигрались с разными вариантами, но они лажают на имени "Алла" в дательном падеже.

name = u'Алла'
pname = morth.parse(name)[0]
dname = pname.inflect( set(['datv', 'sing', 'femn', "Name"] ) )

  • возвращает "Алла" вместо ожидаемого "Алле".

Как исправить?...

Слово «зара»

Формы слова «заря» анализируются как производные от существительного «зара», которое есть в словаре и предлагается как первый вариант:

>>> import pymorphy2
>>> ma = pymorphy2.MorphAnalyzer()
>>> ma.parse('заре')
[Parse(word='заре', tag=OpencorporaTag('NOUN,anim,femn,Name sing,datv'),  
normal_form='зара', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 68, 2),)),  
Parse(word='заре', tag=OpencorporaTag('NOUN,anim,femn,Name sing,loct'),   
normal_form='зара', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 68, 6),)) . . .]

Определять аббревиатуры

Сейчас анализатор не понимает что КПСС, КПРФ или ООО это аббревиатуры. Было бы очень полезно отделять их.

Динамическое добавление слов

Рассматриваю Вашу библю в качестве анализатора текста, столкнулся с тем что с русским она шикарно работает, а вот латиницей пока сложно.
Возможно ли осуществить добавление слов на лету?

"двум-трём" разбирается неправильно

У "двум" в словаре указывается род (т.к. формы слова "два" зависят от рода: два/две), а у "трем" - не указывается (т.к. там род не важен при склонении).

Анализатор слов с дефисами работает в этом случае неправильно, т.к. не находит похожих форм у "два" и "три".

Проблема со склонением (python 2.6)

Не удается просклонять слово в pymorphy2 на python 2.6

Делаю по примеру:

>>> import pymorphy2
>>> morph = pymorphy2.MorphAnalyzer()
>>> butyavka = morph.parse(u'бутявка')[0]
>>> butyavka.inflect(['gent'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/igor/env/bd1/src/pymorphy2/pymorphy2/analyzer.py", line 27, in inflect
    res = self._morph._inflect(self, required_grammemes)
  File "/Users/igor/env/bd1/src/pymorphy2/pymorphy2/analyzer.py", line 227, in _inflect
    if required_grammemes <= f[1].grammemes]
TypeError: can only compare to a set

Лексемы относительных прилагательных

Примеры лексем:

>>> door = morph.parse(u'дверной')[0]
>>> door
Parse(word='дверной', tag=OpencorporaTag('ADJF masc,sing,nomn'), normal_form='дверной', score=0.16666666666666666, methods_stack=((<DictionaryAnalyzer>, 'дверной', 136, 0),))
>>> door.lexeme
...
Parse(word='подвернее', tag=OpencorporaTag('COMP Cmp2'), normal_form='дверной', score=1.0, methods_stack=((<DictionaryAnalyzer>, 'подвернее', 136, 29),)),
...
>>> wood = morph.parse(u'деревянный')[0]
>>> wood
Parse(word='деревянный', tag=OpencorporaTag('ADJF,Qual masc,sing,nomn'), normal_form='деревянный', score=0.5, methods_stack=((<DictionaryAnalyzer>, 'деревянный', 10, 0),))
>>> wood.lexeme
...
Parse(word='подеревяннее', tag=OpencorporaTag('COMP,Qual Cmp2'), normal_form='деревянный', score=1.0, methods_stack=((<DictionaryAnalyzer>, 'подеревяннее', 10, 33),)),
...
>>> fir = morph.parse(u'ёлочный')[0]
>>> fir
Parse(word='ёлочный', tag=OpencorporaTag('ADJF,Qual masc,sing,nomn'), normal_form='ёлочный', score=0.5, methods_stack=((<DictionaryAnalyzer>, 'ёлочный', 10, 0),))
>>> fir.lexeme
...
Parse(word='поёлочнее', tag=OpencorporaTag('COMP,Qual Cmp2'), normal_form='ёлочный', score=1.0, methods_stack=((<DictionaryAnalyzer>, 'поёлочнее', 10, 33),)),
...

Все слова — фейл. Последние два ещё можно понять, учитывая, что они "качественные". Это фейл OpenCorpora (см. OpenCorpora/opencorpora#129). Хотя вот ёлочный, к примеру, в словаре OpenCorpora не имеет таких форм, как выдаёт pymorphy:

24
ЁЛОЧНЫЙ  ADJF,Qual masc,sing,nomn
ЁЛОЧНОГО    ADJF,Qual masc,sing,gent
ЁЛОЧНОМУ    ADJF,Qual masc,sing,datv
ЁЛОЧНОГО    ADJF,Qual anim,masc,sing,accs
ЁЛОЧНЫЙ  ADJF,Qual inan,masc,sing,accs
ЁЛОЧНЫМ  ADJF,Qual masc,sing,ablt
ЁЛОЧНОМ  ADJF,Qual masc,sing,loct
ЁЛОЧНАЯ  ADJF,Qual femn,sing,nomn
ЁЛОЧНОЙ  ADJF,Qual femn,sing,gent
ЁЛОЧНОЙ  ADJF,Qual femn,sing,datv
ЁЛОЧНУЮ  ADJF,Qual femn,sing,accs
ЁЛОЧНОЙ  ADJF,Qual femn,sing,ablt
ЁЛОЧНОЮ  ADJF,Qual femn,sing,ablt,V-oy
ЁЛОЧНОЙ  ADJF,Qual femn,sing,loct
ЁЛОЧНОЕ  ADJF,Qual neut,sing,nomn
ЁЛОЧНОГО    ADJF,Qual neut,sing,gent
ЁЛОЧНОМУ    ADJF,Qual neut,sing,datv
ЁЛОЧНОЕ  ADJF,Qual neut,sing,accs
ЁЛОЧНЫМ  ADJF,Qual neut,sing,ablt
ЁЛОЧНОМ  ADJF,Qual neut,sing,loct
ЁЛОЧНЫЕ  ADJF,Qual plur,nomn
ЁЛОЧНЫХ  ADJF,Qual plur,gent
ЁЛОЧНЫМ  ADJF,Qual plur,datv
ЁЛОЧНЫХ  ADJF,Qual anim,plur,accs
ЁЛОЧНЫЕ  ADJF,Qual inan,plur,accs
ЁЛОЧНЫМИ    ADJF,Qual plur,ablt
ЁЛОЧНЫХ  ADJF,Qual plur,loct

Или pymorphy не использует эту информацию?

Теги на кириллице

Немного обсуждения тут: #6

Хорошо бы понять, делать их или не делать; если не делать, то выпилить CyrillicOpencorporaTag; если делать - то как именно.

Склонение иностранных городов

Тема со склонением городов вроде уже избитая, но все равно есть вопрос. Как склонять иностранные города?

print morph.parse(u'Пореч')[0].inflect({'loc2'}).word
# поречах (надо Порече)
print morph.parse(u'Колашин')[0].inflect({'loc2'}).word
# колашинах (надо Колашине)
print morph.parse(u'Пльзень')[0].inflect({'loc2'}).word
# пльзне (надо Пльзене)
print morph.parse(u'Лимасол')[0].inflect({'loc2'}).word
# лимасоле (надо Лимасоле)
print morph.parse(u'Сиррка')[0].inflect({'loc2'}).word
# сиррка (надо Сиррке)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.