Продолжаю разработку расширения для Chrome по обезличиванию персональных данных с Docx Anonymizer. 152-фз.. 152-фз. chatgpt.. 152-фз. chatgpt. ner.. 152-фз. chatgpt. ner. onnx.. 152-фз. chatgpt. ner. onnx. rubert-tiny2.. 152-фз. chatgpt. ner. onnx. rubert-tiny2. дистилляция знаний.. 152-фз. chatgpt. ner. onnx. rubert-tiny2. дистилляция знаний. квантование.. 152-фз. chatgpt. ner. onnx. rubert-tiny2. дистилляция знаний. квантование. обезличивание данных.. 152-фз. chatgpt. ner. onnx. rubert-tiny2. дистилляция знаний. квантование. обезличивание данных. персональные данные.. 152-фз. chatgpt. ner. onnx. rubert-tiny2. дистилляция знаний. квантование. обезличивание данных. персональные данные. расширение chrome.

Начало тут.

Привет всем и трем моим подписчикам! Кто вы, герои? )

Вообще, я писал уже, что изначально я планировал сделать расширение только для договоров. Почему? Да потому что там проще всего распознавать персональные данные, так как они располагаются по понятной логике, которую довольно легко определить простой эвристикой.
Но ведь люди закидывают не только договоры в чат с ИИ. А хотелось более универсального расширения, иначе люди не будут пользоваться. А зачем тогда все это делалось? Дальнейшая работа была нацелена на расширение возможностей, исправление багов и некоторых недочетов.

Логичным было добавить дальше новые форматы, такие как .xlsx/.xlsm и .pptx/.pptm, а это листы, формулы, форматы ячеек, слайды и заметки. Забегая вперед, скажу, что приложение ломает некоторые формулы, если в них записаны персональные данные, о чем расширение должно предупредить. Также добавил текстовые форматы – .txt, .md, .csv, .json, .log. Разделители CSV и ключи JSON не меняются, JSON остается валидным.

Категорий стало 50 вместо 21. Паспорт теперь разбит на четыре метки: серия и номер, кем выдан, дата выдачи, код подразделения. Добавлены загранпаспорт, водительское удостоверение, военный билет, ВНЖ и патент, миграционная карта, свидетельства ЗАГС, полис ОМС, СТС/ПТС, VIN, госномер, кадастровые номера, номера дел, IP/MAC и ники. Отдельно обрабатываются сведения о здоровье и особые категории данных.
Теперь расширение видит скрытое содержимое и метаданные в документе. Панель показывает комментарии, историю правок, скрытый текст, скрытые листы и слайды, а также кэш формул и диаграмм. Перед отправкой их можно удалить.

Также, задумался надо безопасностью замаскированных данных. По требованиям Роскомнадзора ключ маскировки должен храниться отдельно от обезличенного документа, а совместное хранение прямо запрещено. С одной стороны, если вы используете расширение исключительно для личных целей, то приказ Роскомнадзора на вас не распространяется, но я ведь понимаю, что расширение вряд ли будет использоваться только в таком ключе.
В общем, чтобы не подставлять пользователя и соответствовать букве закона, ключ (карту замен) теперь можно зашифровать при сохранении на диск. И кстати, теперь сам ключ восстановления нельзя отправить в чат. Файл *.mapping.json распознается по содержимому, даже если он переименован или зашифрован, и расширение отказывается его отправлять. Кнопки «Загрузить как есть» у такого файла нет. Ну и, само собой, пришлось поработать и с моделью.

Дообучение модели

В обучение вошли датасеты Nerus и NEREL, которые в предыдущей статье значились в планах.
Текстовая основа NEREL главным образом состоит из материалов Русских Викиновостей (Wikinews); датасет предназначен для обучения и тестирования моделей искусственного интеллекта в задачах обработки естественного языка и, в частности, для распознавания именованных сущностей (NER). Датасет фокусируется на вложенных сущностях (Nested NER) и сложных связях (отношениях и событиях) между ними. То есть он позволяет размечать сущности, находящиеся внутри других сущностей. Например, в названии «Московский государственный университет имени М. В. Ломоносова» (класс «Организация») система может корректно распознать и вложенное имя «М. В. Ломоносова» (класс «Персона»).
Nerus — это совершенно другой русскоязычный датасет для NLP, созданный в рамках известного опенсорс-проекта Natasha. Датасет содержит около 700 000 статей (архив новостей Lenta.ru). Если NEREL — это относительно небольшой (около 900 статей, содержащих 56 тысяч сущностей), но экспертно и глубоко размеченный вручную датасет, то Nerus — это «серебряный стандарт» (silver standard), размеченный автоматически. Он фокусируется на плоской (стандартной) разметке трех базовых классов NER (PER, LOC, ORG), но при этом включает в себя полные морфологические разметки, POS-теги и синтаксические деревья зависимостей в формате CoNLL-U.
Итоговая обучающая выборка состоит из 126 190 предложений: 73 190 реальных и 53 000 синтетических.

