Package: natasha
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 then current SOTAs for Russian language on news articles, seeevaluation 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 fromNatasha projectunder one convenient API:Razdel— token, sentence segmentation for RussianNavec— compact Russian embeddingsSlovnet— 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 oldNamesExtractor,AddressExtactordowngradepip install natasha<1 yargy<0.13InstallNatasha supports Python 3.7+ and PyPy3:$pipinstallnatashaUsageImport, initialize modules, buildDocobject.>>>fromnatashaimport(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)SegmentationSplit text into tokens and sentencies. Definestokensandsentsproperties ofdoc. UsesRazdelinternally.>>>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=[...])]MorphologyFor every token extract rich morphology tags. Depends onsegmentationstep. Definesposandfeatsproperties ofdoc.tokens. UsesSlovnet morphology modelinternally.Callmorph.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...LemmatizationLemmatize every token. Depends onmorphologystep. Defineslemmaproperty ofdoc.tokens. UsesPymorphyinternally.>>>fortokenindoc.tokens:>>>token.lemmatize(morph_vocab)>>>print(doc.tokens[:5])>>>{_.text:_.lemmafor_indoc.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='йоэль')]{'Посол':'посол','Израиля':'израиль','на':'на','Украине':'украина','Йоэль':'йоэль','Лион':'лион','признался':'признаться',',':',','что':'что','пришел':'прийти','в':'в','шок':'шок','узнав':'узнать','о':'о',...SyntaxFor every sentence run syntax analyzer. Depends onsegmentationstep. Definesid,head_id,relproperties ofdoc.tokens. UsesSlovnet syntax modelinternally.Usesyntax.print()to visualize syntax markup. UsesIpymarkupinternally.>>>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│││┌►2019amod││└►└─годobj│└──►┌─годомobl│┌─────└►лидераnmod││┌►┌───запрещеннойacl││││┌►вcase│││└►└─Россииobl│┌─└►└─┌───Организацииnmod│││┌►украинскихamod││┌─└►└─националистовnmod│││┌►(punct││└►┌─└─ОУНparataxis││└──►)punct│└──────►┌─Степанаappos│└►Бандерыflat:name└──────────►.punct...NERExtract standart named entities: names, locations, organizations. Depends onsegmentationstep. Definesspansproperty ofdoc. UsesSlovnet NER modelinternally.Callner.print()to visualize NER markup. UsesIpymarkupinternally.>>>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декабряЛьвовскийобластнойсоветпринялрешениепровозгласить2019ORG──────────────────────годврегионегодомСтепанаБандерывсвязиспразднованием110-летияPER────────────соднярождениялидераОУН(Бандерародился1января1909года).ВORGиюлеаналогичноерешениепринялЖитомирскийобластнойсовет.ВначалеORG────────────────────────месяцаспредложениемкпрезидентустраныПетруПорошенковернутьPER────────────БандерезваниеГерояУкраиныобратилисьдепутатыВерховнойРады.PER────LOC────ORG───────────Парламентарииуверены,чтопризнаниеБандерынациональнымгероемPER────поможетвборьбесподрывнойдеятельностьюпротивУкраинывLOC────информационномполе,атакжеостановит«распространениемифов,созданныхроссийскойпропагандой».СтепанБандера(1909-1959)былPER───────────однимизлидеровОрганизацииукраинскихнационалистов,выступающейзаORG─────────────────────────────────созданиенезависимогогосударстванатерриторияхсукраиноязычнымнаселением.В2010годувпериодпрезидентстваВиктораЮщенкоБандераPER───────────PER────былпосмертнопризнанГероемУкраины,однаковпоследствииэторешениеLOC────былоотмененосудом.Named entity normalizationFor every NER span apply normalization procedure. Depends onNER,morphologyandsyntaxsteps. Definesnormalproperty ofdoc.spans.One can not just lemmatize every token inside entity span, otherwise "Организации украинских националистов" would become "Организация украинские националисты". Natasha uses syntax dependencies to produce correct "Организация украинских националистов".>>>forspanindoc.spans:>>>span.normalize(morph_vocab)>>>print(doc.spans[:5])>>>{_.text:_.normalfor_indoc.spansif_.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 parsingParsePERnamed entities into firstname, surname and patronymic. Depends onNERstep. Definesfactproperty ofdoc.spans. UsesYargy-parserinternally.Natasha also has built in extractors fordates,money,address.>>>forspanindoc.spans:>>>ifspan.type==PER:>>>span.extract_fact(names_extractor)>>>print(doc.spans[:5])>>>{_.normal:_.fact.as_dictfor_indoc.spansif_.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':'Ющенко'}}DocumentationExamples with description + referenceNatasha section in longread on Natasha project(in Russian)Natasha section of Datafest 2020 talk(in Russian)EvaluationSegmentation —Razdel evalualtion sectionEmbedding —Navec evalualtion sectionMorphology —Slovnet Morph evaluation sectionSyntax —Slovnet Syntax evaluation sectionNER —Slovnet NER evaluation sectionSupportChat —https://t.me/natural_language_processingIssues —https://github.com/natasha/natasha/issuesCommercial support —https://lab.alexkuk.ruDevelopmentDev envpython-mvenv~/.venvs/natasha-natashasource~/.venvs/natasha-natasha/bin/activate

pipinstall-rrequirements/dev.txt
pipinstall-e.

python-mipykernelinstall--user--namenatasha-natashaTestmaketestDocsmakeexec-docsRelease# Update setup.py versiongitcommit-am'Up version'gittagv1.6.0

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