Package: slovnet
SlovNet is a Python library for deep-learning based NLP modeling for Russian language. Library is integrated with otherNatashaprojects:Nerus— large automatically annotated corpus,Razdel— sentence segmenter, tokenizer andNavec— compact Russian embeddings. Slovnet provides high quality practical models for Russian NER, morphology and syntax, seeevaluation sectionfor more:NER is 1-2% worse than current BERT SOTA by DeepPavlov but 60 times smaller in size (~30 MB) and works fast on CPU (~25 news articles/sec).Morphology tagger and syntax parser have comparable accuracy on news dataset with large SOTA BERT models, take 50 times less space (~30 MB), work faster on CPU (~500 sentences/sec).DownloadsModelSizeDescriptionslovnet_ner_news_v1.tar2MBRussian NER, standart PER, LOC, ORG annotation, trained on news articles.slovnet_morph_news_v1.tar2MBRussian morphology tagger optimized for news articles.slovnet_syntax_news_v1.tar3MBRussian syntax parser optimized for news articles.InstallDuring inference Slovnet depends only on Numpy. Library supports Python 3.5+, PyPy 3.$pipinstallslovnetUsageDownload model weights and vocabs package, use links fromdownloads sectionandNavec download section. Optionally installIpymarkupto visualize NER markup.Slovnet annotatormapmethod has list of items as input and same size iterator over markups as output. Internally items are processed in batches of sizebatch_size. Default size is 8, larger batch — more RAM, better CPU utilization.__call__method just callsmapwith a list of 1 item.NER>>>fromnavecimportNavec>>>fromslovnetimportNER>>>fromipymarkupimportshow_span_ascii_markupasshow_markup>>>text='Европейский союз добавил в санкционный список девять политических деятелей из самопровозглашенных республик Донбасса — Донецкой народной республики (ДНР) и Луганской народной республики (ЛНР) — в связи с прошедшими там выборами. Об этом говорится в документе, опубликованном в официальном журнале Евросоюза. В новом списке фигурирует Леонид Пасечник, который по итогам выборов стал главой ЛНР. Помимо него там присутствуют Владимир Бидевка и Денис Мирошниченко, председатели законодательных органов ДНР и ЛНР, а также Ольга Позднякова и Елена Кравченко, председатели ЦИК обеих республик. Выборы прошли в непризнанных республиках Донбасса 11 ноября. На них удержали лидерство действующие руководители и партии — Денис Пушилин и «Донецкая республика» в ДНР и Леонид Пасечник с движением «Мир Луганщине» в ЛНР. Президент Франции Эмманюэль Макрон и канцлер ФРГ Ангела Меркель после встречи с украинским лидером Петром Порошенко осудили проведение выборов, заявив, что они нелегитимны и «подрывают территориальную целостность и суверенитет Украины». Позже к осуждению присоединились США с обещаниями новых санкций для России.'>>>navec=Navec.load('navec_news_v1_1B_250K_300d_100q.tar')>>>ner=NER.load('slovnet_ner_news_v1.tar')>>>ner.navec(navec)>>>markup=ner(text)>>>show_markup(markup.text,markup.spans)ЕвропейскийсоюздобавилвсанкционныйсписокдевятьполитическихLOC─────────────деятелейизсамопровозглашенныхреспубликДонбасса—ДонецкойнароднойLOC─────LOC──────────────республики(ДНР)иЛуганскойнароднойреспублики(ЛНР)—всвязис─────────────────LOC────────────────────────────────прошедшимитамвыборами.Обэтомговоритсявдокументе,опубликованномвофициальномжурналеЕвросоюза.ВновомспискефигурируетЛеонидLOC──────PER────Пасечник,которыйпоитогамвыборовсталглавойЛНР.Помимонеготам────────LOCприсутствуютВладимирБидевкаиДенисМирошниченко,председателиPER─────────────PER───────────────законодательныхоргановДНРиЛНР,атакжеОльгаПоздняковаиЕленаLOCLOCPER─────────────PER───Кравченко,председателиЦИКобеихреспублик.Выборыпрошлив─────────ORGнепризнанныхреспубликахДонбасса11ноября.НанихудержалилидерствоLOC─────действующиеруководителиипартии—ДенисПушилини«ДонецкаяPER──────────ORG──────республика»вДНРиЛеонидПасечниксдвижением«МирЛуганщине»вЛНР.──────────LOCPER────────────ORG──────────LOCПрезидентФранцииЭмманюэльМакрониканцлерФРГАнгелаМеркельпослеLOC────PER─────────────LOCPER───────────встречисукраинскимлидеромПетромПорошенкоосудилипроведениеPER─────────────выборов,заявив,чтоонинелегитимныи«подрываюттерриториальнуюцелостностьисуверенитетУкраины».ПозжекосуждениюприсоединилисьLOC────СШАсобещанияминовыхсанкцийдляРоссии.LOCLOC───MorphologyMorphology annotator processes tokenized text. To split the input into sentencies and tokens useRazdel.>>>fromrazdelimportsentenize,tokenize>>>fromnavecimportNavec>>>fromslovnetimportMorph>>>chunk=[]>>>forsentinsentenize(text):>>>tokens=[_.textfor_intokenize(sent.text)]>>>chunk.append(tokens)>>>chunk[:1][['Европейский','союз','добавил','в','санкционный','список','девять','политических','деятелей','из','самопровозглашенных','республик','Донбасса','—','Донецкой','народной','республики','(','ДНР',')','и','Луганской','народной','республики','(','ЛНР',')','—','в','связи','с','прошедшими','там','выборами','.']]>>>navec=Navec.load('navec_news_v1_1B_250K_300d_100q.tar')>>>morph=Morph.load('slovnet_morph_news_v1.tar',batch_size=4)>>>morph.navec(navec)>>>markup=next(morph.map(chunk))>>>fortokeninmarkup.tokens:>>>print(f'{token.text:>20}{token.tag}')ЕвропейскийADJ|Case=Nom|Degree=Pos|Gender=Masc|Number=SingсоюзNOUN|Animacy=Inan|Case=Nom|Gender=Masc|Number=SingдобавилVERB|Aspect=Perf|Gender=Masc|Mood=Ind|Number=Sing|Tense=Past|VerbForm=Fin|Voice=ActвADPсанкционныйADJ|Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=SingсписокNOUN|Animacy=Inan|Case=Acc|Gender=Masc|Number=SingдевятьNUM|Case=NomполитическихADJ|Case=Gen|Degree=Pos|Number=PlurдеятелейNOUN|Animacy=Anim|Case=Gen|Gender=Masc|Number=PlurизADPсамопровозглашенныхADJ|Case=Gen|Degree=Pos|Number=PlurреспубликNOUN|Animacy=Inan|Case=Gen|Gender=Fem|Number=PlurДонбассаPROPN|Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing—PUNCTДонецкойADJ|Case=Gen|Degree=Pos|Gender=Fem|Number=SingнароднойADJ|Case=Gen|Degree=Pos|Gender=Fem|Number=SingреспубликиNOUN|Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing(PUNCTДНРPROPN|Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing)PUNCTиCCONJЛуганскойADJ|Case=Gen|Degree=Pos|Gender=Fem|Number=SingнароднойADJ|Case=Gen|Degree=Pos|Gender=Fem|Number=SingреспубликиNOUN|Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing(PUNCTЛНРPROPN|Animacy=Inan|Case=Gen|Gender=Fem|Number=Sing)PUNCT—PUNCTвADPсвязиNOUN|Animacy=Inan|Case=Loc|Gender=Fem|Number=SingсADPпрошедшимиVERB|Aspect=Perf|Case=Ins|Number=Plur|Tense=Past|VerbForm=Part|Voice=ActтамADV|Degree=PosвыборамиNOUN|Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur.PUNCTSyntaxSyntax parser processes sentencies split into tokens. UseRazdelfor segmentation.>>>fromipymarkupimportshow_dep_ascii_markupasshow_markup>>>fromrazdelimportsentenize,tokenize>>>fromnavecimportNavec>>>fromslovnetimportSyntax>>>chunk=[]>>>forsentinsentenize(text):>>>tokens=[_.textfor_intokenize(sent.text)]>>>chunk.append(tokens)>>>chunk[:1][['Европейский','союз','добавил','в','санкционный','список','девять','политических','деятелей','из','самопровозглашенных','республик','Донбасса','—','Донецкой','народной','республики','(','ДНР',')','и','Луганской','народной','республики','(','ЛНР',')','—','в','связи','с','прошедшими','там','выборами','.']]>>>navec=Navec.load('navec_news_v1_1B_250K_300d_100q.tar')>>>syntax=Syntax.load('slovnet_syntax_news_v1.tar')>>>syntax.navec(navec)>>>markup=next(syntax.map(chunk))# Convert CoNLL-style format to source, target indices>>>words,deps=[],[]>>>fortokeninmarkup.tokens:>>>words.append(token.text)>>>source=int(token.head_id)-1>>>target=int(token.id)-1>>>ifsource>0andsource!=target:# skip root, loops>>>deps.append([source,target,token.rel])>>>show_markup(words,deps)┌►Европейскийamod┌►└─союзnsubj┌───────┌─┌─└───добавил│││┌──►вcase││││┌►санкционныйamod││└►└─└─списокobl││┌──►девятьnummod:gov│││┌►политическихamod│┌─────└►┌─└─└─деятелейobj│││┌──►изcase││││┌►самопровозглашенныхamod││└►└─└─республикnmod││└──►Донбассаnmod││┌──────────►—punct│││┌──►Донецкойamod││││┌►народнойamod│││┌─┌─┌─└─└─республики││││││┌►(punct│││││└►┌─└─ДНРparataxis│││││└──►)punct│││││┌────►иcc││││││┌──►Луганскойamod│││││││┌►народнойamod││└─│└►└─└─└─республикиconj│││┌►(punct││└────►┌─└─ЛНРparataxis││└──►)punct││┌──────►—punct│││┌►┌─┌─вcase│││││└►связиfixed││││└──►сfixed││││┌►┌─прошедшимиacl│││││└►тамadvmod│└────►└─└─└───выборамиnmod└──────────────►.punctDocumentationMaterials are in Russian:Article about distillation and quantization in SlovnetSlovnet section of Datafest 2020 talkEvaluationIn addition to quality metrics we measure speed and models size, parameters that are important in production:init— time between system launch and first response. It is convenient for testing and devops to have model that starts quickly.disk— file size of artefacts one needs to download before using the system: model weights, embeddings, binaries, vocabs. It is convenient to deploy compact models in production.ram— average CPU/GPU RAM usage.speed— number of input items processed per second: news articles, tokenized sentencies.NER4 datasets are used for evaluation:factru,gareev,ne5andbsnlp. Slovnet is compared todeeppavlov,deeppavlov_bert,deeppavlov_slavic,pullenti,spacy,stanza,texterra,tomita,mitie.For every column top 3 results are highlighted:factrugareevne5bsnlpf1PERLOCORGPERORGPERLOCORGPERLOCORGslovnet0.9590.9150.8250.9770.8990.9840.9730.9510.9440.8340.718slovnet_bert0.9730.9280.8310.9910.9110.9960.9890.9760.9600.8380.733deeppavlov0.9100.8860.7420.9440.7980.9420.9190.8810.8660.7670.624deeppavlov_bert0.9710.9280.8250.9800.9160.9970.9900.9760.9540.8400.741deeppavlov_slavic0.9560.8840.7140.9760.7760.9840.8170.7610.9650.9250.831pullenti0.9050.8140.6860.9390.6390.9520.8620.6830.9000.7690.566spacy0.9010.8860.7650.9700.8830.9670.9280.9180.9190.8230.693stanza0.9430.8650.6870.9530.8270.9230.7530.7340.9380.8380.724texterra0.9000.8000.5970.8880.5610.9010.7770.5940.8580.7830.548tomita0.9290.9210.9450.881mitie0.8880.8610.5320.8490.4520.7530.6420.4320.7360.8010.524it/s— news articles per second, 1 article ≈ 1KB.init, sdisk, mbram, mbspeed, it/sslovnet1.02720525.3slovnet_bert5.0473950040.0 (gpu)deeppavlov5.91024307224.3 (gpu)deeppavlov_bert34.52048614413.1 (gpu)deeppavlov_slavic35.0204840968.0 (gpu)pullenti2.9162536.0spacy8.01406258.0stanza3.0591112643.0 (gpu)texterra47.619333794.0tomita2.0646329.8mitie28.332726132.8MorphologyDatasets from GramEval2020are used for evaluation:news— sample from Lenta.ru.wiki— UD GSD.fiction— SynTagRus + JZ.social,poetry— social, poetry subset of Taiga.Slovnet is compated to a number of existing morphology taggers:deeppavlov,deeppavlov_bert,rupostagger,rnnmorph,maru,udpipe,spacy,stanza.For every column top 3 results are highlighted.slovnetwas trained only on news dataset:newswikifictionsocialpoetryslovnet0.9610.8150.9050.8070.664slovnet_bert0.9820.8840.9900.8900.856deeppavlov0.9400.8410.9440.8700.857deeppavlov_bert0.9510.8680.9640.8920.865udpipe0.9180.8110.9570.8700.776spacy0.9640.8490.9420.8570.784stanza0.9340.8310.9400.8730.825rnnmorph0.8960.8120.8900.8600.838maru0.8940.8080.8870.8610.840rupostagger0.6730.6450.6610.6410.636it/s— sentences per second.init, sdisk, mbram, mbspeed, it/sslovnet1.027115532.0slovnet_bert5.04758087285.0 (gpu)deeppavlov4.0321024090.0 (gpu)deeppavlov_bert20.01393870485.0 (gpu)udpipe6.94524256.2spacy8.014057950.0stanza2.059139392.0rnnmorph8.71028916.6maru15.84437036.4rupostagger4.8311848.0SyntaxSlovnet is compated to several existing syntax parsers:udpipe,spacy,deeppavlov,stanza.newswikifictionsocialpoetryuaslasuaslasuaslasuaslasuaslasslovnet0.9070.8800.7750.7180.8060.7760.7260.6560.5420.469slovnet_bert0.9650.9360.8910.8280.9580.9400.8460.7820.7760.706deeppavlov_bert0.9620.9100.8820.7860.9630.9290.8440.7610.7840.691udpipe0.8730.8230.6220.5310.9100.8760.7000.6240.6250.534spacy0.9430.9160.8510.7830.9010.8740.8040.7370.7040.616stanza0.9400.8860.8150.7160.9360.8950.8020.7140.7130.613it/s— sentences per second.init, sdisk, mbram, mbspeed, it/sslovnet1.027125450.0slovnet_bert5.05043427200.0 (gpu)deeppavlov_bert34.01427870475.0 (gpu)udpipe6.94524256.2spacy9.014057941.0stanza3.059189012.0SupportChat —https://telegram.me/natural_language_processingIssues —https://github.com/natasha/slovnet/issuesCommercial support —https://lab.alexkuk.ruDevelopmentDev envpython-mvenv~/.venvs/natasha-slovnetsource~/.venvs/natasha-slovnet/bin/activate

