Добавить в корзинуПозвонить
Найти в Дзене
Цифровая Переплавка

🗜 Классификация текста через сжатие: когда компрессор умнее модели

В Python 3.14 появился модуль compression.zstd, и вместе с ним — возможность делать классификацию текста без нейросетей, без TF-IDF и без градиентов. Просто… через сжатие. Звучит как хак? Немного. Работает? Судя по бенчмаркам — да. И удивительно хорошо. Метод опирается на простую, но глубокую мысль: если текст похож на уже виденные данные, он будет лучше сжиматься. Это связано с понятием сложности Колмогорова — мерой того, насколько «коротко» можно описать объект. Чем более предсказуем текст, тем сильнее его можно сжать. Если у нас есть тексты про космос и тексты про религию, то компрессор, «натренированный» на космосе, будет эффективнее сжимать новый текст про ракеты, чем про богословие. И это можно превратить в классификатор: 🧠 создаём «компрессор» для каждого класса
📚 обучаем его на текстах этого класса
📏 новый документ пропускаем через каждый компрессор
🏆 выбираем тот, который дал наименьший размер Меньше байт — выше вероятность принадлежности к классу. Красиво. Почти математич
Оглавление

В Python 3.14 появился модуль compression.zstd, и вместе с ним — возможность делать классификацию текста без нейросетей, без TF-IDF и без градиентов. Просто… через сжатие.

Звучит как хак? Немного. Работает? Судя по бенчмаркам — да. И удивительно хорошо.

Идея, которая старше deep learning

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

Это связано с понятием сложности Колмогорова — мерой того, насколько «коротко» можно описать объект. Чем более предсказуем текст, тем сильнее его можно сжать.

Если у нас есть тексты про космос и тексты про религию, то компрессор, «натренированный» на космосе, будет эффективнее сжимать новый текст про ракеты, чем про богословие.

И это можно превратить в классификатор:

🧠 создаём «компрессор» для каждого класса
📚 обучаем его на текстах этого класса
📏 новый документ пропускаем через каждый компрессор
🏆 выбираем тот, который дал наименьший размер

Меньше байт — выше вероятность принадлежности к классу.

Красиво. Почти математическая поэзия.

Почему это стало практичным только сейчас

Раньше идея упиралась в инфраструктуру. Алгоритмы вроде gzip и LZW формально поддерживают инкрементальное сжатие, но нормального API для этого не было.

С выходом Python 3.14 всё меняется: стандартная библиотека получила реализацию Zstandard (Zstd) — алгоритма от Facebook, созданного Яном Колле.

Zstd важен по двум причинам:

⚙️ поддерживает инкрементальное сжатие
⚙️ умеет работать с обучаемыми словарями (ZstdDict)
⚙️ эффективен на маленьких кусках данных
⚙️ быстро создаёт новые компрессоры

Последний пункт — ключевой. В машинном обучении состояние модели не должно «портиться» чужими данными. Поэтому компрессор приходится пересоздавать. И Zstd делает это за десятки микросекунд.

Это и превращает идею в рабочий алгоритм.

Как это реализовано технически

В основе — класс ZstdClassifier.

Он хранит:

🗂 буфер текста для каждого класса
🔁 счётчик обновлений
🗜 компрессор с обученным словарём

При поступлении нового документа:

📥 текст добавляется в буфер класса
✂ если буфер превышает окно — старые байты обрезаются
🔄 через заданное число обновлений компрессор пересобирается

При классификации:

🧪 текст прогоняется через компрессор каждого класса
📏 измеряется длина сжатого вывода
🎯 выбирается минимальный

Никаких весов. Никаких матриц. Никакой оптимизации.

Всё «обучение» делегировано компрессору.

Мне лично нравится эта элегантность. Это почти функциональное программирование (functional programming) в мире ML.

Производительность: и вот тут начинается магия

Бенчмарк на датасете 20 Newsgroups (4 класса, ~3300 документов):

📈 точность — 91%
⚡ время — меньше 2 секунд

Для сравнения, старая реализация на LZW пять лет назад:

🐢 89% точности
⏳ 32 минуты

Разница — в 1000 раз по скорости.

А если сравнить с классическим TF-IDF + логистическая регрессия:

📊 точность — 91.8%
⏱ время — около 12 секунд

То есть компрессор чуть уступает по точности (accuracy), но значительно выигрывает по простоте и скорости.

И это без единой строчки кода с NumPy.

Где это может быть реально полезно

Важно понимать: это не замена BERT или GPT.

Но есть сценарии, где метод очень уместен:

🪶 low-resource среды
📦 embedded или edge-устройства
🔒 закрытые системы без heavy ML-зависимостей
⚡ потоковые данные с частыми обновлениями
🧩 прототипирование без сложной инфраструктуры

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

Почему это работает вообще?

Компрессор строит внутреннюю модель вероятностей символов и последовательностей.

Фактически он:

🔎 изучает частоты n-грамм
🔁 запоминает повторяющиеся паттерны
📐 оптимизирует кодирование под «знакомый» текст

Это очень близко к языковой модели, только без явного вероятностного графа и градиентного обучения.

Можно сказать, что компрессия — это базовая модель языка (primitive language modeling).

И в этом есть что-то очень красивое: мы возвращаемся к фундаментальной связи информации и предсказуемости.

Личное мнение: это не трюк, это напоминание

Мне в этой истории нравится не столько сам алгоритм, сколько его философия.

Мы привыкли, что ML — это:

🤖 гигабайты весов
🧮 GPU
📊 сложные пайплайны

А тут — стандартная библиотека Python и идея из учебника по ИИ.

Это напоминает, что:

🧠 интеллект часто сводится к предсказуемости
📉 простые методы иногда достаточно хороши
⚙️ инфраструктурные улучшения (как Zstd в stdlib) могут радикально изменить возможности

Будет ли это продакшен-решением для крупных систем? Скорее всего, редко.

Но как baseline? Как быстрый классификатор? Как образовательный инструмент? Как low-resource решение?

Абсолютно да.

Что дальше

Теперь, когда Zstd встроен в стандартную библиотеку Python:

🐍 метод стал доступен «из коробки»
⚡ барьер входа минимален
🧪 можно экспериментировать на своих датасетах
🔍 можно исследовать гибридные подходы

Мне было бы особенно интересно увидеть комбинацию:

🧠 компрессор как фильтр первого уровня
🤖 тяжёлая модель как уточняющий этап

Это мог бы быть очень эффективный двухступенчатый пайплайн.

Итог

Иногда прогресс — это не добавление новых слоёв нейросети, а переосмысление старых идей.

Классификация через сжатие — именно такой случай.

Простой, быстрый, теоретически обоснованный и неожиданно конкурентоспособный метод.

И главное — он заставляет вспомнить, что машинное обучение начинается не с PyTorch, а с информации.

Источники

🔗 https://maxhalford.github.io/blog/text-classification-zstd/