Natasha

Natasha — библиотека для поиска и извлечения именованных сущностей (Named-entity recognition) из текстов на русском языке. В библиотеке собраны грамматики и словари для парсера Yargy. На данный момент разбираются упоминания персон, даты и суммы денег.

Использование

Natasha имеет лаконичный интерфейс. Доступно три типа экстракторов:

from natasha import NamesExtractor, DatesExtractor, MoneyExtractor

Экстрактор принимает на вход текст и возвращается список метчей:

extractor = NamesExtractor()
text = '''
Простите, еще несколько цитат из приговора. «…Отрицал существование
Иисуса и пророка Мухаммеда», «наделял Иисуса Христа качествами
ожившего мертвеца — зомби» [и] «качествами покемонов —
представителей бестиария японской мифологии, тем самым совершил
преступление, предусмотренное статьей 148 УК РФ
'''
matches = extractor(text)
matches
Простите, еще несколько цитат из приговора. «…Отрицал существование Иисуса0 и пророка Мухаммеда1», «наделял Иисуса Христа2 качествами ожившего мертвеца - зомби» [и] «качествами покемонов - представителей бестиария японской мифологии, тем самым совершил преступление, предусмотренное статьей 148 УК РФ

Каждый метч имеет два основных атрибута: span и fact. span определяет границы метча:

for match in matches:
    start, stop = match.span
    print(start, stop, text[start:stop])
69 75 Иисуса
86 95 Мухаммеда
107 120 Иисуса Христа

В fact находится объект с атрибутами:

for index, match in enumerate(matches):
    print(index, match.fact)
0 Name(first='иисус', last=None, middle=None, nick=None)
1 Name(first='мухаммед', last=None, middle=None, nick=None)
2 Name(first='иисус', last='христос', middle=None, nick=None)

Разные экстракторы возвращают разные типы объектов:

extractor = DatesExtractor()
text = '''
Я посмотрел на инфляцию в России, взял период с декабря 2002 года
по декабрь 2015 года Инфляция 246%.

14.14 29 июня 2016 года:   Наиболее ожесточенные бои ночью шли под
Дебальцево
'''
matches = extractor(text)
matches
Я посмотрел на инфляцию в России, взял период с декабря 2002 года0 по декабрь 2015 года1 Инфляция 246%. 14.14 29 июня 2016 года2: Наиболее ожесточенные бои ночью шли под Дебальцево
for index, match in enumerate(matches):
    print(index, match.fact)
0 Date(year=2002, month='декабрь', day=None)
1 Date(year=2015, month='декабрь', day=None)
2 Date(year=2016, month='июнь', day=29)
extractor = MoneyExtractor()
text = 'В 1995 году стоимость 1 доллара была около 800 рублей'''
matches = extractor(text)
matches
В 1995 году стоимость 1 доллара0 была около 800 рублей1
for index, match in enumerate(matches):
    print(index, match.fact)
0 Money(amount=1, currency='доллара')
1 Money(amount=800, currency='рублей')