Git Product home page Git Product logo

slovnet's Introduction

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

Model Size Description
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=SingPUNCT
            Донецкой 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
                   ) PUNCTPUNCT
                   в 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:

factru gareev ne5 bsnlp
f1 PER LOC ORG PER ORG PER LOC ORG PER LOC ORG
slovnet 0.959 0.915 0.825 0.977 0.899 0.984 0.973 0.951 0.944 0.834 0.718
slovnet_bert 0.973 0.928 0.831 0.991 0.911 0.996 0.989 0.976 0.960 0.838 0.733
deeppavlov 0.910 0.886 0.742 0.944 0.798 0.942 0.919 0.881 0.866 0.767 0.624
deeppavlov_bert 0.971 0.928 0.825 0.980 0.916 0.997 0.990 0.976 0.954 0.840 0.741
deeppavlov_slavic 0.956 0.884 0.714 0.976 0.776 0.984 0.817 0.761 0.965 0.925 0.831
pullenti 0.905 0.814 0.686 0.939 0.639 0.952 0.862 0.683 0.900 0.769 0.566
spacy 0.901 0.886 0.765 0.970 0.883 0.967 0.928 0.918 0.919 0.823 0.693
stanza 0.943 0.865 0.687 0.953 0.827 0.923 0.753 0.734 0.938 0.838 0.724
texterra 0.900 0.800 0.597 0.888 0.561 0.901 0.777 0.594 0.858 0.783 0.548
tomita 0.929 0.921 0.945 0.881
mitie 0.888 0.861 0.532 0.849 0.452 0.753 0.642 0.432 0.736 0.801 0.524

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

init, s disk, mb ram, mb speed, it/s
slovnet 1.0 27 205 25.3
slovnet_bert 5.0 473 9500 40.0 (gpu)
deeppavlov 5.9 1024 3072 24.3 (gpu)
deeppavlov_bert 34.5 2048 6144 13.1 (gpu)
deeppavlov_slavic 35.0 2048 4096 8.0 (gpu)
pullenti 2.9 16 253 6.0
spacy 8.0 140 625 8.0
stanza 3.0 591 11264 3.0 (gpu)
texterra 47.6 193 3379 4.0
tomita 2.0 64 63 29.8
mitie 28.3 327 261 32.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:

news wiki fiction social poetry
slovnet 0.961 0.815 0.905 0.807 0.664
slovnet_bert 0.982 0.884 0.990 0.890 0.856
deeppavlov 0.940 0.841 0.944 0.870 0.857
deeppavlov_bert 0.951 0.868 0.964 0.892 0.865
udpipe 0.918 0.811 0.957 0.870 0.776
spacy 0.964 0.849 0.942 0.857 0.784
stanza 0.934 0.831 0.940 0.873 0.825
rnnmorph 0.896 0.812 0.890 0.860 0.838
maru 0.894 0.808 0.887 0.861 0.840
rupostagger 0.673 0.645 0.661 0.641 0.636

it/s — sentences per second.

init, s disk, mb ram, mb speed, it/s
slovnet 1.0 27 115 532.0
slovnet_bert 5.0 475 8087 285.0 (gpu)
deeppavlov 4.0 32 10240 90.0 (gpu)
deeppavlov_bert 20.0 1393 8704 85.0 (gpu)
udpipe 6.9 45 242 56.2
spacy 8.0 140 579 50.0
stanza 2.0 591 393 92.0
rnnmorph 8.7 10 289 16.6
maru 15.8 44 370 36.4
rupostagger 4.8 3 118 48.0

Syntax

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

news wiki fiction social poetry
uas las uas las uas las uas las uas las
slovnet 0.907 0.880 0.775 0.718 0.806 0.776 0.726 0.656 0.542 0.469
slovnet_bert 0.965 0.936 0.891 0.828 0.958 0.940 0.846 0.782 0.776 0.706
deeppavlov_bert 0.962 0.910 0.882 0.786 0.963 0.929 0.844 0.761 0.784 0.691
udpipe 0.873 0.823 0.622 0.531 0.910 0.876 0.700 0.624 0.625 0.534
spacy 0.943 0.916 0.851 0.783 0.901 0.874 0.804 0.737 0.704 0.616
stanza 0.940 0.886 0.815 0.716 0.936 0.895 0.802 0.714 0.713 0.613

it/s — sentences per second.

init, s disk, mb ram, mb speed, it/s
slovnet 1.0 27 125 450.0
slovnet_bert 5.0 504 3427 200.0 (gpu)
deeppavlov_bert 34.0 1427 8704 75.0 (gpu)
udpipe 6.9 45 242 56.2
spacy 9.0 140 579 41.0
stanza 3.0 591 890 12.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

