Coder Social home page Coder Social logo

natasha / slovnet Goto Github PK

View Code? Open in Web Editor NEW
215.0 215.0 22.0 3.83 MB

Deep Learning based NLP modeling for Russian language

License: MIT License

Makefile 0.98% Python 60.75% Jupyter Notebook 36.47% Dockerfile 1.80%
bert deep-learning machine-learning morphology ner nlp python pytorch russian syntax

slovnet's Introduction

CI

Natasha solves basic NLP tasks for Russian language: tokenization, sentence segmentation, word embedding, morphology tagging, lemmatization, phrase normalization, syntax parsing, NER tagging, fact extraction. Quality on every task is similar or better than current SOTAs for Russian language on news articles, see evaluation section. Natasha is not a research project, underlying technologies are built for production. We pay attention to model size, RAM usage and performance. Models run on CPU, use Numpy for inference.

Natasha integrates libraries from Natasha project under one convenient API:

  • Razdel — token, sentence segmentation for Russian
  • Navec — compact Russian embeddings
  • Slovnet — modern deep-learning techniques for Russian NLP, compact models for Russian morphology, syntax, NER.
  • Yargy — rule-based fact extraction similar to Tomita parser.
  • Ipymarkup — NLP visualizations for NER and syntax markups.

⚠ API may change, for realworld tasks consider using low level libraries from Natasha project. Models optimized for news articles, quality on other domain may be lower. To use old NamesExtractor, AddressExtactor downgrade pip install natasha<1 yargy<0.13

Install

Natasha supports Python 3.7+ and PyPy3:

$ pip install natasha

Usage

Import, initialize modules, build Doc object.

>>> from natasha import (
    Segmenter,
    MorphVocab,
    
    NewsEmbedding,
    NewsMorphTagger,
    NewsSyntaxParser,
    NewsNERTagger,
    
    PER,
    NamesExtractor,

    Doc
)


>>> segmenter = Segmenter()
>>> morph_vocab = MorphVocab()

>>> emb = NewsEmbedding()
>>> morph_tagger = NewsMorphTagger(emb)
>>> syntax_parser = NewsSyntaxParser(emb)
>>> ner_tagger = NewsNERTagger(emb)

>>> names_extractor = NamesExtractor(morph_vocab)

>>> text = 'Посол Израиля на Украине Йоэль Лион признался, что пришел в шок, узнав о решении властей Львовской области объявить 2019 год годом лидера запрещенной в России Организации украинских националистов (ОУН) Степана Бандеры. Свое заявление он разместил в Twitter. «Я не могу понять, как прославление тех, кто непосредственно принимал участие в ужасных антисемитских преступлениях, помогает бороться с антисемитизмом и ксенофобией. Украина не должна забывать о преступлениях, совершенных против украинских евреев, и никоим образом не отмечать их через почитание их исполнителей», — написал дипломат. 11 декабря Львовский областной совет принял решение провозгласить 2019 год в регионе годом Степана Бандеры в связи с празднованием 110-летия со дня рождения лидера ОУН (Бандера родился 1 января 1909 года). В июле аналогичное решение принял Житомирский областной совет. В начале месяца с предложением к президенту страны Петру Порошенко вернуть Бандере звание Героя Украины обратились депутаты Верховной Рады. Парламентарии уверены, что признание Бандеры национальным героем поможет в борьбе с подрывной деятельностью против Украины в информационном поле, а также остановит «распространение мифов, созданных российской пропагандой». Степан Бандера (1909-1959) был одним из лидеров Организации украинских националистов, выступающей за создание независимого государства на территориях с украиноязычным населением. В 2010 году в период президентства Виктора Ющенко Бандера был посмертно признан Героем Украины, однако впоследствии это решение было отменено судом. '
>>> doc = Doc(text)

Segmentation

Split text into tokens and sentencies. Defines tokens and sents properties of doc. Uses Razdel internally.

>>> doc.segment(segmenter)
>>> print(doc.tokens[:5])
>>> print(doc.sents[:5])
[DocToken(stop=5, text='Посол'),
 DocToken(start=6, stop=13, text='Израиля'),
 DocToken(start=14, stop=16, text='на'),
 DocToken(start=17, stop=24, text='Украине'),
 DocToken(start=25, stop=30, text='Йоэль')]
