นาตาชาแก้งาน NLP พื้นฐานสำหรับภาษารัสเซีย: โทเค็น, การแบ่งส่วนประโยค, การฝังคำ, การติดแท็กสัณฐานวิทยา, lemmatization, วลีปกติ, การแยกวิเคราะห์ไวยากรณ์, การติดแท็ก NER, การสกัดข้อเท็จจริง คุณภาพในทุกงานมีความคล้ายคลึงกันหรือดีกว่า SOTAs ปัจจุบันสำหรับภาษารัสเซียในบทความข่าวดูส่วนการประเมินผล นาตาชาไม่ใช่โครงการวิจัยเทคโนโลยีพื้นฐานถูกสร้างขึ้นเพื่อการผลิต เราให้ความสนใจกับขนาดของแบบจำลองการใช้งาน RAM และประสิทธิภาพ โมเดลทำงานบน CPU ใช้ numpy สำหรับการอนุมาน
นาตาชารวมห้องสมุดจากโครงการนาตาชาภายใต้ API ที่สะดวก:
API อาจเปลี่ยนแปลงสำหรับงานจริงพิจารณาใช้ห้องสมุดระดับต่ำจากโครงการนาตาชา โมเดลที่ได้รับการปรับให้เหมาะสมสำหรับบทความข่าวคุณภาพในโดเมนอื่นอาจต่ำกว่า หากต้องการใช้
NamesExtractorเก่า,AddressExtactordowngradepip install natasha<1 yargy<0.13
นาตาชารองรับ 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 ) แยกข้อความออกเป็นโทเค็นและประโยค กำหนดคุณสมบัติ tokens และ sents ของ doc ใช้ 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
... lemmatize ทุกโทเค็น ขึ้นอยู่กับขั้นตอนสัณฐานวิทยา กำหนดคุณสมบัติ lemma ของ doc.tokens ใช้ 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 = 'йоэль' )]
{ 'Посол' : 'посол' ,
'Израиля' : 'израиль' ,
'на' : 'на' ,
'Украине' : 'украина' ,
'Йоэль' : 'йоэль' ,
'Лион' : 'лион' ,
'признался' : 'признаться' ,
',' : ',' ,
'что' : 'что' ,
'пришел' : 'прийти' ,
'в' : 'в' ,
'шок' : 'шок' ,
'узнав' : 'узнать' ,
'о' : 'о' ,
... สำหรับทุกประโยค RUN SYNTAX Analyzer ขึ้นอยู่กับขั้นตอนการแบ่งส่วน กำหนด id , head_id , คุณสมบัติ rel ของ doc.tokens ใช้โมเดลไวยากรณ์ 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
... แยกสแตนดาร์ดชื่อเอนทิตี: ชื่อสถานที่องค์กร ขึ้นอยู่กับขั้นตอนการแบ่งส่วน กำหนด spans คุณสมบัติของ doc ใช้โมเดล 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 สัณฐานวิทยาและไวยากรณ์ กำหนดคุณสมบัติ normal ของ doc.spans
เราไม่สามารถเพียงแค่ lemmatize ทุกโทเค็นภายในเอนทิตีในช่วงมิฉะนั้น "организациикраинскихнационалистов" จะกลายเป็น "организациякраиниенациоиоиоизизизияигистов Natasha ใช้ไวยากรณ์การพึ่งพาเพื่อสร้างที่ถูกต้อง "организацияукраинскихнационалистов"
> >> 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 ตีที่มีชื่อลงในชื่อนามสกุลนามสกุลและ Patronymic ขึ้นอยู่กับขั้นตอน ner กำหนดคุณสมบัติ fact ของ doc.spans ใช้ Yargy-Parser ภายใน
นาตาชายังได้สร้างสกัดสำหรับวันที่เงินที่อยู่
> >> 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