slovnet's People

Contributors

harri-pltr avatar kuk avatar paramonych avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

slovnet's Issues

SlovNet fails to recognize positions within an org or at least distinguish them from a name of an org

I feel like it doesn't detect positions at all.

text = "Аналитик данных Василий Пупкин в Яндексе"
markup = ner(text)
show_markup(markup.text, markup.spans)
Аналитик данных Василий Пупкин в Яндексе
                PER───────────   ORG────
text = "Richard Biener, GCC developer"
markup = ner(text)
show_markup(markup.text, markup.spans)
Richard Biener, GCC developer
                ORG──────────

Синтаксический парсинг: рекурсия, связность и другие вольности

На сайте CoNLL-U сказано, что "The HEAD and DEPREL values define the basic dependencies which must be strictly a tree." Дерево, как мы знаем, это связный граф без циклов. Словнет, при всей своей маленькости, позволяет себе и не-связность, и циклы.

Например, для предложения "Не знаю, что и сказать, мистер Холмс" получается что-то вроде такого:

      ┌►  1 Не                   PART  advmod
┌─────└─  2 знаю                 VERB  
│ ┌────►  3 ,                    PUNCT punct
│ │ ┌──►  4 что                  SCONJ obj
│ │ │ ┌►  5 и                    PART  advmod
│ └─└─└─  6 сказать              VERB  
│   └──►  7 ,                    PUNCT punct
└────►┌─  8 мистер               NOUN  nsubj
      └►  9 Холмс                PROPN appos

Или так.
image
Токен "сказать", страшно сказать, имеет самого себя в head. Наверное, это считается за рекурсию, но другой пример с рекурсией, честное слово, найти несложно.

Я полагаю, всё это следствие того, что нейронка творит что хочет. Юдипайп такого ожидаемо не творит. Диппавлов делает так же?

Есть идеи, как это можно обойти после инфера? Вероятности брать не максимальные, а комплексно, пробегая вероятностной моделью, например.

Идеи, как это обойти, иначе обучая?

Планы сделать первое или второе в обозримом будущем?

ошибка после обучения модели в 05_ner/pack.ipynb

обучил модель на собственном датасете, затем пытаюсь посмотреть как она обучилась и получить предсказание.
запускаю скрипт 05_ner/pack.ipynb и получаю следующую ошибку:

ner = api.NER.load(PACK)
ner.navec(navec)

custom = ['«Коронамобиль» Ангелы Меркель сняли на видео']

markup = ner(custom)

show_span_markup(markup)
[razdel\segmenters\tokenize.py:250](/Lib/site-packages/razdel/segmenters/tokenize.py:250), in TokenSplitter.atoms(self, text)
      2 ner.navec(navec)
      4 custom = ['«Коронамобиль» Ангелы Меркель сняли на видео']
----> 6 markup = ner(custom)
      8 show_span_markup(markup)  
...
    249 def atoms(self, text):
--> 250     **matches = ATOM.finditer(text)**
    251     for match in matches:
    252         start = match.start()

TypeError: expected string or bytes-like object, got 'list'

navec hudlit_v1_12B_500K_300d_100q.tar error

i cannot use the big navec model: hudlit_v1_12B_500K_300d_100q.tar
it only works with the small model.

whenever i use the big model i get an error because of the id.
i tried manually changing the id in the meta.json file, but if i do that, it still does not work.

this is my code:

text = 'Европейский союз добавил в санкционный список девять политических деятелей из.'
navec = Navec.load('hudlit_v1_12B_500K_300d_100q.tar')
ner = NER.load('slovnet_ner_news_v1.tar')
ner.navec(navec)
print(ner(text))

this is the error about the id i get:

~/sharedfolder/dev/ru/slovnet/slovnet/api.py in navec(self, navec)
28
29 def navec(self, navec):
---> 30 self.infer.model = self.infer.model.inject_navec(navec)
31 return self
32

~/sharedfolder/dev/ru/slovnet/slovnet/exec/model.py in inject_navec(self, navec)
39 def inject_navec(self, navec):
40 visitor = InjectNavecVisitor(navec)
---> 41 return visitor(self)
42
43 @Property

~/sharedfolder/dev/ru/slovnet/slovnet/visitor.py in call(self, item)
16
17 def call(self, item):
---> 18 return self.visit(item)