Да, доля синтетики выросла с 35 до 42 %. При 35 % новые корпуса (Nerus и NEREL) начинали вытеснять жанры из обучающей выборки модели версии 1.1.0, и ложных ORG на отрицательных примерах было 9–12, при 42 % – 0. Синтетику делал самописным шаблонным генератором. Самой большой проблемой оставалось определение названий организаций. Маленькой модели rubert‑tiny2 сложно определять границы названия вроде “Московский государственный университет имени М. В. Ломоносова”. Как понять, где начало и конец названия? Кавычки спасают не всегда, эвристический поиск присутствует с первой версии. Нужно было продолжать дообучение.

Процесс дообучения остался прежним. Помимо датасетов я поменял лишь учителя с xlm‑roberta‑base на XLM-R large в надежде, что большая модель сможет обучить лучше и на него я делал большие ставки.

Ну а теперь к хардкору.

Чтобы понять, за счет чего растет (или нет) качество, я по очереди убирал и менял компоненты обучения. Результаты ниже.

Компонент

Эффект

Вердикт

NEREL в обучении

PER +0,03–0,05, ORG +0,02–0,04 на factRuEval; ORG на NEREL dev 0,49 -> 0,63–0,68

Оставил с весом ×0,5

Nerus

40k оказалось хуже, чем при 20k

Оставил 20k

Учитель XLM-R large вместо base

Учитель сильнее, ученик – нет

Отклонил

WikiANN ×2

Хуже

Отклонил

Без жестких ORG-меток

Хуже

Отклонил

«Суп моделей» (среднее двух сидов)

Хуже

Отклонил

NEREL оказался главным источником прироста. На factRuEval PER вырос на 0,03 – 0,05, ORG – на 0,02 – 0,04, а на dev-части самого NEREL ORG подскочил с 0,49 до 0,63 – 0,68. Заплатить пришлось на WikiANN ru: ORG просел на 0,01 – 0,015. Дело оказалось в разных соглашениях разметки в датасетах WikiANN и NEREL: в одном корпусе «ВВС США» – одна организация, в другом внутри нее еще и вложенная страна. Модель получает противоречивые сигналы и теряет на обоих. Понижение веса NEREL до ×0,5 убрало большую часть просадки, сохранив основной прирост.

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

Главным же открытием для меня стало то, что сильный учитель не сделал сильным ученика. XLM-R large на тесте лучше base (ORG 0,821 против 0,794), но дистиллированный rubert-tiny2 от него не вырос ни на сотую. Видимо, уперлись в емкость ученика: ему уже нечем усваивать дополнительные знания.

Удвоение веса WikiANN, обучение без жестких ORG-меток и усреднение весов двух сидов («суп моделей») – все три варианта дали результат хуже базового.

Квантование оставил в int8. Для проверки совпадения int8 с PyTorch с порогом ≥ 99 % увеличил количество предложений с 50 до 2 000. Результат составил 99,617 %.

Итоговые результаты в сравнении с предыдущей версией модели

Метрика

1.1.0

1.2.0

WikiANN ru PER / ORG

0,913 / 0,756

0,913 / 0,754

factRuEval PER / ORG

0,861 / 0,704

0,894 / 0,727

Полнота по отложенным именам (86 вхождений)

0,814

0,930

Имена без контекста

8/15

14/15

Ложные ORG на новом наборе отрицательных (494), argmax

63

7

В расширении с новой моделью люди и организации дают P = R = 1,000, утечек нет. Предыдущая модель ошибалась на «Плата», «Полис» и «Городская поликлиника № 3», сейчас этого нет.

Провел небольшое сравнение с Natasha. По людям модель внутри расширения дает 0,934 – 0,937, Natasha – 0,76 – 0,84. По организациям весь конвейер дает 1,000, Natasha – 0,42 – 0,72. Это, конечно, сложно назвать независимыми тестами, но все же для меня это был результат.

Что дальше?

Приложение стараюсь развивать как продукт, но в магазин пока не публикую, так как планирую добавить еще распозование сканов. Думаю применить для этого новый Indra OCR – поддерживает русский язык и, говорят, очень быстрый и легкий. Я предварительно прикинул, что смогу его сжать до 6 МБ под свои задачи, но это еще предостоит проверить.
Также, как мне кажется, проблема обезличивания персональных данных сейчас многими недооценена, а готовых решений для автоматического обезличивания именно под российские реалии я не нашел. А потому в планах выделить ядро, чтобы можно было сделать серверную часть и CLI-приложение. Хочу также сделать ноду для n8n и опубликовать ее в их каталоге.

Код открыт: https://github.com/argmaster-dev/docx-anonymizer.

Если вы хотите помочь проекту, просто попробуйте на своем документе и дайте обратную связь. Можно писать в issues или Telegram.

Автор: zeroshot

Источник