pipinstall-rrequirements/dev.txt
pipinstall-e.TestmaketestRent GPUyccomputeinstancecreate\--namegpu\--zoneru-central1-a\--network-interfacesubnet-name=default,nat-ip-version=ipv4\--create-boot-diskimage-folder-id=standard-images,image-family=ubuntu-1804-lts-ngc,type=network-ssd,size=20\--cores=8\--memory=96\--gpus=1\--ssh-key~/.ssh/id_rsa.pub\--folder-namedefault\--platform-idgpu-standard-v1\--preemptible

yccomputeinstancedelete--namegpuSetup instancesudo locale-gen ru_RU.UTF-8

sudo apt-get update
sudo apt-get install -y \
  python3-pip

# grpcio long install ~10m, not using prebuilt wheel
# "it is not compatible with this Python" 
sudo pip3 install -v \
  jupyter \
  tensorboard

mkdir runs
nohup tensorboard \
  --logdir=runs \
  --host=localhost \
  --port=6006 \
  --reload_interval=1 &

nohup jupyter notebook \
  --no-browser \
  --allow-root \
  --ip=localhost \
  --port=8888 \
  --NotebookApp.token='' \
  --NotebookApp.password='' &

ssh -Nf gpu -L 8888:localhost:8888 -L 6006:localhost:6006

scp ~/.slovnet.json gpu:~
rsync --exclude data -rv . gpu:~/slovnet
rsync -u --exclude data -rv 'gpu:~/slovnet/*' .Intall devpip3install-rslovnet/requirements/dev.txt-rslovnet/requirements/gpu.txt
pip3install-eslovnetRelease# Update setup.py versiongitcommit-am'Up version'gittagv0.6.0

gitpush
gitpush--tags# Github Action builds dist and publishes to PyPi