Natasha는 러시아 언어에 대한 기본 NLP 작업을 해결합니다 : 토큰 화, 문장 세분화, 단어 임베딩, 형태 태깅, 레마 화, 문구 정규화, 구문 구문 분석, NER 태그, 사실 추출. 모든 작업의 품질은 뉴스 기사에서 러시아어의 현재 소타와 비슷하거나 낫습니다. 평가 섹션을 참조하십시오. Natasha는 연구 프로젝트가 아니며 기본 기술이 생산을 위해 구축되었습니다. 우리는 모델 크기, RAM 사용 및 성능에주의를 기울입니다. 모델은 CPU에서 실행되며 추론에 Numpy를 사용합니다.
Natasha는 하나의 편리한 API에 따라 Natasha Project의 도서관을 통합합니다.
API가 변경 될 수 있습니다. 실제 작업은 Natasha Project의 저수준 라이브러리 사용을 고려합니다. 뉴스 기사에 최적화 된 모델, 다른 도메인의 품질이 낮을 수 있습니다. Old
NamesExtractor사용하려면AddressExtactorDowngradepip 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 = [...])] 모든 토큰에 대해 풍부한 형태 태그를 추출합니다. 세분화 단계에 따라 다릅니다. doc.tokens 의 pos 및 feats 속성을 정의합니다. 내부적으로 슬로프 넷 형태 모델을 사용합니다.
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
... 모든 토큰을 lemmati습니다. 형태 단계에 따라 다릅니다. 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 = 'йоэль' )]
{ 'Посол' : 'посол' ,
'Израиля' : 'израиль' ,
'на' : 'на' ,
'Украине' : 'украина' ,
'Йоэль' : 'йоэль' ,
'Лион' : 'лион' ,
'признался' : 'признаться' ,
',' : ',' ,
'что' : 'что' ,
'пришел' : 'прийти' ,
'в' : 'в' ,
'шок' : 'шок' ,
'узнав' : 'узнать' ,
'о' : 'о' ,
... 모든 문장 실행 구문 분석기. 세분화 단계에 따라 다릅니다. doc.tokens 의 id , head_id , rel 속성을 정의합니다. 내부적으로 Slovnet Syntax 모델을 사용합니다.
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
... Entities의 이름, 위치, 조직. 세분화 단계에 따라 다릅니다. doc 의 spans 속성을 정의합니다. 내부적으로 Slovnet NER 모델을 사용합니다.
ner 마크 업을 시각화하려면 ner.print() 에 전화하십시오. 내부적으로 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 속성을 정의합니다.
하나는 단지 엔티티 내부의 모든 토큰을 lemmatize 할 수는 없으며, 그렇지 않으면 "организации украинс 변태"는 "органистов"가 될 수 있습니다. Natasha는 Syntax 종속성을 사용하여 올바른 "органи 착취"를 생성합니다.
> >> 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 FirstName, Surname 및 Parronymic. 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' : 'Ющенко' }}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시험
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