def __extract_entities(sent_obj): entities = defaultdict(list) sent = sent_obj.sentence grammar = DEFAULT_GRAMMARS combinator = Combinator(grammar) matches = combinator.resolve_matches(combinator.extract(sent), ) for j, m in matches: name = DG_INTERP[str(type(j))] start = m[0].position[0] end = m[-1].position[1] entities[name].append((start, end)) return entities
def parse_one_page (link, name_of_link): """Parses keywords from the text""" parsed_one = pd.DataFrame() text=link combinator = Combinator([ Money, Date ]) matches = combinator.resolve_matches( combinator.extract(text), strict=False ) matches = ( (grammar, [t.value for t in tokens]) for (grammar, tokens) in matches ) text_money = '' text_date = '' for i in matches: if str(i[0]).startswith('Date'): temp_value = '' for value in i[1]: temp_value+=str(value) temp_value+=' ' text_date +=temp_value elif str(i[0]).startswith('Money'): temp_value = '' for value in i[1]: temp_value+=str(value) temp_value+=' ' text_money +=str(temp_value) text_money=' '.join(unique_list(text_money.split())) text_date=' '.join(unique_list(text_date.split())) parsed_one = pd.DataFrame() parsed_one = pd.DataFrame([name_of_link, link, text_date, text_money]).T parsed_one.columns = ('name', 'link', 'date', 'money') return parsed_one
def find_facts(text, news_id): """" Find the facts in the news Agrs: title: the title text desc: the description text news_id Returns: dictionary: news_id persons -- array of {name, middlename, lastname, descriptor} locations -- array of names """ engine_per = InterpretationEngine(PersonObject) engine_loc = InterpretationEngine(LocationObject) combinator = Combinator([ Person, Location, ]) facts = Facts(news_id) matches = combinator.resolve_matches(combinator.extract(text), ) for person in list(engine_per.extract(matches)): fact = Person_(person) facts.add_to_persons(fact) matches = combinator.resolve_matches(combinator.extract(text), ) for location in list(engine_loc.extract(matches)): fact = Location_(location) facts.add_to_locations(fact) return facts.get_values()
elif 'neut' in x['inflect']: x['inflect'].remove('neut') if m.inflect(x['inflect']) is not None: ngram = m.inflect(x['inflect']).word best = True except: print('error') return ngram # rus_text = """«Группа ГАЗ» представила в рамках форума «Здоровье нации — основа процветания России» мобильный медицинский центр, созданный на базе микроавтобуса «ГАЗель NEXT». Автомобиль предназначен для проведения выездных медицинских осмотров, диагностики, диспансеризации и оказания срочной медицинской помощи. Мобильный центр состоит из двух независимых друг от друга модулей, которые могут быть оснащены необходимым набором медицинского оборудования и системами жизнеобеспечения. Фактически это два полноценных медицинских кабинета, где врачи разного профиля могут вести полноценную работу в комфортных условиях. # В базовом исполнении центр представляет собой два медицинских кабинета площадью до 8 кв. м, каждый из которых включает в себя кушетку для осмотра пациентов, стол для врача, а также набор шкафов и тумб с креплениями для различного оборудования. Кабинеты имеют отдельные входы и оборудованы изолированными санузлами. # В модулях, расположенных в микроавтобусе и прицепе, могут быть созданы кабинеты функциональной диагностики, стоматологии, офтальмологии, кардиологии, детского и женского здоровья, передвижной флюорографический и рентгенологический кабинеты, лаборатории различного назначения, передвижной донорский пункт, кабинет урологии и многое другое. # Один из возможных примеров использования автомобиля — флюорографический комплекс. В этом случае в одном модуле может быть размещен кабинет флюорографии (цифровой флюорограф, рентгензащита отсека, бактерицидный облучатель воздуха), а в другом — кабинет рентгенолога (автоматизированное рабочее место врача с набором необходимого оборудования, компьютером и принтером). ООО "Ромашка" продала порцию стажеров Ильи Кузьминова группе компаний ООО вектор.""" try: combinator = Combinator(DEFAULT_GRAMMARS) token_ners = [] token_ners_id = 0 group_ner_id = 0 for grammar, tokens in combinator.resolve_matches( combinator.extract(rus_text), strict=True): for tok in tokens: token_ners.append({ 'ner_id': group_ner_id, 'begin': tok.position[0], 'end': tok.position[1], 'token': tok.value, 'ner_type': str(grammar) }) group_ner_id += 1 df_ners = pd.DataFrame.from_dict(data=token_ners)
def parse_one_page(text, link, name_of_link): """Parse one text from one link""" text = text parsed_one = pd.DataFrame() print('parsing link:') print(link) combinator = Combinator( [Person, Organisation, Address, Street, Money, Date]) matches = combinator.resolve_matches(combinator.extract(text), strict=False) matches = ((grammar, [t.value for t in tokens]) for (grammar, tokens) in matches) text_org = '' text_person = '' text_address = '' text_money = '' text_date = '' for i in matches: if str(i[0]).startswith('Organisation'): temp_value = '' for value in i[1]: temp_value += str(value) temp_value += ' ' text_org += str(temp_value) elif str(i[0]).startswith('Person'): temp_value = '' for value in i[1]: temp_value += str(value) temp_value += ' ' text_person += str(temp_value) elif str(i[0]).startswith('Address') | str(i[0]).startswith('Street'): temp_value = '' for value in i[1]: temp_value += str(value) temp_value += ' ' text_address += temp_value elif str(i[0]).startswith('Money'): temp_value = '' for value in i[1]: temp_value += str(value) temp_value += ' ' text_money += temp_value elif str(i[0]).startswith('Date'): temp_value = '' for value in i[1]: temp_value += str(value) temp_value += ' ' text_date += temp_value text_phones = '' for match in phonenumbers.PhoneNumberMatcher(text, "RU"): text_phones += str( phonenumbers.format_number(match.number, phonenumbers.PhoneNumberFormat.E164)) text_phones += ' ' text_org = ' '.join(unique_list(text_org.split())) text_person = ' '.join(unique_list(text_person.split())) text_address = ' '.join(unique_list(text_address.split())) text_money = ' '.join(unique_list(text_money.split())) text_phones = ' '.join(unique_list(text_phones.split())) text_date = ' '.join(unique_list(text_date.split())) parsed_one = pd.DataFrame() parsed_one = pd.DataFrame([ name_of_link, link, text_org, text_person, text_address, text_money, text_phones, text_date ]).T parsed_one.columns = ('name', 'link', 'organisation', 'person', 'address', 'money', 'phone', 'date') return parsed_one
"\n", text) text = re.sub(r"(?<=[!?.,:;])\n\— (?=[а-я])", " — ", text) text = re.sub(r"\([\d]*\)", "", text) text = re.sub(r"(\.\n){2,}", "\n", text) text = re.sub(r"[IXV]+", r"", text) text = re.sub(r"\s\.\s", "\n", text) text = re.sub(r"\s([!?.,:;])", "\1", text) text = re.sub(r"\n+", "\n", text) text = re.sub(r"\n[ ]+", "\n", text) text = re.sub(r"[ ]+", " ", text) text = re.sub(r"(?<=[!?.,:;])\n\— (?=[а-я])", " — ", text) return text morph = pm.MorphAnalyzer() combinator = Combinator(DEFAULT_GRAMMARS) symbs = re.compile(r"[^А-Яа-я:!\?,\.\"— -]") clear = re.compile(r"[ _]{2,}") punct = re.compile(r"(\.\.\.|!\.\.|\?\.\.|[:!\?,\.\"—])") def _morph_line(line, normalize=True, tag=True, ner=True): if ner: for grammar, tokens in combinator.resolve_matches( combinator.extract(line)): for token in tokens: start, end = token.position line = line[:start] + "@" * (end - start) + line[end:] line = re.sub(punct, r" <\1>", line) words = line.split(" ")
from natasha import Combinator from natasha.grammars import Person, Organisation, Location from natasha.grammars.person import PersonObject from natasha.grammars.organisation import OrganisationObject from natasha.grammars.location import LocationObject, AddressObject text = 'василий петрович пришел в Санкт-Петербургский государственный университет' text = """ Иванов Иван Иванович был профессором в Санкт-Петербургском государственном университете. Он жил в городе Санкт-Петербург на набережной реки Мойки, дом 33. Улица Арбат дом 7 квартира 17 """ combinator = Combinator([Person, Organisation, Location]) # Определение Персоны matches = combinator.resolve_matches(combinator.extract(text)) enjine_person = InterpretationEngine(PersonObject) persons = list(enjine_person.extract(matches)) for i in range(len(persons)): print( 'имя:', str(persons[i].firstname).split('\'')[1] if str(persons[i].firstname) != 'None' else 'None') print( 'отчество:', str(persons[i].middlename).split('\'')[1] if str(persons[i].middlename) != 'None' else 'None') print( 'фамилия:',