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
示例#3
0
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()
示例#4
0
                            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
示例#6
0
        "\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(" ")
示例#7
0
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(
        'фамилия:',