~/sharedfolder/dev/ru/slovnet/slovnet/visitor.py in visit(self, item)
13
14 def visit(self, item):
---> 15 return self.resolve_method(item)(item)
16
17 def call(self, item):

~/sharedfolder/dev/ru/slovnet/slovnet/exec/model.py in visit_Module(self, item)
504 value = [self.visit(_) for _ in value]
505 else:
--> 506 value = self.visit(value)
507 args.append(value)
508 return type(item)(*args)

~/sharedfolder/dev/ru/slovnet/slovnet/visitor.py in visit(self, item)
13
14 def visit(self, item):
---> 15 return self.resolve_method(item)(item)
16
17 def call(self, item):

~/sharedfolder/dev/ru/slovnet/slovnet/exec/model.py in visit_Module(self, item)
504 value = [self.visit(_) for _ in value]
505 else:
--> 506 value = self.visit(value)
507 args.append(value)
508 return type(item)(*args)

~/sharedfolder/dev/ru/slovnet/slovnet/visitor.py in visit(self, item)
13
14 def visit(self, item):
---> 15 return self.resolve_method(item)(item)
16
17 def call(self, item):

~/sharedfolder/dev/ru/slovnet/slovnet/exec/model.py in visit_NavecEmbedding(self, item)
550 id = self.navec.meta.id
551 if item.id != id:
--> 552 raise ValueError('Expected id=%r, got %r' % (item.id, id))
553
554 pq = self.navec.pq

ValueError: Expected id='news_v1_1B_250K_300d_100q', got 'hudlit_v1_12B_500K_300d_100q'

актуальный API NER

Добрый день!

Судя по всему, на данный момент имеется расхождение минимального примера из readme и актуальным API библиотеки, т.к. у функции NER нет аттрибута navec, во-вторых объект NERinfer возвращает генератор, который при распаковке ничего не возвращает. Подскажите, что я упускаю?

Также, было бы здорово хотя бы в тезисах увидеть документацию по обучению под кастомную задачу: формат датасета и минимальный код для этого.

P.S. планируется ли заморозка API? неделю назад интерфейс был другим, а по тегу релиза README нет

Parse error? ['Ему', 'не', 'хватает', 'знания', 'языка', 'и', 'опыта', '.']

Разбираем предложение:

words = ['Ему', 'не', 'хватает', 'знания', 'языка', 'и', 'опыта', '.']

markup = syntax(words)

ids = {_.id: _ for _ in markup.tokens}

for token in markup.tokens:
    head = ids.get(token.head_id)
    if head:
        print([token.text, token.rel, head.text])
    else:
        print(token.text)

Результат:

['Ему', 'iobj', 'хватает']
['не', 'advmod', 'хватает']
хватает
['знания', 'nsubj', 'хватает']
['языка', 'nmod', 'знания']
['и', 'cc', 'опыта']
['опыта', 'conj', 'языка']
['.', 'punct', 'хватает']

Я правильно понимаю, что программа считает «языка» и «опыта» однородными определениями к слову «знания»?

Как можно исправить конкретную ошибку разбора?

GPU

Здравствуйте! Хотел уточнить, можно ли как-то работать с Natasha, используя GPU?

Error with Numpy 1.24

Продублирую проблему в этой ветке.
Проблема возникла с библиотекой natasha, но ссылка в ошибках идёт на slovnet.
Ошибка возникает при numpy 1.24

Лог ошибки
Собственно, natasha 1.4.0 not work with numpy 1.24.
Как исправить? И ждать ли исправлений?

Error log:

