решение из ленты заказов

ТГ-парсер: жёсткий фильтр и склейка пересылок

Бот собирает сообщения из чатов по ключевым словам — и присылает слишком много и по нескольку раз: одно объявление переслали в четыре канала, значит четыре уведомления. Ниже — живой срез … сообщений из … открытых Telegram-каналов, снятый …. Переключите промпт с мягкого на жёсткий и включите склейку — воронка пересчитается на ваших глазах, и на каждое «мимо» будет причина словами.

Воронка — живой прогон

ЯрусСообщениеПочему именно такКопийПост

Страница считает всё у вас в браузере: ничего не уходит на сервер. Данные обезличены — @ники, телефоны, e-mail и внешние ссылки вырезаны, ссылка на публичный пост оставлена, чтобы любую строку можно было проверить.

Почему дубликаты уходили в чат

🔁

Сравнение «в точности» не работает

При пересылке у сообщения меняются шапка канала, эмодзи и подпись. Текст уже не равен исходному, и проверка «такое уже было?» его пропускает. Поэтому здесь считается похожесть — мера Жаккара по тройкам слов: переписанная шапка на решение не влияет, совпадение 60 % и выше — это та же самая вещь.

🧮

И быстро на больших пачках

Сравнивать каждое с каждым — на 5 000 сообщений 12 млн пар. Кандидаты сначала отбираются по редким словам сообщения, похожесть считается только для них. Замер: срез на этой странице — 0,1 с, пачка в 5 000 сообщений — 2 с, и это в браузере, на сервере быстрее.

📌

Остаётся одно уведомление

Из группы копий остаётся самая ранняя, а рядом пишется «копий: 4» и список каналов. Видно, что объявление разлетелось, но перечитывать его четыре раза не нужно.

🧷

Правила, а не характер модели

Фильтр — правила с объяснением, а не вызов модели на каждое сообщение. Одинаковый вход даёт одинаковый выход, решение можно проверить тестом, и счёт за токены не растёт вместе с потоком. Модель остаётся для спорных — яруса Б.

Из чего складывается «жёстко»

  1. Стоп-слова. Вакансия и оклад, самопрезентация исполнителя («меня зовут», «портфолио прилагаю»), серое (накрутка, капча, купля базы), крипта и ставки, «за отзыв» и «за долю». Такое вылетает, даже если ключевое слово в сообщении есть.
  2. Профиль. Тема должна быть вашей: бот, парсер, интеграция, CRM, лендинг, таблицы, отчёты. Слово ищется с начала слова — «курс» найдёт «курсы», но не «конкурс».
  3. Признак задачи. «Нужно», «требуется», «ищу подрядчика», «доработать». Пост без задачи — это реклама или рассуждение, в чат ему не надо.
  4. Объём и бюджет. «Нужен бот» в три слова — не ТЗ; бюджет ниже порога или не назван — ярус Б, «сначала спросить», а не «брать».
  5. Причина на каждое «нет». В уведомление идёт строка «мимо: вакансия, а не заказ («оклад»)» — видно, за что фильтр отсеял, и словарь можно поправить руками.
Словари правятся без программиста — вот как они выглядят
загрузка…

Что получает заказчик

  1. tg_filtr.py — один файл, встаёт рядом с вашим парсером: прогон(сообщения, режим="жестко") перед отправкой в чат. Зависимостей нет, только стандартная библиотека.
  2. ПРАВИЛА — четыре словаря (стоп, профиль, задача) в том же файле, правятся руками.
  3. Тесты: 17 на ядро и 9 на модуль, плюс проверка, что браузер и бот считают одно и то же — числа на этой странице и числа у вас совпадают до единицы.
  4. Выгрузка CSV с колонкой «почему» — чтобы раз в неделю посмотреть, что фильтр отрезал, и поправить словарь.

Доработка вашего бота — 1–2 дня

Жёсткая фильтрация с причиной на каждое решение, склейка пересылок, и отдельно — парсер объявлений в Telegram с нужной вам площадки. Код и словари остаются у вас, запуск там же, где ваш бот работает сейчас.

Обсудить задачу