leaders2021-hackathon

module
v0.0.0-...-90d11f1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 6, 2021 License: Apache-2.0

README

Репозиторий участников хакатона Правительства Москвы 2021

Описание задачи

Задача №9

🤔 Хочешь обратиться к Правительству Москвы, но чтобы никто об этом не узнал? Тогда реши задачу №9

📍 Что нужно сделать?

Разработай автоматизированный алгоритм обезличивания данных.

В обращениях в адрес Правительства Москвы москвичи указывают свои >> персональные данные.

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

Подробное описание находится тут misc/task-desc/*

Ограничения
  1. В решении можно использовать только бесплатные решения (с лицензией на коммерческое на свободное использование).
  2. В рамках конкурса модель должна обезличивать фамилию, имя и отчество в различном формате на русском языке (полностью, фамилия и имя, имя и отчество, фамилия и инициалы);
  3. Модель должна обезличивать все ФИО, находящиеся в тексте документа. В случае вероятности наличия в документе не обезличенных ФИО, проставляется специальная метка;
  4. В число маскируемых сущностей не должны входить названия знаков отличия, премий, орденов, а также наименования улиц, организаций и учреждений;
  5. Объем документов с вероятностью наличия не обезличенных ФИО на выходе должен быть не более 20%.
  6. В рамках конкурса используются открытые документы Правительства Москвы в формате PDF и MS Word, собранные в едином пространстве, участники могут использовать дополнительные источники для обучения с указанием данных источников в сопроводительной документации;
  7. Исходными объектами для анализа должны быть файлы в формате jpg. Таким образом, файлы которые представлены для анализа в другом формате, необходимо конвертировать в jpeg. Программа конвертер в jpg не является частью решения и выбирается участниками конкурса по своему усмотрению. Если же участники конкурса разрабатывают или используют обратный конвертер — из jpg в pdf или doc, то программа-конвертер должна быть представлена как часть конкурсного ПО и не должна зависеть от ПО имеющего платную лицензию, даже с бесплатным периодом;
  8. В рамках дальнейшего развития модели необходимо будет также обезличивать другие виды персональных данных - дату рождения, паспортные данные, телефон и почту.

Описание решения

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

Компонент конвертации в .jpeg формат

В предложенном датасете присутствуют документы в форматах .doc, .docx, .xls, .xlsx, .pdf, .jpg. И хотя в описании задачи сказано, что решение конвертации в .jpeg не является частью системы, без него пользоваться интерфейсом было бы гораздо сложнее. Очевидно, что у целевых пользователей всегда под рукой офисные документы, а не специально подготовленные картинки. Поэтому мы решили сделать конвертер одним из основных компонент системы.

После анализа и конкурентного сравнения открытых решений был выбран unoconv конвертер, представляющий собой обертку над открытым LibreOffice. Сервис поднимается в отдельном докер-контейнере и отвечает за конвертацию любых офисных документов в .pdf. Вокруг него написана обвязка, которая превращает .pdf в набор страниц-картинок для дальнейшей работы с ними в пайплайне.

Итого на этом шаге происходит преобразование:

любой документ → постраничный набор .jpeg файлов

Компонент распознавания текста на изображении (OCR)

От качества распознавания текста на картинке (OCR) напрямую зависит результат всей операции. На этом этапе необходимо получить массив слов, а также координаты их расположения на картинке.

Был проведен подробный анализ рынка OCR решений. Существует большое количество проприетарных платных решений (у каждого большого вендора: Amazon, Google, Yandex, Microsoft и т.п.). С опенсорсными решениями все сильно хуже, достойных альтернатив нет, особенно с предобученных для русского языка.

Для быстрого сравнения алгоритмов, а также чтобы не привязываться к одному варианту, архитектура нашего решения модульная — компонент OCR (да как и любой другой) легко заменяется, достаточно удовлетворить интерфейсу.

Сейчас сделано два коннектора:

  • OCR от компании Яндекс, платный, проприетарный,
  • OCR Tesseract — опенсорс решение со знанием русского языка, развиваемое комьюнити.
  • OCR EasyOCR — опенсорс решение со знанием русского языка.

Все компоненты уже входят в наше решение и переключаются конфигурацией. Рассмотрим каждый из них подробнее.

Добавить новый компонент очень просто: достаточно создать сервис согласно контракту openapi/openapi-ocr-service.yml и добавить его в конфигурацию o/flow.go.

Яндекс OCR

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

EasyOCR

Не подошел по времени работы. Время распознавания одной страницы на CPU значительно и при его использовании решение не укладывается в условие 60 секунд на документ. При этом качество не выделяется в лучшую сторону.

Tesseract OCR

Решение показывает хорошие результаты по скорости распознавания.

Добиться качества оказалось не так просто. Мы используем следующие улучшения:

  • дополнительная кластеризация слов для изменения порядка (для более естественного порядка ФИО),
  • дополнительная предобработка изображений,
  • использование трёх прогонов OCR для каждого изображения с разными настройками и умная последующая комбинация результата.
Компонент выделения именованных сущностей из текста (NER)

Задача выделения именованных сущностей (name recognition) — одна из самый распространенных NLP задач. Поэтому для её решения также существует огромное количество уже готовых решений.

Мы протестировали на датасете следующие открытые готовые решения:

  • Natasha,
  • Stanza (Stanford NLP),
  • DeepPavlov.

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

После готовых решений пошли в сторону самостоятельной разработки. Выбрали библиотеку Allennlp в качестве фреймворка. В качестве модели использовали архитектуру Transformers, а именно предобученную модель BERT в качестве токенизатора, эмбеддера и энкодера.

Файнтюнили её на задачу Sequence Labeling, добавив еще один линейный слой к модели. В качестве датасета в этом обучении использовали открытый nerus и собранный самостоятельно датасет из 1М ФИО.

В этом месте мы тоже используем возможности компонентной архитектуры: NER решение можно выбирать и изменять конфигурацией. Более того — их можно комбинировать, усиливая результат.

На данном этапе мы ставили себе целью не пропустить ФИО, не оптимизируя лишние отмеченные сущности.

В решение уже готовы два NER компоненты:

  • Stanza,
  • Самостоятельно обученная сеть.

Наилучший результат показала умная комбинация этих двух нейросетей — этот вариант и используется в сервисе.

Компонент постобработки по словарям

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

Он подключается также как и NER модули, словари могут быть любые и легко пополняемые. Удобно использовать для того, чтобы точно скрыть определенные данные.

Компонент постобработки .jpeg страниц (маскирования)

Последний этап работы с документом — это непосредственное скрытие данных. В качестве механизма скрытия мы использовали черные прямоугольники, располагающиеся над каждым словом. Такое решение позволяет на 100% исключить возможность частичного восстановления данных.

Компонент полностью написан самостоятельно во время хакатона.

Белый список

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

Диспетчер компонент

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

Интерфейсы решения

Веб-интерфейс

Основной интерфейс работы с приложением — простой веб-интерфейс.

Основные возможности:

  • загрузить документ форматов .doc, .docx, .xls, .xlsx, .pdf, .jpg,
  • просмотреть постранично результат обработки,
  • скачать результат одним .zip архивом,
  • посмотреть список всех сессия деперсонализации и их результаты (история).
Телеграм бот

Бот, которому можно отправить документ и получить обратно деперсонализированные страницы в формате картинок.

Помогает в пользовательском сценарии общения через мессенджер.

Батч обработка (в процессе разработки)

Утилита, работающая с большими массивами документов из командной строки. Ей можно передать путь до папки — все документы в этой папке будут деперсонализированы и помещены в соответствующие архивы.

Помогает в пользовательском сценарии обработки большого количества данных.

Другие

Архитектура решения позволяет быстро добавлять любые другие пользовательские и программные решения, т.к. весь бэкенд готов и универсален.

Запуск решения

Запустить решение самостоятельно проще простого.

Шаг 1. Выкачиваем этот репозиторий и переходим в него

git checkout https://github.com/hflabs/leaders2021-hackathon.git cd leaders2021-hackathon

Шаг 2. Запускаем

docker compose -f docker-compose-dev.yaml up

Важно! Необходим docker-compose версии 2 и выше.

Также для использования яндекс OCR необходимо указать токен и код папки, иначе yandex OCR engine будет недоступен.

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

После завершения интерфейс будет доступен по адресу localhost:3010

Анализ результатов

Данные получены при помощи ручной валидации случайно выборки 10% документов из обработанного датасета в 6000 страниц.

OCR модуль NER модуль % пропущенных частей ФИО % пропущенных ФИО целиком
Коробочный Яндекс OCR Коробочный Stanford NLP 50% ---
Tesseract OCR с улучшениями Комбинация Stanford NLP и дообученной нейросети 20% <1%
Коробочный Яндекс OCR Комбинация Stanford NLP и дообученной нейросети 10% <0.5%

*пропущенные части ФИО — хотя бы одна пропущенная буква хотя бы в одном компоненте.

Directories

Path Synopsis
o

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL