def spans(self): for object in self.objects: for span in object.spans: label = span.type + '_' + object.id[-2:] yield Span(span.start, span.stop, label) label = object.type + '_' + object.id[-2:] yield Span(object.start, object.stop, label)
def select_spans(markup): for object in markup.objects: type = object.type if type == 'Person': yield Span(object.start, object.stop, object.type) elif type == 'Org': spans = [_ for _ in object.spans if _.type == 'org_name'] for span in filter_overlapping(spans): yield Span(span.start, span.stop, type) elif type in ('LocOrg', 'Location'): spans = [_ for _ in object.spans if _.type == 'loc_name'] for span in filter_overlapping(spans): yield Span(span.start, span.stop, type)
def parse_annotations(data): if 'named-entity' not in data: return for item in data['named-entity']: start = item['start'] stop = item['end'] type = item['value']['tag'] yield Span(start, stop, type)
TexterraMarkup, TexterraContainerAnnotator ) from nerus.annotators.tomita import ( TomitaMarkup, TomitaFact, TomitaContainerAnnotator ) TEXT = 'В США прядь волос третьего президента Соединенных Штатов Томаса Джефферсона продали на аукционе в Техасе за 6,9 тысячи долларов передает Life.' TESTS = [ [ DeeppavlovContainerAnnotator, DeeppavlovMarkup(text='В США прядь волос третьего президента Соединенных Штатов Томаса Джефферсона продали на аукционе в Техасе за 6,9 тысячи долларов передает Life.', spans=[Span(start=2, stop=5, type='LOC'), Span(start=38, stop=56, type='LOC'), Span(start=57, stop=75, type='PER'), Span(start=98, stop=104, type='LOC'), Span(start=137, stop=141, type='ORG')]) ], [ MitieContainerAnnotator, MitieMarkup(text='В США прядь волос третьего президента Соединенных Штатов Томаса Джефферсона продали на аукционе в Техасе за 6,9 тысячи долларов передает Life.', spans=[Span(start=2, stop=5, type='LOC'), Span(start=57, stop=75, type='PERS'), Span(start=98, stop=104, type='LOC'), Span(start=137, stop=141, type='ORG')]) ], [ NatashaContainerAnnotator, NatashaMarkup(text='В США прядь волос третьего президента Соединенных Штатов Томаса Джефферсона продали на аукционе в Техасе за 6,9 тысячи долларов передает Life.', matches=[NatashaMatch(start=2, stop=5, type='Location', fact={'name': 'сша'}), NatashaMatch(start=38, stop=75, type='Location', fact={'name': 'соединённый штат томас джефферсон'}), NatashaMatch(start=57, stop=75, type='Name', fact={'last': 'джефферсон', 'first': 'томас'})]) ], [ PullentiContainerAnnotator, PullentiMarkup(text='В США прядь волос третьего президента Соединенных Штатов Томаса Джефферсона продали на аукционе в Техасе за 6,9 тысячи долларов передает Life.', matches=[PullentiMatch(referent=Referent(label='GEO', slots=[Slot(key='ALPHA2', value='US'), Slot(key='NAME', value='США'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ'), Slot(key='TYPE', value='государство')]), span=PullentiSpan(start=2, stop=5), children=[]), PullentiMatch(referent=Referent(label='PERSON', slots=[Slot(key='SEX', value='MALE'), Slot(key='LASTNAME', value='ТОМАС'), Slot(key='FIRSTNAME', value='ДЖЕФФЕРСОН'), Slot(key='ATTRIBUTE', value=Referent(label='PERSONPROPERTY', slots=[Slot(key='REF', value=Referent(label='GEO', slots=[Slot(key='ALPHA2', value='US'), Slot(key='NAME', value='США'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ'), Slot(key='TYPE', value='государство')])), Slot(key='NAME', value='третий президент')]))]), span=PullentiSpan(start=18, stop=75), children=[PullentiMatch(referent=Referent(label='PERSONPROPERTY', slots=[Slot(key='REF', value=Referent(label='GEO', slots=[Slot(key='ALPHA2', value='US'), Slot(key='NAME', value='США'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ'), Slot(key='TYPE', value='государство')])), Slot(key='NAME', value='третий президент')]), span=PullentiSpan(start=18, stop=56), children=[PullentiMatch(referent=Referent(label='GEO', slots=[Slot(key='ALPHA2', value='US'), Slot(key='NAME', value='США'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ'), Slot(key='NAME', value='СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ'), Slot(key='TYPE', value='государство')]), span=PullentiSpan(start=38, stop=56), children=[])])]), PullentiMatch(referent=Referent(label='GEO', slots=[Slot(key='TYPE', value='штат'), Slot(key='NAME', value='ТЕХАС')]), span=PullentiSpan(start=98, stop=104), children=[]), PullentiMatch(referent=Referent(label='ORGANIZATION', slots=[Slot(key='PROFILE', value='Media'), Slot(key='NAME', value='LIFE')]), span=PullentiSpan(start=137, stop=141), children=[])]) ], [ TexterraContainerAnnotator,
def parse_spans(tokens, spans): for start, stop, type, weight in spans: start = tokens[start].start stop = tokens[stop - 1].stop yield Span(start, stop, type)
# coding: utf-8 from __future__ import unicode_literals from nerus.path import (join_path, get_dir) from nerus import load_nerus from nerus.markup import Markup from nerus.span import Span DATA_DIR = join_path(get_dir(__file__), 'data') NERUS = join_path(DATA_DIR, 'test.jsonl.gz') ETALON = Markup( text= 'Вице-премьер по социальным вопросам Татьяна Голикова рассказала, в каких регионах России зафиксирована наиболее высокая смертность от рака, сообщает РИА Новости. По словам Голиковой, чаще всего онкологические заболевания становились причиной смерти в Псковской, Тверской, Тульской и Орловской областях, а также в Севастополе. Вице-премьер напомнила, что главные факторы смертности в России — рак и болезни системы кровообращения. В начале года стало известно, что смертность от онкологических заболеваний среди россиян снизилась впервые за три года. По данным Росстата, в 2017 году от рака умерли 289 тысяч человек. Это на 3,5 процента меньше, чем годом ранее.', spans=[ Span(start=36, stop=52, type='PER'), Span(start=82, stop=88, type='LOC'), Span(start=149, stop=160, type='ORG'), Span(start=172, stop=181, type='PER'), Span(start=251, stop=260, type='LOC'), Span(start=262, stop=270, type='LOC'), Span(start=272, stop=280, type='LOC'), Span(start=283, stop=301, type='LOC'), Span(start=313, stop=324, type='LOC'), Span(start=383, stop=389, type='LOC'), Span(start=560, stop=568, type='ORG') ]) # Should work in isolation (just requirements/main.txt) def test_load_nerus():
) from pullenti_client.referent import Referent from nerus.sources.ne5 import ( Ne5Markup, Ne5Span ) from nerus.sources.factru import ( FactruMarkup, FactruObject, FactruSpan ) DEEPPALVOL_TESTS = [ [ DeeppavlovMarkup(text='«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', spans=[Span(start=52, stop=59, type='LOC'), Span(start=60, stop=76, type='PER'), Span(start=90, stop=101, type='PER'), Span(start=124, stop=140, type='ORG'), Span(start=141, stop=146, type='LOC'), Span(start=157, stop=168, type='ORG')]), Markup(text='«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', spans=[Span(start=52, stop=59, type='LOC'), Span(start=60, stop=76, type='PER'), Span(start=90, stop=101, type='PER'), Span(start=124, stop=140, type='ORG'), Span(start=141, stop=146, type='LOC'), Span(start=157, stop=168, type='ORG')]) ], ] MITIE_TESTS = [ [ MitieMarkup(text='«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', spans=[Span(start=52, stop=59, type='LOC'), Span(start=60, stop=76, type='PERS'), Span(start=90, stop=101, type='LOC'), Span(start=141, stop=146, type='LOC')]), Markup(text='«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', spans=[Span(start=52, stop=59, type='LOC'), Span(start=60, stop=76, type='PER'), Span(start=90, stop=101, type='LOC'), Span(start=141, stop=146, type='LOC')]) ], ] NATASHA_TESTS = [ [ NatashaMarkup(text='«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', matches=[NatashaMatch(start=52, stop=59, type='Location', fact={'name': 'украина'}), NatashaMatch(start=60, stop=76, type='Name', fact={'first': 'пётр', 'last': 'порошенко'}), NatashaMatch(start=90, stop=101, type='Name', fact={'first': 'варфоломей'}), NatashaMatch(start=141, stop=146, type='Location', fact={'name': 'киев'}), NatashaMatch(start=157, stop=168, type='Organisation', fact={'name': 'РИА Новости'})]), Markup(text='«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', spans=[Span(start=52, stop=59, type='LOC'), Span(start=60, stop=76, type='PER'), Span(start=90, stop=101, type='PER'), Span(start=141, stop=146, type='LOC'), Span(start=157, stop=168, type='ORG')]) ], [
import pytest from nerus.const import PER, LOC, B, I, O from nerus.token import Token from nerus.span import Span from nerus.bio import (format_bio, bio_spans, spans_bio, io_spans, spans_io) T1 = Token(0, 1, '1') T2 = Token(2, 3, '2') T3 = Token(4, 5, '3') P1 = Span(0, 1, PER) P2 = Span(2, 3, PER) P12 = Span(0, 3, PER) L2 = Span(2, 3, LOC) PB = format_bio(B, PER) PI = format_bio(I, PER) LB = format_bio(B, LOC) LI = format_bio(I, LOC) TESTS = [ [[T1, T2, T3], [], [O, O, O], [O, O, O]], [[], [], [], []], [[T1, T2, T3], [P1], [PB, O, O], [PI, O, O]], [[T1, T2, T3], [P12], [PB, PI, O], [PI, PI, O]], [[T1, T2, T3], [P1, L2], [PB, LB, O], [PI, LI, O]], [[T1, T2], [P12], [PB, PI], [PI, PI]], ] BIO_TESTS = [
def spans(self): for fact in self.facts: yield Span(fact.start, fact.stop, PER)
from nerus.annotators.tomita import (TomitaMarkup, TomitaFact) from nerus.annotators.pullenti import (PullentiMarkup, PullentiMatch, PullentiSpan) from pullenti_client.referent import Referent from nerus.sources.ne5 import (Ne5Markup, Ne5Span) from nerus.sources.factru import (FactruMarkup, FactruObject, FactruSpan) from nerus.sources.wikiner import WikinerMarkup from nerus.sources.gareev import GareevMarkup DEEPPALVOL_TESTS = [ [ DeeppavlovMarkup( text= '«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', spans=[ Span(start=52, stop=59, type='LOC'), Span(start=60, stop=76, type='PER'), Span(start=90, stop=101, type='PER'), Span(start=124, stop=140, type='ORG'), Span(start=141, stop=146, type='LOC'), Span(start=157, stop=168, type='ORG') ]), Markup(text= '«Объединительный собор», инициированный президентом Украины Петром Порошенко и патриархом Варфоломеем, пройдет 15 декабря в Софийском соборе Киева, передает РИА Новости.', spans=[ Span(start=52, stop=59, type='LOC'), Span(start=60, stop=76, type='PER'), Span(start=90, stop=101, type='PER'), Span(start=124, stop=140, type='ORG'), Span(start=141, stop=146, type='LOC'), Span(start=157, stop=168, type='ORG')
def from_corus(cls, record): return WikinerMarkup(record.text, [Span(*_) for _ in record.spans])
def spans(self): for match in self.matches: yield Span(match.start, match.stop, match.type)
from nerus.path import (join_path, get_dir) from nerus.const import BSNLP_DIR from nerus.span import Span from nerus.sources.bsnlp import (BsnlpMarkup, BsnlpSource) DATA_DIR = join_path(get_dir(__file__), 'data') ETALON = [ BsnlpMarkup( text= 'Климкин рассказал, чего ожидает от газовых переговоров с Россией в Брюсселе\n\nУкраина во время второго раунда трехсторонних переговоров в Брюсселе будет настаивать на том, что транзит газа должен происходить в соответствии с нормами европейского законодательства. Об этом заявил министр иностранных дел Украины Павел Климкин на совместном брифинге с главой МИД Литвы Линасом Линкявичюсом в четверг, 10 января, передает\n\n"Наша позиция относительно будущего транзита, а также по европейской энергетической безопасности предельно четкая: мы готовы выполнить все соответствующие европейские регуляторные нормы для нашей газотранспортной системы. Мы считаем, что будущий транзит должен базироваться на прозрачных и эффективных регуляторах ЕС", - сказал Климкин. "Это означает, например, что газ будет покупаться на восточной границе Украины, что транзитный тариф будет рассчитываться по европейской методологии. То есть общий смысл нашей позиции - транзит должно происходить в соответствии с европейским законодательством ", - отметил глава МИД.\n\nОн подчеркнул, что общей позицией Украины и Литвы является то, что требования европейского законодательства должны быть распространены и на Nord stream-2, что фундаментально повысит европейскую энергетическую безопасность против России. Подытоживая, Климкин подчеркнул, что Украина готова к конструктивному диалогу о будущем транзита газа в Европу, но он должен базироваться на очень четких условиях, самое главное из которых - соответствие нормам европейского законодательства для обеспечения четких, эффективных и прозрачных предпосылок транзита. "Поэтому во время переговоров в Брюсселе 21 января мы будем исходить из этих очень простых, но очень важных требований", - отметил Климкин. Ранее глава НАК "Нафтогаз Украины" Андрей Коболев заявил о готовности Украины, при согласовании этого вопроса правительством, обсудить возможность просмотра или отказа от второго транзитного иска к российскому "Газпрому" на сумму более 12 млрд долларов в привязке с заключением нового долгосрочного контракта. Действующий контракт по транзиту российского газа через Украину заканчивается в конце 2019 года.\n', spans=[ Span(start=0, stop=7, type='PER'), Span(start=57, stop=64, type='LOC'), Span(start=67, stop=75, type='LOC'), Span(start=77, stop=84, type='LOC'), Span(start=137, stop=145, type='LOC'), Span(start=302, stop=309, type='LOC'), Span(start=310, stop=323, type='PER'), Span(start=356, stop=365, type='ORG'), Span(start=366, stop=386, type='PER'), Span(start=733, stop=735, type='ORG'), Span(start=747, stop=754, type='PER'), Span(start=827, stop=834, type='LOC'), Span(start=1035, stop=1038, type='ORG'), Span(start=1075, stop=1082, type='LOC'), Span(start=1085, stop=1090, type='LOC'), Span(start=1181, stop=1194, type='PRO'), Span(start=1270, stop=1276, type='LOC'), Span(start=1291, stop=1298, type='PER'), Span(start=1315, stop=1322, type='LOC'), Span(start=1382, stop=1388, type='LOC'),
def from_corus(self, record): return GareevMarkup(record.text, [Span(*_) for _ in record.spans])
from nerus.path import (join_path, get_dir) from nerus.const import WIKINER_FILENAME from nerus.span import Span from nerus.sources.wikiner import (WikinerMarkup, WikinerSource) DATA_DIR = join_path(get_dir(__file__), 'data') ETALON = [ WikinerMarkup( text= 'На севере граничит с Латвией , на востоке -- с Белоруссией , на юго-западе -- c Польшей и Калининградской областью России .', spans=[ Span(start=21, stop=28, type='LOC'), Span(start=47, stop=58, type='LOC'), Span(start=80, stop=87, type='LOC'), Span(start=90, stop=114, type='LOC'), Span(start=115, stop=121, type='LOC') ]) ] def test_load(): path = join_path(DATA_DIR, WIKINER_FILENAME) guess = list(WikinerSource.load(path)) assert guess == ETALON
def spans(self): for match in self.walk(): start, stop = match.span yield Span(start, stop, match.referent.label)
from nerus.path import (join_path, get_dir) from nerus.const import GAREEV_DIR from nerus.span import Span from nerus.sources.gareev import (GareevMarkup, GareevSource) DATA_DIR = join_path(get_dir(__file__), 'data') ETALON = [ GareevMarkup( text= 'МОСКВА , 21 июня . / БИЗНЕС-ТАСС / . Группа НЛМК заняла второе место в рейтинге 35 наиболее конкурентоспособных сталелитейных компаний мира . Рейтинг составлялся World Steel Dynamics , ведущей международной исследовательской компанией , на основе оценки 23 параметров , включая расширение мощностей , близость к растущим рынкам сбыта и покупателям , производство продукции с высокой добавленной стоимостью , рентабельность , технологические инновации и другие . Об этом говорится в сообщении НЛМК . World Steel Dynamics высоко оценил такие преимущества НЛМК как низкие производственная себестоимость , самообеспеченность сырьем , высокие финансовые показатели , близость к рынкам сбыта , ценовая политика , деятельность компании в области социальной и экологической ответственности и безопасности труда . В рейтинге World Steel Dynamics НЛМК с 2007 года занимает стабильные позиции среди 6 крупнейших мировых металлургических компаний по уровню конкурентоспособности . Компания World Steel Dynamics является одним из авторитетных исследовательских центров в области металлургии и мировым лидером в области информационных продуктов , отражающих развитие черной металлургии в мире . Сотрудники WSD регулярно анализируют и публикуют исследования мировых цен на металлопрокат , всех составляющих производственных затрат в черной металлургии , факторов , определяющих спрос и предложение на стальном рынке , а также исследования финансовых показателей компаний-производителей стали в мире . В фокусе WSD постоянно находятся стратегические для черной металлургии вопросы . Сотрудники фирмы регулярно участвуют в специализированных исследованиях , проводимых в интересах различных заказчиков , предоставляют частные консультации , осуществляют консультационные услуги по вопросам инвестиций в ценные бумаги компаний черной металлургии . НЛМК – международная вертикально интегрированная металлургическая компания . Предприятия НЛМК расположены в России , Европе и США . Мощности по производству жидкой стали компании превышают 15 млн тонн в год . Выручка НЛМК в 2011 году составила 11,7 млрд долларов , рентабельность по показателю EBITDA составила 19,5 проц . Акции НЛМК торгуются в России на фондовой площадке РТС-ММВБ , а также в форме глобальных депозитарных акций на Лондонской фондовой бирже .', spans=[ Span(start=21, stop=32, type='ORG'), Span(start=44, stop=48, type='ORG'), Span(start=162, stop=182, type='ORG'), Span(start=492, stop=496, type='ORG'), Span(start=499, stop=519, type='ORG'), Span(start=553, stop=557, type='ORG'), Span(start=816, stop=836, type='ORG'), Span(start=837, stop=841, type='ORG'), Span(start=978, stop=998, type='ORG'), Span(start=1192, stop=1195, type='ORG'), Span(start=1495, stop=1498, type='ORG'), Span(start=1830, stop=1834, type='ORG'), Span(start=1919, stop=1923, type='ORG'), Span(start=2047, stop=2051, type='ORG'), Span(start=2159, stop=2163, type='ORG'), Span(start=2204, stop=2212, type='ORG'), Span(start=2264, stop=2289, type='ORG') ]) ]
def from_corus(self, record): return BsnlpMarkup( record.text, [Span(_.start, _.stop, _.type) for _ in record.spans] )