Мультиметочный классификатор спама для Telegram постов с использованием эвристики и BERT.
Система multilabel классификации для определения категорий спама в Telegram постах:
- ads (реклама)
- crypto (криптовалюты, блокчейн)
- scam (мошенничество)
- casino (казино, ставки)
Telegram сообщение
↓
Очистка текста (удаление ссылок, артефактов)
↓
Параллельная классификация:
├─ Heuristics (быстрая проверка по правилам)
└─ BERT (rubert-tiny2 через transformers)
↓
Объединение результатов (среднее арифметическое)
↓
Мультиметочное предсказание (ads, crypto, scam, casino)
↓
NER-детектор дубликатов (Natasha)
↓
Фильтрация (спам/дубликаты) → Публикация
pip install -r requirements.txtПримечание: Для работы NER-детектора дубликатов требуется библиотека natasha.
Она автоматически установится при установке зависимостей. При первом запуске Natasha
загрузит необходимые модели (это может занять некоторое время).
Создайте файл .env:
API_ID=your_api_id
API_HASH=your_api_hash
TARGET_GROUP=your_target_group_idpython main.pyБот будет:
- Мониторить указанные каналы
- Классифицировать новые сообщения
- Пересылать сообщения в целевую группу с результатами классификации
-
Эвристика (
spam_rules_multilabel.py):- Анализ ключевых слов по категориям
- Проверка паттернов (регулярные выражения)
- Структурный анализ (ссылки, капс, эмодзи)
-
BERT (
classifier_multilabel.py):- Использует
cointegrated/rubert-tiny2 - Zero-shot classification (если поддерживается)
- Fallback на text-classification
- Использует
Настраиваются в classifier_multilabel.py:
DEFAULT_THRESHOLDS = {
"ads": 0.4,
"crypto": 0.3,
"scam": 0.2, # Ниже порог для scam (важнее recall)
"casino": 0.3
}main.py- главный файл ботаclassifier_multilabel.py- мультиметочный классификатор (эвристика + BERT)spam_rules_multilabel.py- эвристические правила для каждой категорииner_duplicate_detector.py- NER-детектор дубликатов постов (Natasha)config.py- конфигурация (API ключи, каналы)data_logger.py- логирование сообщений для сбора датасета
label_data_ml.py- инструмент для multilabel разметкиtrain_ml_multilabel.py- обучение ML модели (опционально)ml_model_multilabel.py- класс ML классификатора (опционально)telegram_features.py- извлечение Telegram-специфичных признаков
from classifier_multilabel import classify_multilabel
# Классификация текста
result = classify_multilabel("🔥 Скидка 50% на токены!")
print(f"Оценки: {result['scores']}")
# {'ads': 0.85, 'crypto': 0.60, 'scam': 0.20, 'casino': 0.10}
print(f"Предсказания: {result['predictions']}")
# {'ads': 1, 'crypto': 1, 'scam': 0, 'casino': 0}
print(f"Методы: {result['methods']}")
# {'ads': 'heuristics+bert', 'crypto': 'heuristics+bert', ...}Эвристика анализирует:
- Структурные признаки (длина, строки, CAPS ratio)
- Ссылки (URL, короткие домены, t.me)
- Маркетинговые паттерны (проценты, валюты, промокоды)
- Эмодзи и символы
- Ключевые слова по категориям
Эвристика и BERT работают параллельно для максимальной скорости.
Система использует векторные эмбеддинги для обнаружения дубликатов постов:
- Создание эмбеддингов: Каждый пост преобразуется в векторное представление через модель
paraphrase-multilingual-MiniLM-L12-v2 - Семантическое сравнение: Используется косинусное сходство между векторами постов
- Быстрый поиск: FAISS для эффективного поиска похожих постов в больших объемах данных
- Временное окно: Кэш постов хранится 4 часа (настраивается)
- Порог схожести: По умолчанию 0.85 (85% семантического сходства = дубликат)
- Учет медиа: Совпадение медиа добавляет бонус к схожести (+0.1)
Пример:
- Пост 1: "Маршрутка сгорела дотла в Иркутском районе"
- Пост 2: "Автобус полностью выгорел в Иркутском районе"
- Эмбеддинги: Векторы отражают семантическое сходство
- Схожесть: >0.85 → Дубликат
Преимущества:
- Понимает синонимы и перефразировки
- Работает с разными формулировками одной новости
- Быстрый поиск благодаря FAISS
Если sentence-transformers не установлена, детектор дубликатов автоматически отключается,
но остальная функциональность продолжает работать. FAISS опциональна - без неё используется медленный поиск.
Настройте в config.py:
CHANNELS = [
"https://t.me/channel1",
"https://t.me/channel2",
# ...
]Настройте в config.py:
RUBERT_MODEL = 'cointegrated/rubert-tiny2'
USE_RUBERT = True- Python 3.8+
- telethon
- transformers
- torch
- scikit-learn (опционально, для ML обучения)
- pandas (опционально, для ML обучения)
MIT