В 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/