Воронка — живой прогон
| Ярус | Сообщение | Почему именно так | Копий | Пост |
|---|
Страница считает всё у вас в браузере: ничего не уходит на сервер. Данные обезличены — @ники, телефоны, e-mail и внешние ссылки вырезаны, ссылка на публичный пост оставлена, чтобы любую строку можно было проверить.
Почему дубликаты уходили в чат
Сравнение «в точности» не работает
При пересылке у сообщения меняются шапка канала, эмодзи и подпись. Текст уже не равен исходному, и проверка «такое уже было?» его пропускает. Поэтому здесь считается похожесть — мера Жаккара по тройкам слов: переписанная шапка на решение не влияет, совпадение 60 % и выше — это та же самая вещь.
И быстро на больших пачках
Сравнивать каждое с каждым — на 5 000 сообщений 12 млн пар. Кандидаты сначала отбираются по редким словам сообщения, похожесть считается только для них. Замер: срез на этой странице — 0,1 с, пачка в 5 000 сообщений — 2 с, и это в браузере, на сервере быстрее.
Остаётся одно уведомление
Из группы копий остаётся самая ранняя, а рядом пишется «копий: 4» и список каналов. Видно, что объявление разлетелось, но перечитывать его четыре раза не нужно.
Правила, а не характер модели
Фильтр — правила с объяснением, а не вызов модели на каждое сообщение. Одинаковый вход даёт одинаковый выход, решение можно проверить тестом, и счёт за токены не растёт вместе с потоком. Модель остаётся для спорных — яруса Б.
Из чего складывается «жёстко»
- Стоп-слова. Вакансия и оклад, самопрезентация исполнителя («меня зовут», «портфолио прилагаю»), серое (накрутка, капча, купля базы), крипта и ставки, «за отзыв» и «за долю». Такое вылетает, даже если ключевое слово в сообщении есть.
- Профиль. Тема должна быть вашей: бот, парсер, интеграция, CRM, лендинг, таблицы, отчёты. Слово ищется с начала слова — «курс» найдёт «курсы», но не «конкурс».
- Признак задачи. «Нужно», «требуется», «ищу подрядчика», «доработать». Пост без задачи — это реклама или рассуждение, в чат ему не надо.
- Объём и бюджет. «Нужен бот» в три слова — не ТЗ; бюджет ниже порога или не назван — ярус Б, «сначала спросить», а не «брать».
- Причина на каждое «нет». В уведомление идёт строка «мимо: вакансия, а не заказ («оклад»)» — видно, за что фильтр отсеял, и словарь можно поправить руками.
Словари правятся без программиста — вот как они выглядят
загрузка…
Что получает заказчик
tg_filtr.py— один файл, встаёт рядом с вашим парсером:прогон(сообщения, режим="жестко")перед отправкой в чат. Зависимостей нет, только стандартная библиотека.ПРАВИЛА— четыре словаря (стоп, профиль, задача) в том же файле, правятся руками.- Тесты: 17 на ядро и 9 на модуль, плюс проверка, что браузер и бот считают одно и то же — числа на этой странице и числа у вас совпадают до единицы.
- Выгрузка CSV с колонкой «почему» — чтобы раз в неделю посмотреть, что фильтр отрезал, и поправить словарь.
Доработка вашего бота — 1–2 дня
Жёсткая фильтрация с причиной на каждое решение, склейка пересылок, и отдельно — парсер объявлений в Telegram с нужной вам площадки. Код и словари остаются у вас, запуск там же, где ваш бот работает сейчас.
Обсудить задачу