Перейти к содержанию

spaCy

Компонент rumorph подключает ruMorph к конвейеру spaCy: размечает токены документа частью речи (pos_), признаками Universal Dependencies (morph) и леммой (lemma_) по разбору с контекстом. В конвейере он заменяет теггер, морфологизатор и лемматизатор.

pip install "rumorph[spacy]"

Компонент регистрируется в spaCy при установке пакета и подключается по имени, импортировать rumorph не нужно. Для Python 3.14t без GIL у spaCy нет готовых колес.

import spacy

nlp = spacy.blank("ru")
nlp.add_pipe("rumorph")
doc = nlp("Мост сделан из стали.")
[(token.lemma_, token.pos_) for token in doc]
str(doc[3].morph)
[('мост', 'NOUN'), ('сделать', 'VERB'), ('из', 'ADP'), ('сталь', 'NOUN'), ('.', 'PUNCT')]
'Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing'

Модели ru_core_news

В моделях ru_core_news_* компонент заменяет морфологизатор и лемматизатор, а парсер и распознавание именованных сущностей остаются. Компонент после парсера берет его границы предложений, а attribute_ruler модели переносит часть речи в tag_.

nlp = spacy.load("ru_core_news_sm", exclude=["morphologizer", "lemmatizer"])
nlp.add_pipe("rumorph", after="parser")
nlp.pipe_names
['tok2vec', 'parser', 'rumorph', 'attribute_ruler', 'ner']

Доля слов с верными частью речи, леммой и признаками UD на тестовых частях трибанков (Сравнение) и скорость конвейера, токенов в секунду:

Конвейер SynTagRus Taiga GSD Скорость
ru_core_news_sm 82,0 75,5 74,8 5 628
ru_core_news_sm с rumorph 93,7 90,2 81,6 8 842

Предложения

Контекстная модель разбирает предложение целиком. Предложения компонент берет из разметки документа - парсера, senter или sentencizer, а если ее нет, делит документ после знаков конца предложения («.», «!», «?», «…»); предложение длиннее 256 токенов разбирается частями, как в команде rumorph. Пробельные токены получают часть речи SPACE, как в моделях spaCy, а лемма у них - сам токен; токен без разбора ruMorph (невидимые символы) - X и лемму в нижнем регистре, как в команде rumorph.

Параметры

Параметр Тип По умолчанию Описание
dictionary str None Путь к файлу словаря; по умолчанию - словарь из пакета
words dict None Свои слова и их образцы; образец с частью речи - кортеж или список
context bool True Выбирать разбор по соседним словам; False - самый вероятный разбор словоформы, как у analyze
nlp = spacy.blank("ru")
nlp.add_pipe("rumorph", config={"words": {"зумер": "геймер"}})
[token.lemma_ for token in nlp("Зумерам нравится")]
['зумер', 'нравиться']

Разбор ruMorph

token._.rumorph - разбор ruMorph с леммой, частью речи и признаками токена по словарю и своим словам компонента, разметившего документ: через него доступны формы слова. Вероятность у него - без учета контекста. Если у словоформы нет такого разбора - например, разметку токена изменил другой компонент, - значение - None. Свои словарь и слова компонента документ хранит в user_data, поэтому их сохраняют DocBin(store_user_data=True) и span.as_doc(copy_user_data=True), а Doc.from_docs не переносит.

doc = nlp("Мы стали друзьями")
analysis = doc[2]._.rumorph
analysis.lemma, analysis.inflect(Case="Dat")
('друг', 'друзьям')