# !python3 -m pip install natasha
Named Entity Recognition (NER)¶
Воспользуемся готовыми инструментами для выделения именованных сущностей
Создадим базовый пайплаин для NER
- Воспользуемя библиотекой
natasha
и используем регулярные выражениеre
import os
import re
from tqdm import tqdm
# загружаем все компоненты которые нам понадобятся
from natasha import (Segmenter,MorphVocab,
NewsEmbedding,NewsMorphTagger,NewsSyntaxParser,NewsNERTagger,
PER,NamesExtractor,DatesExtractor,MoneyExtractor,AddrExtractor,
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)
# dates_extractor = DatesExtractor(morph_vocab)
# money_extractor = MoneyExtractor(morph_vocab)
# addr_extractor = AddrExtractor(morph_vocab)
Чтение данных¶
Читаем данные
with open('res.txt', 'r') as f:
text = f.read().strip()
text
'Предположение о том, что мы произошли от обезьяны в 21 веке терпит крах. Ученые зашли в тупик. За годы исследований им так и не удалось доказать теорию эволюции и найти общих предков человека и приматов. Иначе современные шимпанзе или гориллы уже давно превратились бы в людей. Мы слишком не похожи друг на друга, чтобы быть родственниками. И даже генетики это подтверждают. Так что Дарвин был неправ. Никакого отношения человек к обезьянам не имеет. До сих пор ученые, биологи, палеонтологи, антропологи и прочие, и типа меня персонажи, вынуждены это опровергать. И поэтому нынче я, Станислав Дорбышевский, буду жарить этот дурацкий миф вместе с Рбака Трендами. На планете существует очень много млекопитающих. И эти млекопитающие по-разному родственны друг другу. Есть мерзуны, рукокрылые, хищные, копытные, китообразные, панголины и всякие прочие. А есть приматы. Приматов много разных. И удивительным образом, человек это просто один из великого множества этих самых приматов. И это родство, если еще в 18-19 веке было недалеко очевидно и не до конца очевидно, то за последние где-то лет сто уже более-менее разобрались. И главная группа самых живых организмов уже давно наведен в полный порядок. Отряд приматов характеризуется съедностью, древесностью, кастритейки размножения, когда мало детенышей долго выращиваются. Ну и на самом деле главное анатомия. То есть определенным набором зубов, строением зубов, той же самой генетикой, биохимией и так далее. И по всем этим параметрам человек это примат просто одна из обезьян. У нас тот же самый набор зубов и более того очень примитивный, очень такой простой незамысловатый. Ну базовое строение подобное было уже 40 миллионов лет назад на самом деле. Ну а порядка 26 миллионов лет назад сложился там этот самый узор дриапи-тега, так называемый на зубах. Ну такой гоминоидный, гоминидный даже. И в принципе с тех пор зубы принципиально не менялись. Немножко изменялись пропорции, размеры, там клыки стали чуть поменьше у нас. И наши зубы, по сути это чуть там как бы покрупнее зубы проконсула. Строение наших ручек, ножек тоже вообще совсем базовое. То есть весь набор костей у нас даже не срослась, малая берцовая, с большой, как это у долгопятов например произошло. У нас все то же самое, запястья, пястья, фаланги пальцев, ногти, все как у обезьян. И если мы посмотрим кисть того же самого проконсула или там еще кого-то более древнего даже, ну уж тем более более позднего, и человеческой разницы там будет немного. Да у нас на позднем этапе, два с половиной миллиона лет назад и даже позже там до полтора миллионов лет добавился трудовой комплекс кисть, но на фоне того, что существует других приматтов это ни о чем. Например если взять современных наших ближайших родственников гориллы шимпанзе, то мы увидим, что у них есть комплекс хождения на согнутых пальцах. Костяшкохождение этот комплекс гораздо более специфичен, чем наш трудовой на самом деле. Ну потому что он испытывает большие нагрузки до самой комплекса, самой эти кисти и соответственно гораздо более ответственный. А мы можем жить с трудовым комплексом, а можем в чем-то и без. То есть наша кисть очень проста, очень замасловата, а ежели брать какую-то отдельную кость из нее, ну допустим плечевую, то отличить человеческую от шимпанзиной крайне проблематично. И если это ископаемый кто-нибудь, какая-нибудь там австралопитек, то бывает очень трудно понять чья кость. Более того, в некоторых отношениях своей скелетной системы мы очень примитивны. Ну, например, у нас в копчиковом отделе четыре копчиковых позвонка, а у современного шимпанзе и даже у орнегутана в среднем три копчиковых позвонка. То есть мы хвостатее, чем шимпанзе, мы отстали от них, мы примитивные. И поэтому наша бесхвостость, это не то что человеческая черта, это человеческая черта, да, но она примитивная среди даже наших вот родственников антропоидов. Некоторые из нюансов нашей эволюции до сих пор еще находят какие-то дополнительные подтверждения, выслеживание, например, по генетике. Ну, например, вот совсем-таки недавно, в 2021, кажется, году, была чудесная статья про генетику исчезновения нашего хвоста. Довольно долго считалось, что хвост исчезал как бы постепенно по маленьку, потому что в начале был большой такой балансир, потом стал покороче-покороче-покороче и стал совсем маленький. Но было показано, что существует очень небольшое на самом деле количество мутаций и подробнейше описано, как все это происходило. Короче говоря, там буквально всего парочка мутаций, кроме того, что хвост бац и исчез. То есть вот они только же убегали с большими, а тут бац уже и с маленькими, вообще уже без хвоста. То есть на самом деле эволюционный процесс иногда может происходить реально очень быстро в течение буквально таких нескольких мутаций. Ну, если эти мутации дают какое-то преимущество или как минимум не оказываются вредными, а для первых человекообразных отсутствие хвоста не было вредным, потому что они уже не прыгали так далеко, как их предки по ветвям, и хвост в качестве балансира смысл потерял. И показано, что подобные же мутации бывают, например, у мышей. Вот, но мышам хвостик все-таки нужен, поэтому мыши обычно таки с хвостами. Некоторые маленькие мутации выражаются в больших внешних изменениях. Ну, например, редукция шерсти, как бы очевидно, что обезьяна волосатая, а мы типа лысые. Однако же, если посчитать количество волосяных луковиц на коже, то у человека шимпанзе оно примерно одинаковое. Потому что, например, на первый взгляд кажется, что у нас лоб совсем лысый, а если посчитать количество волосяных луковиц, там столько же, сколько на волосице части головы. И лоб-то у нас с мохнатой, на самом деле, это даже можно потрогать и приощутить, если аккуратненько-аккуратненько потрогать свой лобошник. Ну, а, например, волосатость груди у человека больше, чем у гориллы. У гориллы там вообще практически нет волос, а у человека очень даже есть. Поэтому мы тоже волосяты, на самом-то деле. Просто есть гены, генерирующие как бы сам белок, ну, программирующие сам белок, кератин, а есть гены, регулирующие, сколько этого кератина нарастет. И вот какой кератин – это одно и то же, что у нас шимпанзе, а сколько? У шимпанзе много получается, у нас этот ген поломанный, он нормально не регулирует и мало получается. Но и у нас, и у шимпанзе, например, нет подшорстка, и его нет вообще у всех человекообразных, очень-очень редко бывает у мартышкообразных, ну и там чуть более часто, но тоже редко, уши, раконосок каких-то обезьян. Генетика – это основа нашей наследственности, да, это вот АБВГД, в котором записано и биохимия, и строение, и анатомия, и даже поведение. И мы видим, что эта самая генетика нас и шимпанзе расходятся на какие-то жалоки, там 2,4%, потому что важно не сколько замен нуклеотидов, а что значат эти замены. У нас есть масса незначимых замен, а есть очень немного значимых, но которые всю разницу собственности составляют. И ориентируясь на генетику, мы опять же видим, что человека шимпанзе – это почти одно и то же, то есть между, скажем, индийским и африканским слоновами разница гораздо больше вообще-то, и вот поиск генетических разниц между человеком и обезьяной – это такая, скажем, непростая задача. Ну и обнаружившись, что там есть какие-то гены, ответственный зречь, развитие мозга. Буквально таки в 2022 году недавно была статья про то, как там некоторые очень маленькие мутации привели к тому, что наши мозги получили возможность бурно расти и распухать, и очень немногочисленные одноразовые, можно сказать, такие мутации могли иметь очень далекие последствия и привели нас на вершину эволюции, как нам кажется, по крайней мере, мы на вершине, и сделать нас умными, говорящими и все такое прочее. Поедение – тоже разница человека и нечеловека, ну казалось бы очевидно, мы такие шибко умные, говорящие, мегаобщительные, а на практике сводится к очень небольшому количеству свойств. Разницы, конечно, есть. Человек гораздо более спокойный, он контролирует свои какие-то вот эти позывы внутренние, то, что у него все-таки мышление развито чуть получше, он намного более занудный, он очень склонен учить и учиться, и склонен больше договариваться, нежели бить друг другу по мордасам, а шампанзе, ну примерно все то же самое, но в обратную сторону. То есть она агрессивнее, она менее спокойная, она быстро переключается, она учится просто наблюдением, но не целенаправленной, не склонна учить кого-то, ну зато на собственном опыте, а так по большому счету то же самое. И если, например, научить обезьян говорить, ну на языке жестов, например, то они говорят не то, что не хуже человека, но на уровне двухлетнего ребенка вполне себе, ну так у них и мозков три раза меньше, в общем-то. Так что различия получаются не качественные, а скорее такие количественные, и все главные свойства, наши поведения, которые мы склонны считать сугубо человеческими, доброта, юмор, способность к обману, ругательство даже, да, и прочее-прочее, у человека и у обезьян строго одинаковые, и уж особенно здорово, это видно по палеонтологическим данным, потому как уже 200 лет примерно палеонтологи выкапывают всяческие запчасти из земли, сравненных между собой, и нынче у нас есть полная последовательность от Пургаториуса, который жил 66 миллионов лет назад, который был размером с крысу, ну даже поменьше, там грамм 20 он там весил, ну там до 100 грамм, может с максимум, и с видом землеройки, и вот от этого самого Пургаториуса, и до нас есть все главные промежуточные формы. Где-то что-то у нас не до конца известное, в каких-то отрезках времени у нас, скажем, только зубы полно скелетов нет, да, потому что обезьяны прыгали по деревьям, и в палеонтологические келетки попадали, к сожалению, далеко не всегда, ну тем более, что большая часть истории их варилась где-то в тропиках, где просто палеонтологи не сильно копали, вот, но даже при всем этом у нас есть безумное количество палеонтологических данных, мы живем в чудесное время, когда мы не просто догадываемся, что были какие-то там промежуточные, там, недостающие звенья, когда мы их видим, просто в ручках можем поддержать и понять с какой стати они вылезали на деревья, как они слизались с деревьев, почему они меняли свою диету, брали в руки булыжники, начинали расселяться там из тропических зон куда-то, и такие вот замечательные находки показывают вот эти самые планненки переходы. Один из частейших таких аргументов тех, кто не верит в предосхождение человека от обезьяны, что, дескать, а почему же тогда сейчас современные обезьяны не превращаются в людей? Аргумент дебильный, потому что существует много разных экологических ниш и много разных эволюционных путей, и даже к одной экологической нише можно приспособиться по-разному, что зависит от каких-то сиюминутных нюансов, от наличия мутаций необходимых и от исторической истории, вот этой всей эволюционной истории, которая была до, и нету вообще никакой эволюционной силы, которая бы двигала кого-то в сторону человека, у каждого живого существования есть свой эволюционный путь, современные мартышки эволюци Statue эволюционировали в мартышек, потому что их предаки не совсем так, как мы, у них были другие предпосылки, у них были другие там нюансы, у них было другое поведение, у них были свои мутации, потому что у них были другие задачи, они по-другому питались, они другое運ались, они были другого размера, они сталкивались с другими конкурентами, некоторые из них эволюционировали вообще, на других каких-то землях, ну например,iskari, например, где условия все-таки совсем не такие, как у нас. Вот, а где-то там кто-то в юго-восточной азике, гибоны, где леса просто гущие, а кто-то в Африке, где сувенизация шла в полном рост и, соответственно, им там на землю надо было спускаться. Но те же гибоны от исходника отличаются сильно больше, чем мы. На самом деле, они гораздо более эволюционно продвинуты. Почему вы до сих пор, спрашивающие меня про обезьян, не вульсинировали в гибоны? Непорядок. Далеко еще вам до гибона, который является вершиной эволюции, у которого руки вот такой длины, мозги вот такие, они очень добрые, между прочим, и петь умеют очень хорошо. Сам по себе вот этот подход, что почему обезьяна не становится человеком, обезьян много разных. Есть руконожки, есть кольцехвостные лемуры, есть какие-нибудь толстые лори, а есть тонкие лори, а есть много пятые, а есть макайки такие, есть сики, есть павианы, есть гибоны, орангутаны, горилла, шимпанзе. И каждая из этих тварей, она прошла свой отдельный путь. Я уж помолчу еще про сон ископаемых приматов, которых вообще немеренное количество, которые шли еще своими какими-то путями. Да даже люди эволюционировали сильно и не одинаково на самом деле, потому что окроме нас были еще няндертальцы параллельно, диннисовцы, хоббиты флорецкие, хоббиты лусонские, какие-то там западноафриканские, эти непонятные там, ивэлэруэйдинсис, и там, бог знает, кто еще, ну даже банально, я не знаю, даже среди современного это человечество и то, разнообразие велико. Вот почему все не эволюционируют в австралийских аборигенов? Ну потому что не все живут в Австралии и жили в прошлом, да? Поэтому если мы будем подходить чисто практически, да, как вот в современности, например, юриспунденции устанавливается родство людей, отцовство, например, да, кто папа, кто мама, кто дедушка, бабушка, то окажется, что да, это такие человек-обезьяны. Можно, конечно, игнорировать, это легко, вот, но можно не знать, ну если не интересоваться вообще, но если иметь хоть минимальное желание, это такая прорва информации, что в нем можно булькнуться, погрузиться с ногами, с головой, с ушами и всю жизнь там кувыркаться в этой информации. Чем я, например, занимаюсь и спорить о том, что человек не произошел от обезьяны, ну как-то даже наивно. Если уж мы есть обезьяны, то куда деваться? Вот мы особенные обезьяны, мы можем думать о других обезьянах, изучать других обезьян и планировать свое обезьянье будущее, чем мы замечательны. Так что занимайтесь лучше этим, а не бредом, а не всякими мифами.'
len(text)
13899
natasha
document¶
Иницилизируем класс которые будет хранить все данные о тексте, в отличие от spacy
, doc это не готовая pipeline
Нам надо будет вызывать отделные методы для того чтобы заполнить содержание которое нас интересует:
.segmenter
- токенизация, разбиваем на предложение.tag_morph
- морфологический разбор токенов (e.g. NOUN).tag_ner
- выделение именованных сущностей
doc = Doc(text)
doc
Doc(text='Предположение о том, что мы произошли от обезьяны...)
[a for a in dir(doc) if not a.startswith('_')]
['as_json', 'clear_envelopes', 'envelop_sent_spans', 'envelop_sent_tokens', 'envelop_span_tokens', 'from_json', 'morph', 'ner', 'parse_syntax', 'segment', 'sents', 'spans', 'syntax', 'tag_morph', 'tag_ner', 'text', 'tokens']
# vars(doc)
Разбиваем документ на предложения и токены¶
Разбиваем текста на токены (tokens
) и предложения (sents
), данные сохраняются в doc
# Добавляем в doc tokens, sents
doc.segment(segmenter)
display(doc) # документ
display('sentences',doc.sents[:3]) # предложения
display('tokens',doc.tokens[:5]) # токены
Doc(text='Предположение о том, что мы произошли от обезьяны..., tokens=[...], sents=[...])
'sentences'
[DocSent(stop=72, text='Предположение о том, что мы произошли от обезьяны..., tokens=[...]), DocSent(start=73, stop=94, text='Ученые зашли в тупик.', tokens=[...]), DocSent(start=95, stop=203, text='За годы исследований им так и не удалось доказать..., tokens=[...])]
'tokens'
[DocToken(stop=13, text='Предположение'), DocToken(start=14, stop=15, text='о'), DocToken(start=16, stop=19, text='том'), DocToken(start=19, stop=20, text=','), DocToken(start=21, stop=24, text='что')]
Выделяем часть речи¶
Вызовим метод tag_morph
и передадим объект morph_tagger
- Сделаем морфологический разбор документа
- "POS" - часть речи
# выделяем части речи
doc.tag_morph(morph_tagger)
doc.parse_syntax(syntax_parser)
display(doc.tokens[:15])
[DocToken(stop=13, text='Предположение', id='1_1', head_id='1_13', rel='nsubj', pos='NOUN', feats=<Inan,Acc,Neut,Sing>), DocToken(start=14, stop=15, text='о', id='1_2', head_id='1_3', rel='case', pos='ADP'), DocToken(start=16, stop=19, text='том', id='1_3', head_id='1_1', rel='nmod', pos='PRON', feats=<Inan,Loc,Neut,Sing>), DocToken(start=19, stop=20, text=',', id='1_4', head_id='1_7', rel='punct', pos='PUNCT'), DocToken(start=21, stop=24, text='что', id='1_5', head_id='1_7', rel='mark', pos='SCONJ'), DocToken(start=25, stop=27, text='мы', id='1_6', head_id='1_7', rel='nsubj', pos='PRON', feats=<Nom,Plur,1>), DocToken(start=28, stop=37, text='произошли', id='1_7', head_id='1_3', rel='acl', pos='VERB', feats=<Perf,Ind,Plur,Past,Fin,Act>), DocToken(start=38, stop=40, text='от', id='1_8', head_id='1_9', rel='case', pos='ADP'), DocToken(start=41, stop=49, text='обезьяны', id='1_9', head_id='1_7', rel='obl', pos='NOUN', feats=<Anim,Gen,Fem,Sing>), DocToken(start=50, stop=51, text='в', id='1_10', head_id='1_12', rel='case', pos='ADP'), DocToken(start=52, stop=54, text='21', id='1_11', head_id='1_12', rel='amod', pos='ADJ'), DocToken(start=55, stop=59, text='веке', id='1_12', head_id='1_13', rel='obl', pos='NOUN', feats=<Inan,Loc,Masc,Sing>), DocToken(start=60, stop=66, text='терпит', id='1_13', head_id='1_3', rel='acl', pos='VERB', feats=<Imp,Ind,Sing,3,Pres,Fin,Act>), DocToken(start=67, stop=71, text='крах', id='1_14', head_id='1_13', rel='obj', pos='NOUN', feats=<Inan,Acc,Masc,Sing>), DocToken(start=71, stop=72, text='.', id='1_15', head_id='1_13', rel='punct', pos='PUNCT')]
Выделяем именнованые сущности¶
- Для выделения именованных сущностей в документе вызываем
tag_ner
- Именованные сущности сохраняются в
.spans
- В
spans.type
сохраняется класс именованной сущности - В
spans.text
сохраняется выделенная именнованая сущность
- В
doc.tag_ner(ner_tagger)
len(doc.spans)
8
doc.spans
[DocSpan(start=383, stop=389, type='PER', text='Дарвин', tokens=[...]), DocSpan(start=584, stop=606, type='PER', text='Станислав Дорбышевский', tokens=[...]), DocSpan(start=647, stop=661, type='PER', text='Рбака Трендами', tokens=[...]), DocSpan(start=7655, stop=7663, type='PER', text='Поедение', tokens=[...]), DocSpan(start=9141, stop=9153, type='PER', text='Пургаториуса', tokens=[...]), DocSpan(start=9349, stop=9361, type='PER', text='Пургаториуса', tokens=[...]), DocSpan(start=11547, stop=11553, type='LOC', text='Африке', tokens=[...]), DocSpan(start=12972, stop=12981, type='LOC', text='Австралии', tokens=[...])]
set([s.text for s in doc.spans])
{'Австралии', 'Африке', 'Дарвин', 'Поедение', 'Пургаториуса', 'Рбака Трендами', 'Станислав Дорбышевский'}
for span in doc.spans:
print(span.text,span.type)
Дарвин PER Станислав Дорбышевский PER Рбака Трендами PER Поедение PER Пургаториуса PER Пургаториуса PER Африке LOC Австралии LOC
Можно лемматизировать содержание используя .normalize
, данные сохраняются в span.normal
# лемматизируем извлеченные сущности
for span in doc.spans:
span.normalize(morph_vocab)
{s.text: s.normal for s in doc.spans}
{'Дарвин': 'Дарвин', 'Станислав Дорбышевский': 'Станислав Дорбышевский', 'Рбака Трендами': 'Рбака Тренды', 'Поедение': 'Поедение', 'Пургаториуса': 'Пургаториус', 'Африке': 'Африка', 'Австралии': 'Австралия'}
# извлечем персон
for span in doc.spans:
if(span.type == PER):
span.extract_fact(names_extractor)
{s.normal: s.fact.as_dict for s in doc.spans if s.fact}
{'Дарвин': {'last': 'Дарвин'}, 'Станислав Дорбышевский': {'first': 'Станислав', 'last': 'Дорбышевский'}, 'Рбака Тренды': {'last': 'Рбака'}}
# лемматизация
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
from functools import lru_cache
dataset_folder = '.'
files = os.listdir(dataset_folder)
files = [i for i in files if '.txt' in i]
files
['res.txt', 'res2.txt']
texts = []
for f in files:
with open(os.path.join(dataset_folder, f), 'r') as fo:
texts.append(fo.read())
def get_ner_natasha(text):
text = re.sub(r'[^s\d\w\-:,\.\?\!]', ' ', text) # убираем пунктуация
doc = Doc(text) # создаем natasha документ
doc.segment(segmenter) # tokenise, sentences
doc.tag_ner(ner_tagger) # tag NER
# normalise using morpher
for span in doc.spans:
span.normalize(morph_vocab)
res = set((s.normal for s in doc.spans))
return res
(2) NER с re
Воспомогательная функция для NER с re
, воспользуемся регулярками и лемматизатора из pymorphy2
@lru_cache(10000)
def lemmatize(s):
s = str(s).lower()
return morph.parse(s)[0].normal_form.capitalize()
reg1 = re.compile(r'[^s\d\w\-:,\.\?\!]')
reg2 = re.compile(r'([\.\?!])')
def get_ner_regex(s):
s = reg1.sub(' ', s)
s = reg2.sub(r'\g<1><sep>', s)
# разбиваем на предложения
sent1 = [sent.strip() for sent in s.split('<sep>')]
sent2 = [' '.join(ss.split()[1:]) for ss in sent1]
res = []
for ss in sent2:
res.extend([e.strip() for e in re.findall(r'(?:[A-ZА-ЯЁ][A-ZА-ЯЁа-яёa-z\d-]+\s*)+', ss)])
return set((lemmatize(s) for s in res))
(3) Объединим результаты из natasha
с re
def get_ner(text):
return get_ner_regex(text).union(get_ner_natasha(text))
Проверка подхода¶
Подтвердим что все работает по отдельности
get_ner_natasha
нам возвращает сущности которые выделилаnatasha
get_ner_regex
нам возвращает сущности которые выделилre
get_ner
нам возващает объединение двух подходов
text = texts[1]
print(text)
Ракета-носитель «Союз-СТ-А» успешно запущена из Гвианского космического центра 26 апреля в 0:02 по московскому времени. На борту находились спутники Sentinel-1B, Microscope и FYS, сообщает Роскосмос. Sentnel-1B предназначен для наблюдения за сушей и океанами в радиодиапазоне. Спутник идентичен запущенному двумя годами ранее Sentinel-1A, оба аппарата Sentinel-1 будут работать в паре, собирая данные с противоположных точек орбиты. Sentinel-1 помогают следить за состоянием океанов, ледников и лесов. Получаемые с орбиты данные используются для обнаружения айсбергов и нефтяных разливов, а также для предоставления актуальных картографических данных при чрезвычайных ситуациях. Кроме того, данные со спутников используются в различных «непрофильных» исследованиях. Например, группа немецких ученых опубликовала исследование о предполагаемом месте испытаний северокорейского ядерного и термоядерного оружия, в работе использовался и интерферометрический снимок предполагаемого места, сделанный Sentinel-1A. Запуск спутников группировки Sentinel производится в рамках проекта мониторинга окружающей среды «Коперник», созданного Европейской комиссией совместно с Европейским космическим агентством. На протяжении ближайших дней инструменты спутника будут откалиброваны и зонд приступит к работе. Первый спутник группировки Sentinel был выведен на орбиту 3 апреля 2014, всего к запуску планируется шесть разных модификаций Sentinel с различной специализацией. Предыдущий спутник Sentinel-3A был выведен на орбиту в феврале 2016 года. Николай Воронцов
# NER который нашел natasha
get_ner_natasha(text)
{'FYS', 'Гвианского космического центра', 'Европейским космическим агентством', 'Европейской комиссией', 'Коперник', 'Николай Воронцов', 'Роскосмос'}
# NER который нашел re
get_ner_regex(text)
{'Fys', 'Microscope', 'Sentinel', 'Sentinel-1', 'Sentinel-1a', 'Sentinel-1b', 'Sentinel-3a', 'Воронцов', 'Гвианский', 'Европейский', 'Коперник', 'Роскосмос', 'Союз-ст-'}
# объединим подходы
get_ner(text)
{'FYS', 'Fys', 'Microscope', 'Sentinel', 'Sentinel-1', 'Sentinel-1a', 'Sentinel-1b', 'Sentinel-3a', 'Воронцов', 'Гвианский', 'Гвианского космического центра', 'Европейский', 'Европейским космическим агентством', 'Европейской комиссией', 'Коперник', 'Николай Воронцов', 'Роскосмос', 'Союз-ст-'}
Работа на реальном примере¶
Все нормально работает, теперь возмем наш основной корпус документов (отзывы о банке)
import pandas as pd
df_review = pd.read_csv('review_cleaned.csv',usecols=['user','review_cleaned'])
user_review = list(df_review['user'].values)
actual_review = list(df_review['review_cleaned'].values)
user_review = user_review[:50]
actual_review = actual_review[:50]
res_ners = []
for text in tqdm(actual_review):
res_ners.append(get_ner(text))
100%|██████████| 50/50 [00:03<00:00, 16.43it/s]
Пример NER для одного отзыва
ner_tagged = pd.DataFrame({'user':user_review,'review':actual_review,'ner_tags':res_ners})
ner_tagged.head()
user | review | ner_tags | |
---|---|---|---|
0 | dncmail | Поделюсь с вами историей, которая произошла со... | {Вы, Сбер, MasterCard Standard, Евгении, Maste... |
1 | fomicevaa851 | Сама недавно узнала, что в Сбербанке можно пол... | {Сбербанк, Сбербанка, Сбербанке, Активный} |
2 | AlexStulov | Сбер потерял мой миллион. В апреле брал ипотек... | {Ивановский, Сбер, Сбр, Сбере, Ивановская обл,... |
3 | Zakharkot | Доброго времени суток всем, я открыл в Сбере в... | {Сбер, Сбере} |
4 | sanaan | Живу с мамой, оплатой коммунальных платежей до... | {Сбербанка, Сбербанк, Qr-код} |
# сохраняем NER данные для всех документов в CSV
ner_tagged.to_csv('ner_tags.csv',index=False)