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

В процессе аудита из досье клиентов часто приходится выбирать определенные документы для дальнейшего анализа. Например, для оценки полноты выявления кредитными подразделениями банка сведений о сделках с недвижимым имуществом, подлежащих обязательному контролю в рамках ПОД/ФТ, нужны документы, удовлетворяющие следующим критериям:

  • Документ является договором купли-продажи недвижимости (ДКП);
  • Сумма сделки – от 3 млн. рублей и выше;
  • Присутствует отметка о государственной регистрации.

В рамках данной задачи нам требовалось обработать документы  более чем 3 тысяч клиентов. Задача усложнялась тем, что в электронном досье одного клиента могло находиться до ~200 папок, которые в целом могли содержать до ~1000 файлов. Естественно, что перебирать вручную эти папки с документами слишком трудозатратно.

Для решения задачи классификации документов из досье мы использовали имевшийся в нашем распоряжении инструмент на языке Python для распознавания и классификации документов, основанный на популярной библиотеке оптического распознавания символов в изображении tesserocr.

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

Так строка, отмеченная красной рамкой, показывает, что на странице 4 документа «18_Noyabr_2019_g._(2).pdf» обнаружены фразы, присущие договорам купли-продажи (ДКП). Вроде бы все корректно, однако при ручном рассмотрении документа было обнаружено, что на той же странице указана сумма договора (менее 3 млн. руб.), присутствие которой классификатор не отметил в результатах, хотя это было указано в словаре правил.

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

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

Для решения этой проблемы мы доработали функцию, которая позволила использовать словарь принадлежности страниц к классам и помечать все найденные классы в документе:

def __classify_by_all_inclusions(variants, min_count=1):
    """
    Определяем класс по самой ранней найденной строке
    :param variants: Словарь с результатами поиска
    :param min_count: Минимальное количество "результатов поиска" для каждого класса.
    :return: Ключ выделенного класса
    """

    inclusions = {x: variants[x][0].start for x in variants if len(variants[x]) >= min_count}
    if len(inclusions) == 0:
        return None

    return ', '.join(x for x in inclusions.keys())

Результаты обработки приведенного выше договора теперь выглядят так:

Таким образом, мы получили инструмент, который принимает на вход сканы документов в формате pdf и png, разбивает их на отдельные страницы, преобразует их с помощью Tesseract в текст и классифицирует их в соответствии с заданным набором правил, учитывая все классы страниц документа.