From 4c4a0c4b39b55886bc48b3548a279a988d9387b8 Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Wed, 10 May 2023 07:48:35 +0000 Subject: automatic import of python-slovnet --- .gitignore | 1 + python-slovnet.spec | 3129 +++++++++++++++++++++++++++++++++++++++++++++++++++ sources | 1 + 3 files changed, 3131 insertions(+) create mode 100644 python-slovnet.spec create mode 100644 sources diff --git a/.gitignore b/.gitignore index e69de29..2ea4263 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +/slovnet-0.6.0.tar.gz diff --git a/python-slovnet.spec b/python-slovnet.spec new file mode 100644 index 0000000..803a668 --- /dev/null +++ b/python-slovnet.spec @@ -0,0 +1,3129 @@ +%global _empty_manifest_terminate_build 0 +Name: python-slovnet +Version: 0.6.0 +Release: 1 +Summary: Deep-learning based NLP modeling for Russian language +License: MIT +URL: https://github.com/natasha/slovnet +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/3e/d1/bba34dec46f1fcb85ca35815268be427ee89d09728c85ae4ab294dd9db09/slovnet-0.6.0.tar.gz +BuildArch: noarch + +Requires: python3-numpy +Requires: python3-razdel +Requires: python3-navec + +%description + + + +![CI](https://github.com/natasha/slovnet/actions/workflows/test.yml/badge.svg) + +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. + +```bash +$ 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 + +```python +>>> 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. + +```python +>>> 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. + +```python +>>> 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: + +* Article about distillation and quantization in Slovnet +* Slovnet section of Datafest 2020 talk + +## 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 + +- Chat — https://telegram.me/natural_language_processing +- Issues — https://github.com/natasha/slovnet/issues +- Commercial support — https://lab.alexkuk.ru + +## Development + +Dev env + +```bash +python -m venv ~/.venvs/natasha-slovnet +source ~/.venvs/natasha-slovnet/bin/activate + +pip install -r requirements/dev.txt +pip install -e . +``` + +Test + +```bash +make test +``` + +Rent GPU + +```bash +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 + +```bash +pip3 install -r slovnet/requirements/dev.txt -r slovnet/requirements/gpu.txt +pip3 install -e slovnet +``` + +Release + +```bash +# 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 +``` + + +%package -n python3-slovnet +Summary: Deep-learning based NLP modeling for Russian language +Provides: python-slovnet +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-slovnet + + + +![CI](https://github.com/natasha/slovnet/actions/workflows/test.yml/badge.svg) + +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. + +```bash +$ 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 + +```python +>>> 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. + +```python +>>> 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. + +```python +>>> 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: + +* Article about distillation and quantization in Slovnet +* Slovnet section of Datafest 2020 talk + +## 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 + +- Chat — https://telegram.me/natural_language_processing +- Issues — https://github.com/natasha/slovnet/issues +- Commercial support — https://lab.alexkuk.ru + +## Development + +Dev env + +```bash +python -m venv ~/.venvs/natasha-slovnet +source ~/.venvs/natasha-slovnet/bin/activate + +pip install -r requirements/dev.txt +pip install -e . +``` + +Test + +```bash +make test +``` + +Rent GPU + +```bash +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 + +```bash +pip3 install -r slovnet/requirements/dev.txt -r slovnet/requirements/gpu.txt +pip3 install -e slovnet +``` + +Release + +```bash +# 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 +``` + + +%package help +Summary: Development documents and examples for slovnet +Provides: python3-slovnet-doc +%description help + + + +![CI](https://github.com/natasha/slovnet/actions/workflows/test.yml/badge.svg) + +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. + +```bash +$ 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 + +```python +>>> 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. + +```python +>>> 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. + +```python +>>> 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: + +* Article about distillation and quantization in Slovnet +* Slovnet section of Datafest 2020 talk + +## 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 + +- Chat — https://telegram.me/natural_language_processing +- Issues — https://github.com/natasha/slovnet/issues +- Commercial support — https://lab.alexkuk.ru + +## Development + +Dev env + +```bash +python -m venv ~/.venvs/natasha-slovnet +source ~/.venvs/natasha-slovnet/bin/activate + +pip install -r requirements/dev.txt +pip install -e . +``` + +Test + +```bash +make test +``` + +Rent GPU + +```bash +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 + +```bash +pip3 install -r slovnet/requirements/dev.txt -r slovnet/requirements/gpu.txt +pip3 install -e slovnet +``` + +Release + +```bash +# 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 +``` + + +%prep +%autosetup -n slovnet-0.6.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-slovnet -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 10 2023 Python_Bot - 0.6.0-1 +- Package Spec generated diff --git a/sources b/sources new file mode 100644 index 0000000..40e83b8 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +4e6d99673c377ff12f679dd08ac7749e slovnet-0.6.0.tar.gz -- cgit v1.2.3