Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

slovnet

Package Overview
Dependencies
Maintainers
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

slovnet

Deep-learning based NLP modeling for Russian language

  • 0.6.0
  • PyPI
  • Socket score

Maintainers
1

CI

SlovNet is a Python library for deep-learning based NLP modeling for Russian language. Library is integrated with other Natasha projects: Nerus — large automatically annotated corpus, Razdel — sentence segmenter, tokenizer and Navec — compact Russian embeddings. Slovnet provides high quality practical models for Russian NER, morphology and syntax, see evaluation section for 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).

Downloads

ModelSizeDescription
slovnet_ner_news_v1.tar 2MB Russian NER, standart PER, LOC, ORG annotation, trained on news articles.
slovnet_morph_news_v1.tar 2MB Russian morphology tagger optimized for news articles.
slovnet_syntax_news_v1.tar 3MB Russian syntax parser optimized for news articles.

Install

During inference Slovnet depends only on Numpy. Library supports Python 3.5+, PyPy 3.

$ pip install slovnet

Usage

Download model weights and vocabs package, use links from downloads section and Navec download section. Optionally install Ipymarkup to visualize NER markup.

Slovnet annotator map method has list of items as input and same size iterator over markups as output. Internally items are processed in batches of size batch_size. Default size is 8, larger batch — more RAM, better CPU utilization. __call__ method just calls map with a list of 1 item.

NER

>>> from navec import Navec
>>> from slovnet import NER
>>> from ipymarkup import show_span_ascii_markup as show_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───────────────               
законодательных органов ДНР и ЛНР, а также Ольга Позднякова и Елена 
                        LOC   LOC          PER─────────────   PER───
Кравченко, председатели ЦИК обеих республик. Выборы прошли в 
─────────               ORG                                  
непризнанных республиках Донбасса 11 ноября. На них удержали лидерство
                         LOC─────                                     
 действующие руководители и партии — Денис Пушилин и «Донецкая 
                                     PER──────────    ORG──────
республика» в ДНР и Леонид Пасечник с движением «Мир Луганщине» в ЛНР.
──────────    LOC   PER────────────              ORG──────────    LOC 
 Президент Франции Эмманюэль Макрон и канцлер ФРГ Ангела Меркель после
           LOC──── PER─────────────           LOC PER───────────      
 встречи с украинским лидером Петром Порошенко осудили проведение 
                              PER─────────────                    
выборов, заявив, что они нелегитимны и «подрывают территориальную 
целостность и суверенитет Украины». Позже к осуждению присоединились 
                          LOC────                                    
США с обещаниями новых санкций для России.
LOC                                LOC─── 

Morphology

Morphology annotator processes tokenized text. To split the input into sentencies and tokens use Razdel.

>>> from razdel import sentenize, tokenize
>>> from navec import Navec
>>> from slovnet import Morph

>>> chunk = []
>>> for sent in sentenize(text):
>>>     tokens = [_.text for _ in tokenize(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))
>>> for token in markup.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
                   . PUNCT

Syntax

Syntax parser processes sentencies split into tokens. Use Razdel for segmentation.

>>> from ipymarkup import show_dep_ascii_markup as show_markup
>>> from razdel import sentenize, tokenize
>>> from navec import Navec
>>> from slovnet import Syntax

