纳塔莎(Natasha)解决了俄罗斯语言的基本NLP任务:令牌化,句子细分,单词嵌入,形态标记,lemmatization,短语归一化,语法解析,NER标记,事实提取。在新闻文章中,每个任务上的质量都比俄罗斯语言的当前SOTA相似或更好,请参见评估部分。纳塔莎不是一个研究项目,而是为生产而建立的基础技术。我们关注模型大小,RAM使用和性能。在CPU上运行的模型,使用Numpy进行推理。
Natasha在一个方便的API下集成了Natasha项目的库:
对于现实世界任务,API可能会更改,请考虑使用Natasha Project中的低级库。针对新闻文章优化的模型,其他领域的质量可能较低。要使用旧的
NamesExtractor,AddressExtactor降级pip install natasha<1 yargy<0.13
Natasha支持Python 3.7+和PYPY3:
$ pip install natasha导入,初始化模块,构建Doc对象。
> >> 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 )将文字分为代币和句子。定义doc的tokens和sents属性。内部使用Razdel。
> >> 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 = [...])]对于每个令牌提取物丰富的形态标签。取决于细分步骤。定义pos并feats doc.tokens的属性。内部使用Slovnet形态模型。
致电morph.print()可视化形态标记。
> >> 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
...诱使每个令牌。取决于形态步骤。定义doc.tokens的lemma特性。内部使用pymorphy。
> >> 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 = 'йоэль' )]
{ 'Посол' : 'посол' ,
'Израиля' : 'израиль' ,
'на' : 'на' ,
'Украине' : 'украина' ,
'Йоэль' : 'йоэль' ,
'Лион' : 'лион' ,
'признался' : 'признаться' ,
',' : ',' ,
'что' : 'что' ,
'пришел' : 'прийти' ,
'в' : 'в' ,
'шок' : 'шок' ,
'узнав' : 'узнать' ,
'о' : 'о' ,
...对于每个句子运行语法分析仪。取决于细分步骤。定义id , head_id , doc.tokens的rel属性。内部使用Slovnet语法模型。
使用syntax.print()可视化语法标记。内部使用iPymarkup。
> >> 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
...提取标准命名实体:名称,位置,组织。取决于细分步骤。定义doc的spans属性。内部使用Slovnet NER模型。
致电ner.print()可视化NER标记。内部使用iPymarkup。
> >> 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 ────
было отменено судом . 对于每个NER跨度,都采用归一化过程。取决于NER,形态和语法步骤。定义doc.spans的normal属性。
一个人不能仅仅使内部实体内部的每个令牌范围都可以塑造,否则“„„™将变成“„„„„„„„„„„„„„„„„„„氨基酸。 natasha使用语法依赖性来产生正确的“ ourазцццц讯я。
> >> 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 = 'Россия' )]
{ 'Израиля' : 'Израиль' ,
'Украине' : 'Украина' ,
'Львовской области' : 'Львовская область' ,
'России' : 'Россия' ,
'Организации украинских националистов (ОУН)' : 'Организация украинских националистов (ОУН)' ,
'Степана Бандеры' : 'Степан Бандера' ,
'Петру Порошенко' : 'Петр Порошенко' ,
'Бандере' : 'Бандера' ,
'Украины' : 'Украина' ,
'Верховной Рады' : 'Верховная Рада' ,
'Бандеры' : 'Бандера' ,
'Организации украинских националистов' : 'Организация украинских националистов' ,
'Виктора Ющенко' : 'Виктор Ющенко' }将PER命名实体分析为firstName,姓氏和patonymic。取决于NER步骤。定义doc.spans的fact属性。内部使用Yargy-Parser。
Natasha还构建了日期,金钱和地址的提取物。
> >> 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' : 'Ющенко' }}开发环境
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测试
make test文档
make exec-docs发布
# 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