[DocSent(stop=218, text='Посол Израиля на Украине Йоэль Лион признался, чт..., tokens=[...]),
 DocSent(start=219, stop=257, text='Свое заявление он разместил в Twitter.', tokens=[...]),
 DocSent(start=258, stop=424, text=Я не могу понять, как прославление тех, кто непо..., tokens=[...]),
 DocSent(start=425, stop=592, text='Украина не должна забывать о преступлениях, совер..., tokens=[...]),
 DocSent(start=593, stop=798, text='11 декабря Львовский областной совет принял решен..., tokens=[...])]

Morphology

For every token extract rich morphology tags. Depends on segmentation step. Defines pos and feats properties of doc.tokens. Uses Slovnet morphology model internally.

Call morph.print() to visualize morphology markup.

>>> doc.tag_morph(morph_tagger)
>>> print(doc.tokens[:5])
>>> doc.sents[0].morph.print()
[DocToken(stop=5, text='Посол', pos='NOUN', feats=<Anim,Nom,Masc,Sing>),
 DocToken(start=6, stop=13, text='Израиля', pos='PROPN', feats=<Inan,Gen,Masc,Sing>),
 DocToken(start=14, stop=16, text='на', pos='ADP'),
 DocToken(start=17, stop=24, text='Украине', pos='PROPN', feats=<Inan,Loc,Fem,Sing>),
 DocToken(start=25, stop=30, text='Йоэль', pos='PROPN', feats=<Anim,Nom,Masc,Sing>)]
               Посол NOUN|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
             Израиля PROPN|Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing
                  на ADP
             Украине PROPN|Animacy=Inan|Case=Loc|Gender=Fem|Number=Sing
               Йоэль PROPN|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
                Лион PROPN|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
           признался VERB|Aspect=Perf|Gender=Masc|Mood=Ind|Number=Sing|Tense=Past|VerbForm=Fin|Voice=Mid
                   , PUNCT
                 что SCONJ
...

Lemmatization

Lemmatize every token. Depends on morphology step. Defines lemma property of doc.tokens. Uses Pymorphy internally.

>>> for token in doc.tokens:
>>>     token.lemmatize(morph_vocab)
    
>>> print(doc.tokens[:5])
>>> {_.text: _.lemma for _ in doc.tokens}
[DocToken(stop=5, text='Посол', pos='NOUN', feats=<Anim,Nom,Masc,Sing>, lemma='посол'),
 DocToken(start=6, stop=13, text='Израиля', pos='PROPN', feats=<Inan,Gen,Masc,Sing>, lemma='израиль'),
 DocToken(start=14, stop=16, text='на', pos='ADP', lemma='на'),
 DocToken(start=17, stop=24, text='Украине', pos='PROPN', feats=<Inan,Loc,Fem,Sing>, lemma='украина'),
 DocToken(start=25, stop=30, text='Йоэль', pos='PROPN', feats=<Anim,Nom,Masc,Sing>, lemma='йоэль')]
{'Посол': 'посол',
 'Израиля': 'израиль',
 'на': 'на',
 'Украине': 'украина',
 'Йоэль': 'йоэль',
 'Лион': 'лион',
 'признался': 'признаться',
 ',': ',',
 'что': 'что',
 'пришел': 'прийти',
 'в': 'в',
 'шок': 'шок',
 'узнав': 'узнать',
 'о': 'о',
...

Syntax

For every sentence run syntax analyzer. Depends on segmentation step. Defines id, head_id, rel properties of doc.tokens. Uses Slovnet syntax model internally.

Use syntax.print() to visualize syntax markup. Uses Ipymarkup internally.

>>> doc.parse_syntax(syntax_parser)
>>> print(doc.tokens[:5])
>>> doc.sents[0].syntax.print()
[DocToken(stop=5, text='Посол', id='1_1', head_id='1_7', rel='nsubj', pos='NOUN', feats=<Anim,Nom,Masc,Sing>),
 DocToken(start=6, stop=13, text='Израиля', id='1_2', head_id='1_1', rel='nmod', pos='PROPN', feats=<Inan,Gen,Masc,Sing>),
 DocToken(start=14, stop=16, text='на', id='1_3', head_id='1_4', rel='case', pos='ADP'),
 DocToken(start=17, stop=24, text='Украине', id='1_4', head_id='1_1', rel='nmod', pos='PROPN', feats=<Inan,Loc,Fem,Sing>),
 DocToken(start=25, stop=30, text='Йоэль', id='1_5', head_id='1_1', rel='appos', pos='PROPN', feats=<Anim,Nom,Masc,Sing>)]
        ┌──► Посол         nsubjИзраиля       
        │ ┌► на            case
        │ └─ Украине       
        │ ┌─ Йоэль         
        │ └► Лион          flat:name
┌─────┌─└─── признался     
│     │ ┌──► ,             punct
│     │ │ ┌► что           mark
│     └►└─└─ пришел        ccomp
│     │   ┌► в             case
│     └──►└─ шок           obl
│         ┌► ,             punct
│ ┌────►┌─└─ узнав         advcl
│ │     │ ┌► о             case
│ │ ┌───└►└─ решении       obl
│ │ │ ┌─└──► властей       nmod
│ │ │ │   ┌► Львовской     amod
│ │ │ └──►└─ области       nmod
│ └─└►┌─┌─── объявить      nmod
│     │ │ ┌► 2019          amod
│     │ └►└─ год           obj
│     └──►┌─ годом         obl
│   ┌─────└► лидера        nmod
│   │ ┌►┌─── запрещенной   acl
│   │ │ │ ┌► в             case
│   │ │ └►└─ России        obl
│ ┌─└►└─┌─── Организации   nmod
│ │     │ ┌► украинских    amod
│ │   ┌─└►└─ националистов nmod
│ │   │   ┌► (             punct
│ │   └►┌─└─ ОУН           parataxis
│ │     └──► )             punct
│ └──────►┌─ Степана       appos
│         └► Бандеры       flat:name
└──────────► .             punct
...

NER

Extract standart named entities: names, locations, organizations. Depends on segmentation step. Defines spans property of doc. Uses Slovnet NER model internally.

Call ner.print() to visualize NER markup. Uses Ipymarkup internally.

>>> doc.tag_ner(ner_tagger)
>>> print(doc.spans[:5])
>>> doc.ner.print()
[DocSpan(start=6, stop=13, type='LOC', text='Израиля', tokens=[...]),
 DocSpan(start=17, stop=24, type='LOC', text='Украине', tokens=[...]),
 DocSpan(start=25, stop=35, type='PER', text='Йоэль Лион', tokens=[...]),
 DocSpan(start=89, stop=106, type='LOC', text='Львовской области', tokens=[...]),
 DocSpan(start=152, stop=158, type='LOC', text='России', tokens=[...])]
Посол Израиля на Украине Йоэль Лион признался, что пришел в шок, узнав
      LOC────    LOC──── PER───────                                   
 о решении властей Львовской области объявить 2019 год годом лидера 
                   LOC──────────────                                
запрещенной в России Организации украинских националистов (ОУН) 
              LOC─── ORG─────────────────────────────────────── 
Степана Бандеры. Свое заявление он разместил в Twitter. «Я не могу 
PER────────────                                ORG────             
понять, как прославление тех, кто непосредственно принимал участие в 
ужасных антисемитских преступлениях, помогает бороться с 
антисемитизмом и ксенофобией. Украина не должна забывать о 
                              LOC────                      
преступлениях, совершенных против украинских евреев, и никоим образом 
не отмечать их через почитание их исполнителей», — написал дипломат. 
11 декабря Львовский областной совет принял решение провозгласить 2019
           ORG──────────────────────                                  
 год в регионе годом Степана Бандеры в связи с празднованием 110-летия
                     PER────────────                                  
 со дня рождения лидера ОУН (Бандера родился 1 января 1909 года). В 
                        ORG                                         
июле аналогичное решение принял Житомирский областной совет. В начале 
                                ORG────────────────────────           
месяца с предложением к президенту страны Петру Порошенко вернуть 
                                          PER────────────         
Бандере звание Героя Украины обратились депутаты Верховной Рады. 
PER────              LOC────                     ORG───────────  
Парламентарии уверены, что признание Бандеры национальным героем 
                                     PER────                     
поможет в борьбе с подрывной деятельностью против Украины в 
                                                  LOC────   
информационном поле, а также остановит «распространение мифов, 
созданных российской пропагандой». Степан Бандера (1909-1959) был 
                                   PER───────────                 
одним из лидеров Организации украинских националистов, выступающей за 
                 ORG─────────────────────────────────                 
создание независимого государства на территориях с украиноязычным 
населением. В 2010 году в период президентства Виктора Ющенко Бандера 
                                               PER─────────── PER──── 
был посмертно признан Героем Украины, однако впоследствии это решение 
                             LOC────                                  
было отменено судом. 

Named entity normalization

For every NER span apply normalization procedure. Depends on NER, morphology and syntax steps. Defines normal property of doc.spans.

One can not just lemmatize every token inside entity span, otherwise "Организации украинских националистов" would become "Организация украинские националисты". Natasha uses syntax dependencies to produce correct "Организация украинских националистов".

>>> for span in doc.spans:
>>>    span.normalize(morph_vocab)
>>> print(doc.spans[:5])
>>> {_.text: _.normal for _ in doc.spans if _.text != _.normal}
[DocSpan(start=6, stop=13, type='LOC', text='Израиля', tokens=[...], normal='Израиль'),
 DocSpan(start=17, stop=24, type='LOC', text='Украине', tokens=[...], normal='Украина'),
 DocSpan(start=25, stop=35, type='PER', text='Йоэль Лион', tokens=[...], normal='Йоэль Лион'),
 DocSpan(start=89, stop=106, type='LOC', text='Львовской области', tokens=[...], normal='Львовская область'),
 DocSpan(start=152, stop=158, type='LOC', text='России', tokens=[...], normal='Россия')]
{'Израиля': 'Израиль',
 'Украине': 'Украина',
 'Львовской области': 'Львовская область',
 'России': 'Россия',
 'Организации украинских националистов (ОУН)': 'Организация украинских националистов (ОУН)',
 'Степана Бандеры': 'Степан Бандера',
 'Петру Порошенко': 'Петр Порошенко',
 'Бандере': 'Бандера',
 'Украины': 'Украина',
 'Верховной Рады': 'Верховная Рада',
 'Бандеры': 'Бандера',
 'Организации украинских националистов': 'Организация украинских националистов',
 'Виктора Ющенко': 'Виктор Ющенко'}

Named entity parsing

Parse PER named entities into firstname, surname and patronymic. Depends on NER step. Defines fact property of doc.spans. Uses Yargy-parser internally.

Natasha also has built in extractors for dates, money, address.

>>> for span in doc.spans:
>>>    if span.type == PER:
>>>        span.extract_fact(names_extractor)

>>> print(doc.spans[:5])
>>> {_.normal: _.fact.as_dict for _ in doc.spans if _.type == PER}
[DocSpan(start=6, stop=13, type='LOC', text='Израиля', tokens=[...], normal='Израиль'),
 DocSpan(start=17, stop=24, type='LOC', text='Украине', tokens=[...], normal='Украина'),
 DocSpan(start=25, stop=35, type='PER', text='Йоэль Лион', tokens=[...], normal='Йоэль Лион', fact=DocFact(slots=[...])),
 DocSpan(start=89, stop=106, type='LOC', text='Львовской области', tokens=[...], normal='Львовская область'),
 DocSpan(start=152, stop=158, type='LOC', text='России', tokens=[...], normal='Россия')]
{'Йоэль Лион': {'first': 'Йоэль', 'last': 'Лион'},
 'Степан Бандера': {'first': 'Степан', 'last': 'Бандера'},
 'Петр Порошенко': {'first': 'Петр', 'last': 'Порошенко'},
 'Бандера': {'last': 'Бандера'},
 'Виктор Ющенко': {'first': 'Виктор', 'last': 'Ющенко'}}

Documentation

Evaluation

Support

Development

Dev env

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

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

python -m ipykernel install --user --name natasha-natasha

Test

make test

Docs

make exec-docs

Release

# Update setup.py version

git commit -am 'Up version'
git tag v1.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

GPU

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

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'

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──────────

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

Добрый день!

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

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

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

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

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

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

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

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

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

ошибка после обучения модели в 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'

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'

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

На сайте 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. Наверное, это считается за рекурсию, но другой пример с рекурсией, честное слово, найти несложно.

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

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

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

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

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', 'хватает']

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

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

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

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.