File "/home/user/project/moduls/modul_natasha.py", line 45, in natasha_analize
doc.parse_syntax(syntax_parser)
File "/home/user/project/env/lib/python3.10/site-packages/natasha/doc.py", line 139, in parse_syntax
parse_syntax_doc(self, parser)
File "/home/user/project/env/lib/python3.10/site-packages/natasha/doc.py", line 239, in parse_syntax_doc
for sent_id, (sent, markup) in enumerate(zip(doc.sents, markups), 1):
File "/home/user/project/env/lib/python3.10/site-packages/natasha/syntax.py", line 79, in map
for markup in markups:
File "/home/user/project/env/lib/python3.10/site-packages/slovnet/api.py", line 35, in map
yield from self.infer(chunk)
File "/home/user/project/env/lib/python3.10/site-packages/slovnet/exec/infer.py", line 109, in call
for item, pred in zip(items, preds):
File "/home/user/project/env/lib/python3.10/site-packages/slovnet/exec/infer.py", line 82, in call
for pred in preds:
File "/home/user/project/env/lib/python3.10/site-packages/slovnet/exec/infer.py", line 93, in process
pred = self.model(input.word_id, input.shape_id, input.pad_mask)
File "/home/user/project/env/lib/python3.10/site-packages/slovnet/exec/model.py", line 481, in call
rel_id = self.rel(x, target_head_id)
File "/home/user/project/env/lib/python3.10/site-packages/slovnet/exec/model.py", line 449, in call
head = self.head(gather_head(input, self.root.array, head_id))
File "/home/user/project/env/lib/python3.10/site-packages/slovnet/exec/model.py", line 419, in gather_head
zero = np.zeros((batch_size, 1), dtype=np.long)
File "/home/user/project/env/lib/python3.10/site-packages/numpy/init.py", line 284, in getattr
raise AttributeError("module {!r} has no attribute "
AttributeError: module 'numpy' has no attribute 'long'

Error "TypeError: 'NoneType' object is not subscriptable" when using "markup = next(syntax.map(chunk))"

I run code from example:

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

text='Европейский союз добавил в санкционный список девять политических деятелей из самопровозглашенных республик Донбасса — Донецкой народной республики (ДНР) и Луганской народной республики (ЛНР) — в связи с прошедшими там выборами. Об этом говорится в документе, опубликованном в официальном журнале Евросоюза. В новом списке фигурирует Леонид Пасечник, который по итогам выборов стал главой ЛНР. Помимо него там присутствуют Владимир Бидевка и Денис Мирошниченко, председатели законодательных органов ДНР и ЛНР, а также Ольга Позднякова и Елена Кравченко, председатели ЦИК обеих республик. Выборы прошли в непризнанных республиках Донбасса 11 ноября. На них удержали лидерство действующие руководители и партии — Денис Пушилин и «Донецкая республика» в ДНР и Леонид Пасечник с движением «Мир Луганщине» в ЛНР. Президент Франции Эмманюэль Макрон и канцлер ФРГ Ангела Меркель после встречи с украинским лидером Петром Порошенко осудили проведение выборов, заявив, что они нелегитимны и «подрывают территориальную целостность и суверенитет Украины». Позже к осуждению присоединились США с обещаниями новых санкций для России.'
chunk = []
for sent in sentenize(text):
tokens = [_.text for _ in tokenize(sent.text)]
chunk.append(tokens)
navec = Navec.load('navec_news_v1_1B_250K_300d_100q.tar')
syntax = Syntax.load('slovnet_syntax_news_v1.tar')
markup = next(syntax.map(chunk))`

It raise an error:

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/arseniy/anaconda3/envs/slovnet/lib/python3.6/site-packages/slovnet/api.py", line 35, in map yield from self.infer(chunk) File "/home/arseniy/anaconda3/envs/slovnet/lib/python3.6/site-packages/slovnet/exec/infer.py", line 109, in __call__ for item, pred in zip(items, preds): File "/home/arseniy/anaconda3/envs/slovnet/lib/python3.6/site-packages/slovnet/exec/infer.py", line 82, in __call__ for pred in preds: File "/home/arseniy/anaconda3/envs/slovnet/lib/python3.6/site-packages/slovnet/exec/infer.py", line 93, in process pred = self.model(input.word_id, input.shape_id, input.pad_mask) File "/home/arseniy/anaconda3/envs/slovnet/lib/python3.6/site-packages/slovnet/exec/model.py", line 476, in __call__ x = self.emb(word_id, shape_id) File "/home/arseniy/anaconda3/envs/slovnet/lib/python3.6/site-packages/slovnet/exec/model.py", line 245, in __call__ word = self.word(word_id) File "/home/arseniy/anaconda3/envs/slovnet/lib/python3.6/site-packages/slovnet/exec/model.py", line 232, in __call__ indexes = self.indexes.array[input] TypeError: 'NoneType' object is not subscriptable

numpy version: 1.18.0, 1.19.5
python version: 3.8.5, 3.6
OS: Ubuntu

Использование slovnet на нескольких процессах многократно замедляет обработку

Здравствуйте! При использовании POS-таггера в режиме скрипта внутри одного процесса, обработка происходит достаточно быстро. Но если запустить celery очередь на 4 процессах, то POS-разметка занимает экстремально много времени: на одной машине и в celery-очереди одни и те же данные обрабатываются соответственно 6 и 250 секунд.

Я запустил профилирование, и увидел вот такое:
image

Это файл slovnet/exec/model.py.

Каким образом я могу настроить многопроцессную обработку данных с использованием slovnet? И чем может быть вызвано такое увеличение времени обработки?

Заранее спасибо!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.