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

Именованные сущности – это слово или сочетание, обозначающее объект либо явление определенной категории. Говоря о таких объектах в контексте анализа данных, чаще всего имеют в виду ограниченный набор видов: имя (псевдоним), дата, должность (роль), адрес, денежная сумма, название организации и др.

Расположение данных объектов в строгой структуре документа формирует отдельное признаковое пространство визуальной стороны страницы и может повысить качество классификации (или кластеризации). Предлагаем разобраться, как можно получить и использовать координаты именованных сущностей в документе.

Возьмем бланк одностраничного согласия на обработку персональных данных (рис. 1):

Рисунок 1

Перед извлечением сущностей необходимо проделать подготовительную работу по извлечению и обработке текста.

Для работы с PDF-документами разработан многофункциональный модуль PyMuPDF. Разнообразие классов позволяет читать, редактировать, модифицировать документ огромным количеством способов.

#читаем    бланк:
document = fitz.open('C:/yourpath/soglasie.pdf')
page = document.load_page(0)
#считываем текст:
doc_text = page.get_text()
#избавляемся    от    отступов   и   лишних знаков:
clear_text = re.sub('/n|©', ' ', doc_text)

Для извлечения сущностей используем компактную модель Natasha. Она работает быстро и находит несколько типов объектов: организации, имена и места. Предварительно загружаем предобученные эмбеддинги и NER-библиотеку Slovnet (в системе Наташи модули интегрированы).

navec = Navec.load('C:/yourpath/navec_news_v1_1B_250K_300d_100q.tar')
ner = NER.load('C:/yourpath/slovnet_ner_news_v1.tar')
ner.navec(navec)
Использование библиотеки простое и изящное:
markup = ner(clear_text)

Так выглядит разметка в тексте (рис. 2):

Рисунок 2

Бывает так, что распознаются сочетания, не имеющие отношения к вышеназванным типам сущностей. Такая проблема – одна из основных в сфере распознавания в русском языке, и на данный момент она представляет собой огромное поле для развития.

Сущности на руках. Как теперь разметить текст в самом документе? Natasha возвращает координаты объекта в тексте – первый и последний знак, что не дает даже представления о пространственной разметке листа документа. Решение есть! Для начала с помощью данных координат получим текстовое представление именованных сущностей (рис. 3):

Рисунок 3

А теперь поможет PyMuPDF. Несколькими простыми командами можно извлечь области на странице, которые соответствуют искомому тексту:

#получаем   текстовую   оболочку   документа
txt_page = page.get_textpage()
#проводим   поиск   сущностей   по   тексту
for ent in ents:
quads.append(txt_page.search('{}'.format(ent), quads=True))
Рисунок 4

Остается передать эти точки в функцию маркера:

for quad in quads:
    page.add_highlight_annot(quad)

Итог (рис. 5):

Рисунок 5

Координаты расположения сущности на странице ценны сами по себе. Как упоминалось выше, это дополнительный набор признаков для модели классификации или кластеризации документов. Однако можно пойти дальше и создать тепловую карту именованных сущностей. Карта дает приблизительные рамки нахождения искомого текста, что будет плюсом при обработке большого количества документов, так как точные координаты могут быть актуальны только для нескольких экземпляров.

Понадобится страница с одной подсветкой, без текста. Для дальнейшей обработки изображения необходимо провести бинаризацию – привести иллюстрацию в черно-белый вид (рис. 6). Преобразование проводится с помощью OpenCV.

Рисунок 6

Для бинарного изображения найдем евклидово расстояние между черными точками. Получаем массив с расстояниями той же размерности, что и исходное изображение.

При визуализации получается следующая карта (рис. 7):

Рисунок 7

Очертания полос приблизительно угадываются, но области сгущения слишком большие. Подобная ситуация исправляется фильтрацией изображения. Используем медианный фильтр. Его суть заключается в следующем: для каждого пикселя изображения проводится поиск окружения (квадрат 3*3, центром которого и является данный пиксель), значения пикселей сортируются, находится медианное значение. Им и заменяется центр квадрата. Чтобы ускорить процесс, можно использовать готовую функцию из удобного модуля работы с изображениями в Python.

Теперь контуры сгустков близки к разметке на странице, и по ним видно приблизительное расположение сущностей. Чтобы убрать лишний информационный шум, изменим цветовой набор изображения (рис. 8).

Рисунок 8

Возьмем экземпляр согласия на обработку персональных данных Альфабанка. Проведем те же манипуляции и получим обобщенный рисунок сущностей.  (рис. 9).

Рисунок 9

Такая тепловая карта отображает расположение нужных объектов для целого набора документов. Подобный механизм анализа универсализирует инструмент их обработки, поскольку позволяет собирать информацию для группы шаблонов за определенный период времени и выявлять закономерности.