Skip to content

Dabman1980/anonymizer

Repository files navigation

Anonymizer — обезличиватель документов для работы с LLM

Локальный инструмент обезличивания конфиденциальных документов перед отправкой в ChatGPT, Claude и другие LLM. Данные не покидают ваш компьютер.

Оригинал                          Обезличенный документ
┌─────────────────────────┐       ┌─────────────────────────┐
│ ООО «Ромашка Трейд» │       │ [КОМПАНИЯ_1]            │
│ ИНН: 7799001122         │  ──►  │ ИНН: [ИНН_ЮЛ_1]        │
│ Директор: Кузнецов А.В.  │       │ Директор: [ФИО_1]       │
│ Тел: +7 (499) 555-12-34│       │ Тел: [ТЕЛЕФОН_1]        │
└─────────────────────────┘       └─────────────────────────┘
         ▲                                    │
         │         ┌──────────┐               │
         │         │ Claude / │               ▼
         └─────────│ ChatGPT  │◄──────────────┘
    Расшифровка    │          │   Анализ обезличенного
    по ключам      └──────────┘   документа

Зачем это нужно

Кредитные аналитики, CFO, юристы и финансисты работают с документами, которые содержат персональные данные и коммерческую тайну: договоры, бухгалтерскую отчётность, финансовые модели, кредитные меморандумы. Отправлять такие документы в облачные LLM напрямую — нарушение конфиденциальности и, зачастую, закона (152-ФЗ).

Anonymizer решает эту проблему:

  1. Обезличивает — заменяет конфиденциальные данные на плейсхолдеры [КОМПАНИЯ_1], [ИНН_ЮЛ_1], [ФИО_2]
  2. Сохраняет файл ключей — JSON-таблицу соответствий плейсхолдер → оригинал
  3. Расшифровывает обратно — подставляет реальные данные в результат работы LLM

Чем лучше существующих решений

vs Microsoft Presidio

Presidio Anonymizer
Язык Английский (русский — слабо) Русский — нативно
Зависимости spaCy + модель ~560 МБ 0 МБ (стандартные библиотеки)
ИНН ЮЛ vs ФЛ Не различает Различает (10 и 12 цифр)
КПП, ОГРН, БИК, СНИЛС Не знает Знает
Кадастровые номера Нет Да
Падежи ФИО Ломается Работает (Иванова Ивана Ивановича)
Unicode-нормализация Нет Да (decomposed → composed)
Обратная расшифровка Нет встроенной Есть (--restore + файл ключей)
Установка pip install + модель + конфиг Скачал → запустил

vs Браузерные инструменты

HTML-обезличиватели Anonymizer
Форматы Обычно только текст или xlsx docx, xlsx, pdf, txt, html, csv, md
Сохранение формата Нет Да (docx → docx с форматированием)
Пакетная обработка Нет Да (несколько файлов за раз)
Обратная расшифровка Ручная или нет Автоматическая

vs Облачные DLP-сервисы

Облачные DLP Anonymizer
Где работает Облако провайдера Локально на вашем компьютере
Данные уходят на сервер Да Нет
Стоимость $10–100/мес Бесплатно
Работает офлайн Нет Да

vs Ручной find-and-replace

Вручную Anonymizer
Время на документ 15–30 минут 2 секунды
Человеческий фактор Пропуски, ошибки Консистентно
Дедупликация Нет Да (одно значение → один плейсхолдер)
Обратная расшифровка Ручная Автоматическая

Что обезличивается

Плейсхолдер Что находит Пример
[КОМПАНИЯ_1] ООО, АО, ПАО, ИП и др. ООО «Ромашка Трейд»
[ФИО_1] Фамилия Имя Отчество (все падежи) Кузнецова Андрея Викторовича
[ИНН_ЮЛ_1] ИНН юридического лица (10 цифр) 7799001122
[ИНН_ФЛ_1] ИНН физического лица (12 цифр) 503300112233
[КПП_1] Код причины постановки 779901001
[ОГРН_1] ОГРН / ОГРНИП 1157799001122
[СЧЁТ_1] Расчётный / корр. счёт (20 цифр) 40702810500000099887
[БИК_1] Банковский идентификатор 044525999
[SWIFT_1] SWIFT-код ROMTRUXX
[ТЕЛЕФОН_1] Номер телефона +7 (499) 555-12-34
[EMAIL_1] Электронная почта ivanov@romashka.ru
[ПАСПОРТ_1] Серия и номер паспорта 4510 № 223344
[СНИЛС_1] Страховой номер 12345678901
[ДР_1] Дата рождения 15.06.1985
[ДАТА_ВЫДАЧИ_1] Дата выдачи документа 20.09.2022
[МЕСТО_РОЖДЕНИЯ_1] Место рождения г. Тверь Тверской обл.
[АДРЕС_1] Адрес (регистрации, юридический) г Самара, ул Мира, д 7, кв 42
[ВЫДАН_1] Кем выдан паспорт УМВД РОССИИ ПО ТВЕРСКОЙ ОБЛ.
[КОД_ПОДР_1] Код подразделения 690-005
[КАДАСТР_1] Кадастровый номер 50:27:0020301:1234
[ЕГРН_1] Номер записи ЕГРН 50:27:0020301:1234-50/012/2024-1
[ПРОЕКТ_1] Название проекта (в кавычках) Проект «Солнечная Долина»

Дополнительно (выключены по умолчанию):

  • [СУММА_1] — денежные суммы (12 500 000 ₽)
  • [ДАТА_1] — все даты (01.09.2024)

Поддерживаемые форматы

Формат Обезличивание Расшифровка Примечание
.docx Форматирование сохраняется
.xlsx
.pdf Результат в .md (PDF нельзя редактировать)
.txt
.md
.html
.csv

Быстрый старт

Установка

# Клонировать репозиторий
git clone https://github.com/ВАШ_ЮЗЕРНЕЙМ/anonymizer.git
cd anonymizer

# Установить зависимости
pip3 install python-docx openpyxl pdfplumber --break-system-packages

Использование из командной строки

# Обезличить
python3 anonymizer.py договор.docx отчёт.xlsx

# Результат:
#   договор_anon.docx     — обезличенная копия
#   отчёт_anon.xlsx       — обезличенная копия
#   ключи_20240315.json   — файл ключей

# Расшифровать
python3 anonymizer.py --restore результат_из_claude_anon.docx ключи_20240315.json

# Результат:
#   результат_из_claude_restored.docx — с реальными данными

Установка на macOS (кнопки на рабочем столе)

# Создать папку
mkdir -p ~/Documents/anonymizer

# Скопировать скрипт
cp anonymizer.py ~/Documents/anonymizer/

# Скопировать кнопки на рабочий стол
cp Обезличить.command ~/Desktop/
cp Расшифровать.command ~/Desktop/

# Дать права на запуск
chmod +x ~/Desktop/Обезличить.command ~/Desktop/Расшифровать.command

Двойной клик по кнопке → выбрать файлы → готово.

Рабочий процесс с LLM

1. Обезличить.command → выбрать файл(ы)
        ↓
2. Получить filename_anon.docx + ключи_дата.json
        ↓
3. Скопировать текст из _anon файла → вставить в Claude/ChatGPT
        ↓
4. Получить результат от LLM (с плейсхолдерами)
        ↓
5. Сохранить результат в файл
        ↓
6. Расшифровать.command → выбрать файл + ключи
        ↓
7. Получить filename_restored.docx с реальными данными

Файл ключей

{
  "[КОМПАНИЯ_1]": { "original": "ООО «Ромашка Трейд»", "type": "КОМПАНИЯ" },
  "[ИНН_ЮЛ_1]":  { "original": "7799001122",              "type": "ИНН_ЮЛ" },
  "[ФИО_1]":      { "original": "Кузнецов Андрей Викторович", "type": "ФИО" }
}

⚠️ Храните файл ключей отдельно от обезличенных документов. Никому не передавайте — в нём реальные данные.

Технические особенности

  • Unicode NFC-нормализация — корректно обрабатывает docx с decomposed-символами (и+̆ → й), что часто встречается в документах из разных редакторов
  • Умная предобработка ПД-4 — корректно разделяет склеенные реквизиты в платёжных квитанциях (30 цифр → ИНН 10 + счёт 20)
  • Дедупликация — одно и то же значение во всём документе получает один плейсхолдер
  • Группы захвата — метки типа «ИНН поручителя:» сохраняются, заменяется только число
  • Порядок правил — длинные паттерны (счёт 20 цифр) применяются раньше коротких (ИНН 10 цифр), исключая ложные срабатывания

Ограничения

  • PDF → текст извлекается и сохраняется как .md (редактирование PDF без платных инструментов невозможно)
  • Сканы — если PDF содержит только изображения (без текстового слоя), обезличивание не сработает
  • Адрес в нескольких ячейках таблицы — если адрес разбит на разные параграфы/ячейки, вторая часть может не захватиться
  • Regex — не заменяет NER (Named Entity Recognition). Нестандартные написания могут пропускаться. Всегда проверяйте результат перед отправкой в LLM

Лицензия

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

Авторы

Создано при помощи Claude (Anthropic) в рамках курса Prompt Engineering.

About

Обезличиватель документов для работы с LLM

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors