Время прочтения: 3 мин.

Одной из самых сложных и неоднозначных проблем, которая может встретиться во время работы с данными, является извлечение именованных сущностей (Named-entity recognition, NER) – слов, обозначающих предмет или явление определенной категории.  

На вход программному модулю подаётся текст, а на выходе получаются структурированные объекты. Например, имеется новостной текст, и необходимо выделить в нем сущности (локации, персоны, организации, даты и так далее). Решая задачу NER, мы сможем понять, что «ООН» – это организация, «8 апреля 1938 года» — это дата, а «Kumasi» – локация.

Задача NER традиционна и хорошо изучена, особенно для английского языка. Существует большое количество как коммерческих, так и открытых решений, например: NLTKSpacyStanford NEROpenNLP и другие. Для русского языка тоже существует довольно много инструментов, но почти все они являются коммерческими (DaDataPullentiAbbyy InfoextractorDictum).

Из открытых инструментов отметим Natasha ­– открытая библиотека для языка программирования Python, которая позволяет извлекать структурированную информацию из текстов на русском языке. Natasha отличается лаконичным интерфейсом и включает экстракторы для имён, адресов, сумм денег, дат и некоторых других сущностей.

Однажды, мне нужно было решить следующую задачу: был дан набор строк, в каждой строке была дата договора. Эта дата могла быть в произвольных форматах и стоять в любом месте строки. Я потратил достаточное количество времени, чтобы написать регулярное выражение, которое находит эти даты. Применив же инструмент, решающий задачу NER, время на решение задачи составило не более 2 минут, как на рисунке 1.

На Рисунках 1 и 2 показаны примеры использования библиотеки Natasha для извлечения дат (рисунок 1) и ФИО (рисунок 2).

Рисунок 1 — Пример с датами
Рисунок 2 — Пример с именами

Сначала создаётся объект нужного нам экстрактора, в который передаётся текст. Экстрактор определит положения объектов, которые мы ищем (например, объект NamesExtractor будет искать ФИО в тексте и найдёт их в следующем виде — [105, 136), [139, 166), [297, 323), [354, 369)]). Также можно вывести данные в формате JSON с помощью функции format_json.

Таким образом, всего лишь буквально в 5 строчек кода можно извлечь необходимую информацию (имена, даты, локации, валюты и т. д.) и сэкономить много времени.