>>> chunk = []
>>> for sent in sentenize(text):
>>>     tokens = [_.text for _ in tokenize(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 = [], []
>>> for token in markup.tokens:
>>>     words.append(token.text)
>>>     source = int(token.head_id) - 1
>>>     target = int(token.id) - 1
>>>     if source > 0 and source != 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
└──────────────► .                   punct

Documentation

Materials are in Russian:

Evaluation

In 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.

NER

4 datasets are used for evaluation: factru, gareev, ne5 and bsnlp. Slovnet is compared to deeppavlov, deeppavlov_bert, deeppavlov_slavic, pullenti, spacy, stanza, texterra, tomita, mitie.

For every column top 3 results are highlighted:

factrugareevne5bsnlp
f1PERLOCORGPERORGPERLOCORGPERLOCORG
slovnet0.9590.9150.8250.9770.8990.9840.9730.9510.9440.8340.718
slovnet_bert0.9730.9280.8310.9910.9110.9960.9890.9760.9600.8380.733
deeppavlov0.9100.8860.7420.9440.7980.9420.9190.8810.8660.7670.624
deeppavlov_bert0.9710.9280.8250.9800.9160.9970.9900.9760.9540.8400.741
deeppavlov_slavic0.9560.8840.7140.9760.7760.9840.8170.7610.9650.9250.831
pullenti0.9050.8140.6860.9390.6390.9520.8620.6830.9000.7690.566
spacy0.9010.8860.7650.9700.8830.9670.9280.9180.9190.8230.693
stanza0.9430.8650.6870.9530.8270.9230.7530.7340.9380.8380.724
texterra0.9000.8000.5970.8880.5610.9010.7770.5940.8580.7830.548
tomita0.9290.9210.9450.881
mitie0.8880.8610.5320.8490.4520.7530.6420.4320.7360.8010.524

it/s — news articles per second, 1 article ≈ 1KB.

init, sdisk, mbram, mbspeed, it/s
slovnet1.02720525.3
slovnet_bert5.0473950040.0 (gpu)
deeppavlov5.91024307224.3 (gpu)
deeppavlov_bert34.52048614413.1 (gpu)
deeppavlov_slavic35.0204840968.0 (gpu)
pullenti2.9162536.0
spacy8.01406258.0
stanza3.0591112643.0 (gpu)
texterra47.619333794.0
tomita2.0646329.8
mitie28.332726132.8

Morphology

Datasets from GramEval2020 are 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. slovnet was trained only on news dataset:

newswikifictionsocialpoetry
slovnet0.9610.8150.9050.8070.664
slovnet_bert0.9820.8840.9900.8900.856
deeppavlov0.9400.8410.9440.8700.857
deeppavlov_bert0.9510.8680.9640.8920.865
udpipe0.9180.8110.9570.8700.776
spacy0.9640.8490.9420.8570.784
stanza0.9340.8310.9400.8730.825
rnnmorph0.8960.8120.8900.8600.838
maru0.8940.8080.8870.8610.840
rupostagger0.6730.6450.6610.6410.636

it/s — sentences per second.

init, sdisk, mbram, mbspeed, it/s
slovnet1.027115532.0
slovnet_bert5.04758087285.0 (gpu)
deeppavlov4.0321024090.0 (gpu)
deeppavlov_bert20.01393870485.0 (gpu)
udpipe6.94524256.2
spacy8.014057950.0
stanza2.059139392.0
rnnmorph8.71028916.6
maru15.84437036.4
rupostagger4.8311848.0

Syntax

Slovnet is compated to several existing syntax parsers: udpipe, spacy, deeppavlov, stanza.

newswikifictionsocialpoetry
uaslasuaslasuaslasuaslasuaslas
slovnet0.9070.8800.7750.7180.8060.7760.7260.6560.5420.469
slovnet_bert0.9650.9360.8910.8280.9580.9400.8460.7820.7760.706
deeppavlov_bert0.9620.9100.8820.7860.9630.9290.8440.7610.7840.691
udpipe0.8730.8230.6220.5310.9100.8760.7000.6240.6250.534
spacy0.9430.9160.8510.7830.9010.8740.8040.7370.7040.616
stanza0.9400.8860.8150.7160.9360.8950.8020.7140.7130.613

it/s — sentences per second.

init, sdisk, mbram, mbspeed, it/s
slovnet1.027125450.0
slovnet_bert5.05043427200.0 (gpu)
deeppavlov_bert34.01427870475.0 (gpu)
udpipe6.94524256.2
spacy9.014057941.0
stanza3.059189012.0

Support

Development

Dev env

python -m venv ~/.venvs/natasha-slovnet
source ~/.venvs/natasha-slovnet/bin/activate

pip install -r requirements/dev.txt
pip install -e .

Test

make test

Rent GPU

yc compute instance create \
  --name gpu \
  --zone ru-central1-a \
  --network-interface subnet-name=default,nat-ip-version=ipv4 \
  --create-boot-disk image-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-name default \
  --platform-id gpu-standard-v1 \
  --preemptible

yc compute instance delete --name gpu

Setup instance

sudo 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 dev

pip3 install -r slovnet/requirements/dev.txt -r slovnet/requirements/gpu.txt
pip3 install -e slovnet

Release

# Update setup.py version

git commit -am 'Up version'
git tag v0.6.0

git push
git push --tags

# Github Action builds dist and publishes to PyPi

Keywords

FAQs


Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc