Как устроен Anonymaze
Обновлено: 28 апреля 2026
Anonymaze — это тонкая нативная оболочка поверх детерминированного движка обработки текста. Эта страница повторяет тот же путь, который проходит ваш текст при обезличивании документа: от «пользователь выбрал файл» до «скопировал чистый результат».
Обзор стека
| Компонент | Технология | Роль |
|---|---|---|
| Оболочка macOS | SwiftUI | Нативный интерфейс, выбор файлов, OCR через Apple Vision |
| Оболочка Windows | Electron + React | Дистрибуция под Windows с первого дня (внутренняя бета v0.1) |
| Сайт | Next.js 16 + React 19 + Tailwind 4 | Этот сайт и онлайн-демо |
| Движок обработки | Собственный многоступенчатый движок | Распознавание сущностей — общее для десктопа и онлайна |
| Бэкенд-API | FastAPI + Uvicorn + slowapi | Обслуживает онлайн-демо и тариф Pro |
Конвейер распознавания
- Этап регулярных выражений. Детерминированные шаблоны для структурированных ПД (email, телефоны, ИНН/SSN, IBAN, банковские карты, страновые ID). Быстро, высокая точность, почти ноль ложных срабатываний на корректных данных.
- Поверхностные эвристики. Учёт языка при токенизации, признаки заглавных букв, обработка обращений. Связующее звено между регулярными выражениями и статистическим распознаванием сущностей.
- Распознавание именованных сущностей. Отдельная модель распознавания на каждый язык. Находит ИМЯ, ОРГАНИЗАЦИЮ, ЛОКАЦИЮ, АДРЕС, ДАТУ.
- Фильтр ложных срабатываний. Набор правил на каждый язык отсеивает типичные ложные срабатывания (слово с заглавной в начале предложения, бренды, совпадающие с фамилиями, и т.п.).
- Дедупликация и разрешение диапазонов. Пересекающиеся кандидаты от предыдущих этапов сводятся в один непересекающийся список диапазонов. Совпадающие упоминания одного человека («Иван Петров» → позже «г-н Петров» → позже просто «Иван») схлопываются в одну метку.
- Результат. Итоговый JSON: обезличенный текст, список сущностей (метка + оригинал + тип + диапазон), таблица соответствий для обратной замены, статистика по типам, определённый язык и время обработки в миллисекундах.
Языковые пакеты
Сегодня мы поддерживаем 13 языков в двух уровнях. Уровень A (целевые точность и полнота ≥ 0,95): английский, русский, французский, немецкий, испанский. Уровень B (целевые ≥ 0,85): китайский, хинди, итальянский, японский, корейский, польский, португальский, турецкий. Автоопределение направляет текст в нужный пакет по символьной и словесной эвристике.
| Код | Язык | Движок распознавания |
|---|---|---|
| zh | Китайский | Собственный движок распознавания |
| en | Английский | Собственный движок распознавания |
| fr | Французский | Собственный движок распознавания |
| de | Немецкий | Собственный движок распознавания |
| hi | Хинди | Собственный движок распознавания |
| it | Итальянский | Собственный движок распознавания |
| ja | Японский | Собственный движок распознавания |
| ko | Корейский | Собственный движок распознавания |
| pl | Польский | Собственный движок распознавания |
| pt | Португальский | Собственный движок распознавания |
| ru | Русский | Собственный движок распознавания |
| es | Испанский | Собственный движок распознавания |
| tr | Турецкий | Собственный движок распознавания |
Страновые идентификаторы
Помимо универсальных типов сущностей, Anonymaze распознаёт страновые идентификаторы. Список растёт с каждым новым языковым пакетом.
| Страна | Распознаваемые идентификаторы |
|---|---|
| Россия | ИНН, СНИЛС, паспорт, полис ОМС |
| США | SSN |
| Испания | DNI, NIE, CURP, RFC |
| Португалия / Бразилия | CPF, NIF |
| Франция | NIR (соцстрахование) |
| Германия | Steuer-ID |
| Китай | 身份证 (национальный ID) |
| Италия | Codice Fiscale, P.IVA |
| Польша | PESEL |
| Турция | T.C. Kimlik No |
Обратимость (восстановление после внешнего AI)
Когда вы включаете обратимость, Anonymaze создаёт рядом с обезличенным текстом файл соответствий, чтобы вы могли восстановить оригиналы после прогона текста через внешний AI (ChatGPT, Claude и т.п.). Это функция тарифа Pro.
- Метки с hex-тегом: вместо «[PERSON_1]» движок выдаёт устойчивые для документа теги вида «[PERSON_a3f2]». Четырёхсимвольный hex-суффикс выводится из соли документа, поэтому одно и то же имя в двух разных документах получает разные теги — обезличенный текст безопасно передавать дальше.
- Файл соответствий mapping.json: небольшой JSON с версией схемы, солью документа и массивом записей «тег, оригинал, тип, позиции, уверенность». Вы скачиваете его после обезличивания и храните в тайне.
- По умолчанию только локально: файл соответствий не покидает устройство, пока вы сами его не выгрузите. Десктоп-приложение пишет его рядом с документом; веб-демо позволяет сохранить его как файл.
- Полный цикл: вы обезличиваете → вставляете очищенный текст в ChatGPT / Claude / ваш AI → вставляете ответ AI обратно в Anonymaze вместе с файлом соответствий → Anonymaze возвращает оригиналы в ответ.
- Конфликты и неизвестные теги: если AI придумал новые теги «[PERSON_xxxx]», которых нет в вашем файле соответствий, мы оставляем их как есть и показываем их число, чтобы вы могли проверить.
Усиление для Pro в планах: зашифрованные файлы соответствий (AES-256-GCM с KDF Argon2id). Пока это не выпущено, файл соответствий — обычный JSON: относитесь к нему как к исходному документу и храните соответствующе.
Два пути: куда уходят ваши данные
Десктоп (офлайн)
Ваш файл читается с диска оболочкой SwiftUI / Electron, передаётся локальному процессу движка через Process + Pipe, и результат в формате JSON отображается. На этом пути не выполняется ни одного сетевого запроса. Методику проверки см. в разделе «Безопасность».
Онлайн-демо
Ваш текст отправляется по TLS 1.3, обрабатывается обработчиком FastAPI в памяти со свежим экземпляром на каждый запрос, возвращается и удаляется. Постоянного хранения нет. Ограничение — 5 запросов в минуту с одного IP.
Инженерный подход
Anonymaze построен на тщательно проверенных компонентах со свободными лицензиями и собственном оркестрирующем слое, который отвечает за фильтрацию ложных срабатываний, разрешение диапазонов и подстройку под каждый язык.
Характеристики производительности
| Типичное время распознавания (онлайн-демо, 1 КБ текста) | ~85 мс на сервере |
|---|---|
| Типичное время распознавания (десктоп, 1 КБ текста) | ~120 мс (холодный кеш); ~40 мс (тёплый) |
| Лимит текста на бесплатном тарифе | 50 000 символов на запрос |
| Лимит текста на тарифе Pro | 500 000 символов на запрос |
| Лимит размера файла (бесплатно) | 10 МБ на документ |
| Поддерживаемые форматы | DOCX, XLSX, PPTX, CSV (с сохранением форматирования), PDF, TXT, RTF (текст) + OCR изображений (PNG, JPG) |