🎉 Proposal got accepted in v3.0.0rc3. See https://nightly.spacy.io/models/ru for official Russian pretrained models.
SpaCy official Russian model proposal. Work is heavily inspired and based on spacy-ru by @buriy.
Russian model is trained on two resources, both available under MIT license:
- Nerus — part of Natasha project, large silver standard Russian corpus annotated with morphology tags, syntax trees and PER, LOC, ORG NER-tags.
- Navec — also part of Natasha project, pretrained word embeddings for Russian language.
Code in this repo is also available under MIT license.
Resulting model is relatively small due to embeddings table pruning (138MB), works fast on CPU. Shows near SOTA performance on tasks of morphology tagging and syntax parsing, beating heavy DeepPavlov BERT on news and wiki domains. On NER task model shows quality comparable to other top Russian systems, beating DeepPavlov, PullEnti, Stanza. See Naeval morphology, syntax, and NER sections.
Model | Size | SpaCy version |
---|---|---|
ru_core_news_md-2.3.0.tar.gz | 138MB | 2.3.* |
ru_core_news_md-3.0.0.tar.gz | 135MB | 3.0.* |
First download and install the model. SpaCy 2.3.* is required, model won't work with SpaCy 2.1, 2.2.
wget https://storage.yandexcloud.net/natasha-spacy/models/ru_core_news_md-2.3.0.tar.gz
pip install ru_core_news_md-2.3.0.tar.gz
Model for SpaCy 3.0 is also available.
wget https://storage.yandexcloud.net/natasha-spacy/models/ru_core_news_md-3.0.0.tar.gz
pip install ru_core_news_md-3.0.0.tar.gz
Use ipymarkup for NER and syntax visualization.
>>> import spacy
>>> from ipymarkup import show_dep_ascii_markup, show_span_ascii_markup
>>> nlp = spacy.load('ru_core_news_md')
>>> text = 'Посол Израиля на Украине Йоэль Лион признался, что пришел в шок, узнав о решении властей Львовской области объявить 2019 год годом лидера запрещенной в России Организации украинских националистов (ОУН) Степана Бандеры. Свое заявление он разместил в Twitter. «Я не могу понять, как прославление тех, кто непосредственно принимал участие в ужасных антисемитских преступлениях, помогает бороться с антисемитизмом и ксенофобией. Украина не должна забывать о преступлениях, совершенных против украинских евреев, и никоим образом не отмечать их через почитание их исполнителей», — написал дипломат. 11 декабря Львовский областной совет принял решение провозгласить 2019 год в регионе годом Степана Бандеры в связи с празднованием 110-летия со дня рождения лидера ОУН (Бандера родился 1 января 1909 года). В июле аналогичное решение принял Житомирский областной совет. В начале месяца с предложением к президенту страны Петру Порошенко вернуть Бандере звание Героя Украины обратились депутаты Верховной Рады. Парламентарии уверены, что признание Бандеры национальным героем поможет в борьбе с подрывной деятельностью против Украины в информационном поле, а также остановит «распространение мифов, созданных российской пропагандой». Степан Бандера (1909-1959) был одним из лидеров Организации украинских националистов, выступающей за создание независимого государства на территориях с украиноязычным населением. В 2010 году в период президентства Виктора Ющенко Бандера был посмертно признан Героем Украины, однако впоследствии это решение было отменено судом. '
>>> doc = nlp(text)
#######
#
# NER
#
#######
>>> spans = [
... (_.start_char, _.end_char, _.label_)
... for _ in doc.ents
... ]
>>> show_span_ascii_markup(doc.text, spans)
Посол Израиля на Украине Йоэль Лион признался, что пришел в шок, узнав
LOC──── LOC──── PER───────
о решении властей Львовской области объявить 2019 год годом лидера
LOC──────────────
запрещенной в России Организации украинских националистов (ОУН)
LOC─── ORG───────────────────────────────────────
Степана Бандеры. Свое заявление он разместил в Twitter. «Я не могу
PER──────────── ORG────
понять, как прославление тех, кто непосредственно принимал участие в
ужасных антисемитских преступлениях, помогает бороться с
антисемитизмом и ксенофобией. Украина не должна забывать о
LOC────
преступлениях, совершенных против украинских евреев, и никоим образом
не отмечать их через почитание их исполнителей», — написал дипломат.
11 декабря Львовский областной совет принял решение провозгласить 2019
ORG──────────────────────
год в регионе годом Степана Бандеры в связи с празднованием 110-летия
PER────────────
со дня рождения лидера ОУН (Бандера родился 1 января 1909 года). В
ORG PER────
июле аналогичное решение принял Житомирский областной совет. В начале
ORG────────────────────────
месяца с предложением к президенту страны Петру Порошенко вернуть
PER────────────
Бандере звание Героя Украины обратились депутаты Верховной Рады.
PER──── LOC──── ORG───────────
Парламентарии уверены, что признание Бандеры национальным героем
PER────
поможет в борьбе с подрывной деятельностью против Украины в
LOC────
информационном поле, а также остановит «распространение мифов,
созданных российской пропагандой». Степан Бандера (1909-1959) был
PER───────────
одним из лидеров Организации украинских националистов, выступающей за
ORG─────────────────────────────────
создание независимого государства на территориях с украиноязычным
населением. В 2010 году в период президентства Виктора Ющенко Бандера
PER─────────── PER────
был посмертно признан Героем Украины, однако впоследствии это решение
LOC────
было отменено судом.
#######
#
# MORPH
#
#######
>>> sent = next(doc.sents)
>>> for token in sent:
... print(token.text.ljust(10), token.lemma_.ljust(10), token.tag_)
Посол посол NOUN__Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
Израиля израиль PROPN__Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing
на на ADP___
Украине украина PROPN__Animacy=Inan|Case=Loc|Gender=Fem|Number=Sing
Йоэль йоэль PROPN__Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
Лион лион PROPN__Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
признался признаться VERB__Aspect=Perf|Gender=Masc|Mood=Ind|Number=Sing|Tense=Past|VerbForm=Fin|Voice=Mid
, , PUNCT___
что что SCONJ___
пришел прийти VERB__Aspect=Perf|Gender=Masc|Mood=Ind|Number=Sing|Tense=Past|VerbForm=Fin|Voice=Act
в в ADP___
шок шок NOUN__Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing
, , PUNCT___
узнав узнать VERB__Aspect=Perf|Tense=Past|VerbForm=Conv|Voice=Act
о о ADP___
решении решение NOUN__Animacy=Inan|Case=Loc|Gender=Neut|Number=Sing
властей власть NOUN__Animacy=Inan|Case=Gen|Gender=Fem|Number=Plur
Львовской львовский ADJ__Case=Gen|Degree=Pos|Gender=Fem|Number=Sing
области область NOUN__Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing
объявить объявить VERB__Aspect=Perf|VerbForm=Inf|Voice=Act
2019 2019 ADJ___
год год NOUN__Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing
годом год NOUN__Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing
лидера лидер NOUN__Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing
запрещенной запретить VERB__Aspect=Perf|Case=Gen|Gender=Fem|Number=Sing|Tense=Past|VerbForm=Part|Voice=Pass
в в ADP___
России россия PROPN__Animacy=Inan|Case=Loc|Gender=Fem|Number=Sing
Организации организация PROPN__Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing
украинских украинских ADJ__Case=Gen|Degree=Pos|Number=Plur
националистов националист NOUN__Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur
( ( PUNCT___
ОУН оун PROPN__Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing
) ) PUNCT___
Степана степан PROPN__Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing
Бандеры бандеры PROPN__Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing
. . PUNCT___
########
#
# SYNTAX
#
######
>>> words = [_.text for _ in sent]
>>> deps = [
... (_.head.i, _.i, _.dep_)
... for _ in sent
... if _.i != _.head.i
... ]
>>> show_dep_ascii_markup(words, deps)
┌►┌─┌─┌─ Посол nsubj
│ │ │ └► Израиля nmod
│ │ │ ┌► на case
│ │ └►└─ Украине nmod
│ └──►┌─ Йоэль appos
│ └► Лион flat:name
┌───└─┌───── признался
│ │ ┌──► , punct
│ │ │ ┌► что mark
│ ┌─└►└─└─ пришел ccomp
│ │ │ ┌► в case
│ │ └──►└─ шок obl
│ │ ┌► , punct
│ └──►┌─└─ узнав advcl
│ │ ┌► о case
│ ┌───└►└─ решении obl
│ │ ┌─└──► властей nmod
│ │ │ ┌► Львовской amod
│ │ └──►└─ области nmod
│ └►┌─┌─── объявить nmod
│ │ │ ┌► 2019 amod
│ │ └►└─ год obj
│ └──►┌─ годом obl
│ ┌─┌─────└► лидера nmod
│ │ │ ┌►┌─── запрещенной amod
│ │ │ │ │ ┌► в case
│ │ │ │ └►└─ России obl
│ │ └►└─┌─── Организации nmod
│ │ │ ┌► украинских amod
│ │ ┌─└►└─ националистов nmod
│ │ │ ┌► ( punct
│ │ └►┌─└─ ОУН parataxis
│ │ └──► ) punct
│ └──────►┌─ Степана appos
│ └► Бандеры flat:name
└──────────► . punct
Both Nerus and Navec are adapted to fit SpaCy utilities. Training procedure uses only standart spacy convert
, spacy init-model
, spacy train
.
Initialize the environment. We use SpaCy 2.3 for training, Russian language in SpaCy requires PyMorphy for morphology.
pip install spacy==2.3.5 pymorphy2==0.8
mkdir -p data train/data train/base train/model
Download 650MB embeddings table. Navec is precomputed on fiction texts, has 500 000 words in vocabulary.
wget https://storage.yandexcloud.net/natasha-spacy/data/navec.12B.300d.txt.gz -P data
Download 1.5GB training data. We use 10% slice of original Nerus, it contains 100 000 documents, 1 000 000 sentences.
wget https://storage.yandexcloud.net/natasha-spacy/data/nerus-dev.conllu.gz -P data
wget https://storage.yandexcloud.net/natasha-spacy/data/nerus-train.conllu.gz -P data
gunzip data/nerus-*.conllu.gz
WARNING! Conversion requires 32GB of RAM, resulting in JSON that is 4.5GB in size.
# --n-sents explanation: on average there are 10 sentences per document in Nerus
spacy convert --n-sents 10 --morphology data/nerus-train.conllu train/data
spacy convert --n-sents 10 --morphology data/nerus-dev.conllu train/data
Original Navec embeddings have 500 000 words in vocabulary. Pruning to 125 000 words we lose just 0.5 percentage points in accuracy.
spacy init-model ru train/base --vectors-loc data/navec.12B.300d.txt.gz --prune-vectors 125000
Training takes ~2 hours per epoch on CPU (~5 times faster on GPU).
spacy train --base-model train/base --n-iter 10 ru train/model train/data/nerus-train.json train/data/nerus-dev.json
Itn Tag Loss Tag % Dep Loss UAS LAS NER Loss NER P NER R NER F Token % CPU WPS
--- --------- -------- --------- ------ ------ --------- ------ ------ ------ ------- -------
1 1612372.812 96.587 3097137.617 96.141 94.451 293158.500 93.775 94.075 93.925 100.000 4881
2 1141301.281 96.991 2201299.666 96.538 95.057 194409.327 94.119 94.816 94.466 100.000 4743
3 1036780.770 97.188 2005859.872 96.802 95.374 169705.725 94.431 95.051 94.740 100.000 4662
4 979072.228 97.313 1896801.782 96.872 95.548 157141.959 94.716 95.337 95.026 100.000 4622
5 940867.435 97.354 1826734.471 97.006 95.722 147808.848 94.628 95.472 95.048 100.000 4794
6 913604.756 97.414 1772406.880 97.058 95.793 142175.940 94.733 95.371 95.051 100.000 4710
7 891458.779 97.474 1734561.844 97.150 95.882 137502.791 94.628 95.472 95.048 100.000 4813
8 873880.652 97.516 1704919.560 97.171 95.932 134417.454 95.035 95.691 95.362 100.000 4869
9 860200.442 97.532 1681551.213 97.214 95.989 131294.160 95.188 95.556 95.372 100.000 4932
10 848243.402 97.581 1656692.182 97.264 96.035 127838.633 94.981 95.556 95.268 100.000 4395
We use SpaCy projects, training procedure is described in project/project.yml.
Download, uncompress embeddings table and training data.
spacy project assets
spacy project run extract
Convert training data for SpaCy binary format. WARNING! 32 GB of RAM is required.
spacy project run corpus
Convert and prune embeddings table.
spacy project run vectors
~3 hours per epoch on CPU, requires ~24 GB of RAM.
spacy project run train
E # LOSS TOK2VEC LOSS TAGGER LOSS PARSER LOSS NER TAG_ACC DEP_UAS DEP_LAS SENTS_F ENTS_F ENTS_P ENTS_R SCORE
--- ------ ------------ ----------- ----------- -------- ------- ------- ------- ------- ------ ------ ------ ------
0 0 0.00 198.77 325.44 95.21 14.05 20.94 6.86 0.00 0.54 4.42 0.29 0.10
0 10000 1176499.70 694829.12 1066434.84 124868.43 94.87 94.41 92.26 99.62 90.03 89.68 90.39 0.93
0 20000 2768135.49 710927.47 1157628.86 133416.70 95.90 95.36 93.50 99.71 92.12 91.54 92.71 0.94
1 30000 4134293.51 609565.16 1005064.56 116021.79 96.34 95.80 94.18 99.71 92.54 91.18 93.94 0.95
1 40000 5612606.23 570474.00 943323.94 108390.26 96.55 95.79 94.19 99.77 92.98 92.75 93.22 0.95
2 50000 7069821.13 536273.18 895354.35 102616.23 96.68 95.94 94.42 99.71 93.06 92.50 93.62 0.95
2 60000 8420589.99 521484.19 868375.86 100185.40 96.75 96.08 94.56 99.78 93.31 92.91 93.72 0.95
3 70000 9584882.66 503431.96 841835.52 97766.84 96.82 96.14 94.70 99.81 93.81 93.25 94.38 0.95
3 80000 10693665.22 497292.09 831536.94 96698.17 96.85 96.22 94.81 99.83 93.56 93.55 93.57 0.95
4 90000 11533142.84 484925.86 808917.28 93526.94 96.95 96.32 94.87 99.75 93.58 93.76 93.40 0.95
4 100000 12442474.92 482277.28 804398.14 93961.81 96.93 96.31 94.87 99.78 93.53 93.37 93.69 0.95
5 110000 13037916.06 471829.23 788692.77 91600.88 96.96 96.30 94.87 99.78 93.67 93.32 94.02 0.95
5 120000 13616621.93 470462.12 785364.54 91812.84 97.02 96.28 94.93 99.72 93.43 92.67 94.21 0.95
6 130000 14109942.25 464641.05 776902.13 90060.62 96.97 96.27 94.91 99.56 93.99 93.30 94.70 0.96
6 140000 14587665.69 465145.74 777173.79 90970.47 97.09 96.52 95.15 99.74 93.81 93.18 94.45 0.96
Update meta.json
with description, authors, sources. On model name core_news_md
:
core
— provides all three components: tagger, parser and ner;news
— trained on Nerus that is large automatically annotated news corpus;md
— in SpaCy small models are 10-50MB in size,md
- 50-200MB,lg
- 200-600MB, out model is ~140MB.
{
...
"name": "core_news_md",
"lang": "ru",
"version": "2.3.0",
"spacy_version": ">=2.3.0,<2.4.0",
"description": "Russian multitask CNN initialized with Navec embeddings trained on Nerus dataset. Assigns context-specific token vectors, POS tags, dependency parse and named entities.",
"author": "Yuri Baburov, Alexander Kukushkin",
"email": "[email protected], [email protected]",
"url": "https://github.com/natasha/natasha-spacy",
"license": "MIT",
"sources": [
{
"name": "Nerus",
"url": "https://github.com/natasha/nerus"
},
{
"name": "Navec",
"url": "https://github.com/natasha/navec"
}
]
}
Use spacy package
and python sdist
to produce tar.gz archive.
mkdir package
spacy package train/model package
(cd package/* && python setup.py sdist)
mv package/*/dist/*.tar.gz .
rm -r package
Change versions, rest is the same as in v2.
{
...
"version": "3.0.0",
"spacy_version":">=3.0.0rc2,<3.1.0",
...
}
Use SpaCy projects to build package, config is in project/project.yml.
spacy project run package
- 2020-12-24 SpaCy discussion #6628 "Russian model proposal"
- 2021-01-08 Support SpaCy v3
- 2021-01-19 Proposal accepted in v3.0.0rc3