Natasha résout les tâches de base NLP pour le langage russe: tokenisation, segmentation des phrases, intégration des mots, marphologie, lemmatisation, normalisation de la phrase, analyse de syntaxe, étiquetage NER, extraction des faits. La qualité sur chaque tâche est similaire ou meilleure que les sotas actuels pour la langue russe sur les articles de presse, voir la section d'évaluation. Natasha n'est pas un projet de recherche, les technologies sous-jacentes sont conçues pour la production. Nous faisons attention à la taille du modèle, à l'utilisation de la RAM et aux performances. Les modèles fonctionnent sur CPU, utilisez Numpy pour l'inférence.
Natasha intègre des bibliothèques du projet Natasha sous une seule API pratique:
L'API peut changer, pour les tâches Realworld, envisagez d'utiliser des bibliothèques de bas niveau du projet Natasha. Les modèles optimisés pour les articles de presse, la qualité sur d'autres domaines peuvent être plus faibles. Pour utiliser l'ancien
NamesExtractor,AddressExtactorDowngradepip install natasha<1 yargy<0.13
Natasha prend en charge Python 3.7+ et PyPy3:
$ pip install natasha Importer, initialiser les modules, construire l'objet 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 ) Diviser le texte en jetons et en sensibles. Définit tokens et les sents de doc . Utilise Razdel en interne.
> >> 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 = [...])] Pour chaque token extrait des étiquettes de morphologie riche. Dépend de l'étape de segmentation. Définit les propriétés pos et feats de doc.tokens . Utilise le modèle de morphologie Slovnet en interne.
Appelez morph.print() pour visualiser le balisage de la morphologie.
> >> 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
... Lemmatiser chaque jeton. Cela dépend de l'étape de morphologie. Définit la propriété lemma de doc.tokens . Utilise la pymorphie en interne.
> >> 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 = 'йоэль' )]
{ 'Посол' : 'посол' ,
'Израиля' : 'израиль' ,
'на' : 'на' ,
'Украине' : 'украина' ,
'Йоэль' : 'йоэль' ,
'Лион' : 'лион' ,
'признался' : 'признаться' ,
',' : ',' ,
'что' : 'что' ,
'пришел' : 'прийти' ,
'в' : 'в' ,
'шок' : 'шок' ,
'узнав' : 'узнать' ,
'о' : 'о' ,
... Pour chaque analyse de syntaxe exécutée. Dépend de l'étape de segmentation. Définit les propriétés id , head_id , rel de doc.tokens . Utilise le modèle de syntaxe Slovnet en interne.
Utilisez syntax.print() pour visualiser le balisage de la syntaxe. Utilise iPyMarkup en interne.
> >> 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
... Extraire Standart Named Entités: noms, emplacements, organisations. Dépend de l'étape de segmentation. Définit la propriété de spans de doc . Utilise le modèle Slovnet NER en interne.
Appelez ner.print() pour visualiser le balisage NER. Utilise iPyMarkup en interne.
> >> 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 ────
было отменено судом . Pour chaque SPAN NER, appliquez la procédure de normalisation. Cela dépend des étapes NER, de la morphologie et de la syntaxe. Définit la propriété normal de doc.spans .
On ne peut pas simplement lemmatiser chaque token à l'intérieur de l'entité, sinon "организации украинских националистов" deviendrait "оаанизация украинскdent наццналлы". Natasha utilise des dépendances de syntaxe pour produire des "O организация украинских националистовve".
> >> 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 = 'Россия' )]
{ 'Израиля' : 'Израиль' ,
'Украине' : 'Украина' ,
'Львовской области' : 'Львовская область' ,
'России' : 'Россия' ,
'Организации украинских националистов (ОУН)' : 'Организация украинских националистов (ОУН)' ,
'Степана Бандеры' : 'Степан Бандера' ,
'Петру Порошенко' : 'Петр Порошенко' ,
'Бандере' : 'Бандера' ,
'Украины' : 'Украина' ,
'Верховной Рады' : 'Верховная Рада' ,
'Бандеры' : 'Бандера' ,
'Организации украинских националистов' : 'Организация украинских националистов' ,
'Виктора Ющенко' : 'Виктор Ющенко' } Parse PER entités nommées en premier nom, nom de famille et patronyme. Dépend de l'étape NER. Définit la propriété des fact de doc.spans . Utilise Yargy-Parser en interne.
Natasha a également intégré des extracteurs pour les dates, l'argent, l'adresse.
> >> 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' : 'Ющенко' }}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-natashaTest
make testDocs
make exec-docsLibérer
# 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