IT.
Все статьи

Две ванные за два доллара: как калибруется разбор цен в bazito

Илья Трапезников Опубликовано

В статье про устройство bazito деньги оставлены за правилами: период, вилку и валюту разбирает детерминированный код, а модель решает только смысл поста. У такого разделения есть цена. Правила ошибаются на живых текстах, и за неделю с 7 по 13 сентября их правили больше десятка раз.

Семь живых ошибок

Все примеры взяты из настоящих постов.

Текст объявленияЧто получалосьЧто должно быть
«3r, 2b, 98м², 4/5 … 1000$»цена 2 доллара1000 долларов, «2b» это две ванные
«Minimum income $77.800 Maximum income 154k»аренда за 154 000 в месяцобъявление без цены
«🅿️ паркинг + 80 €»квартира за 80 евродоплата за парковку
«1000$», пустая строка, «2+1»цена 2 доллара1000 долларов
«На год: 900€/мес»900 евро в год900 евро в месяц
«Cijena noćenja: 50-140€»вещь на продажу за 50 европосуточное жильё, 50–140 за ночь
«Сдам 2+1 70€/сутки»вещь на продажупосуточная аренда

У каждой строки своя механика. Знак валюты в конце строки склеивался с числом в начале следующей. Сокращение бата в одну букву совпадало с тем, как в Тбилиси пишут число ванных. Из двух месячных сумм выбиралась меньшая, а меньшей оказывалась парковка. Суточную цену разбор знал только по-русски и в записи «per night», поэтому черногорское «noćenja» превращало квартиру в Будве в товар.

Замер: кандидаты и контроль

Каждую правку денежных правил этой недели до слияния прогоняли по корпусу, только на чтение. Выборок две. Кандидаты: посты, где явление может встретиться, например все 3 409 постов со знаком парковки. Контроль: около 8 000 случайных прочих. Старый и новый код разбирают обе выборки, результаты сравниваются построчно.

В контроле не должно измениться ничего. Перемена там означает, что правило задевает чужие тексты, и такую правку не принимают, сколько бы она ни исправила у кандидатов. Перемены у кандидатов разбирают отдельно. По парковке их было 62 из 3 409, все прочитаны вручную, и все 62 оказались парковкой вместо аренды: Варна, Будва, Батуми, Вена, Нью-Йорк. Правка склейки через перевод строки дала 1 624 перемены на 2 387 кандидатах при нуле в контроле.

Замер ловит саму правку

Та же схема находит ошибки и в новом коде.

Правка про «На год: 900€/мес» шла в три прогона и на момент написания лежит в отдельной ветке, в работу её ещё не выкатили. Первый прогон дал 1 639 перемен, почти все верные, но около 35 прайсов проката машин стали хуже: в строке «1–3 дня, 95 €/сутки» разбор отбрасывал левую часть и делал прокат месячной арендой за 1 750 евро. Проверку вынесли из шаблона в код и сузили: период перед суммой уступает, только если за суммой стоит свой период и он другой. Третий прогон на 8 086 кандидатах нашёл ещё одну лишнюю перемену, в посте сербской барахолки «400 дин. Вместе отдам за 500»: предлог «в» и слово «месте» дали хвост «в месяц», и куртка стала сдаваться помесячно.

С записью «1+1» вышло похоже. Турецкая запись комнат стала признаком жилья, и посуточные посты Кипра перестали быть вещами. Чтобы пражские списки квартир не входили в жильё с одной случайной ценой из списка, три записи «N+1» подряд считались перечнем. Второй прогон показал, что так снимается 839 настоящих объявлений: одиночное объявление повторяет свою планировку («АРЕНДА 2+1 … квартира 2+1 … планировка 2+1») или дописывает хвост «есть в наличии 1+0 1+1 2+1». Перечнем теперь считаются только записи с ценой рядом. Цифра ограничена пятью, потому что «8+1 & 6+1» в прокате машин это места в микроавтобусе.

Что осталось неверным, записано в описании самой правки и не тронуто. Две стамбульские продажи без слова «продажа» стоят арендой, а анонс стендапа на телеканале «1+1» стал жильём без цены.

Доход арендатора против виллы

Требование к доходу арендатора из нью-йоркских объявлений доступного жилья выглядит как цена: доллары и крупное число. Потолок правдоподобия его не поймает. Выше миллиона бат на витрине стоят 110 объявлений, и 16 из них настоящие ставки за виллы. Настоящая аренда и требование к доходу расходятся на 15%, и разделяет их только слово рядом с числом.

Голое «income» или «доход» для этого не годится. Английское слово отнимало оплату у вакансии «Income: up to €250 per day», а русское стоит в 947 жилищных объявлениях в смысле доходности и в 100 вакансиях в смысле заработка. Отбраковывается граница дохода: «минимальный», «максимальный», «совокупный», плюс сбережения и кредитный рейтинг. Из 1 429 живых объявлений с такими основами не изменилось ни одно, в контроле из 20 000 тоже ноль.

Одна буква и два списка

Правка с ванными началась с другого дефекта. Токены валют узнавались по одному списку, код валюты определялся по другому, и однобуквенное «б» было только в первом. Объявление получало пометку «валюта написана», хотя валюту брали из умолчания канала.

От этой пометки зависит валюта самого канала: её считают по явным упоминаниям, и чужая валюта голосовала сама за себя. Прогон по всем 227 718 постам корпуса нашёл 81 написание валюты и четыре токена без кода, все однобуквенные. Ушло 92 ложных голоса, а валюта не сменилась ни у одного из 435 источников.

Потом замер витрины показал, что в одну букву пишут не только бат. Однобуквенный токен теперь считается деньгами только в канале, где валюта по умолчанию и так тайская. На 127 822 сравнённых строках цена сменилась у 54, и все в правильную сторону: два доллара стали настоящими ценами от 850 до 2 700 долларов. Законной батовой цены в нетайском канале замер не нашёл ни одной.

Прошлое чинится отдельно

Исправленное правило разбирает только новые посты. Строки на витрине сохраняют старые цены, пока их не переразберут, и делается это отдельно: по списку из замера, сначала вхолостую. После правки суточной цены холостой и боевой прогоны совпали: переразобрано 18 строк, 11 вернулись из вещей в жильё, у 4 сменилась цена, одну сняли с витрины. Ещё одну строку из списка исключили вручную, потому что неверная цена в ней сменилась бы другой неверной.

Правка может отменить объявление целиком, если вся его цена держалась на выдуманном числе. Так было со стамбульским перечнем мебели, который давал объявление «201 TRY». Инструмент пересчёта цен такие строки не снимал, потому что обещает трогать только денежные поля. Снятие добавили флагом, а не по умолчанию, чтобы обещание инструмента не расширялось молча.

Зачёркнутые цены пришлось чинить уже на приёме. В базе текст хранится без разметки, и скидка «старая новая» приходила двумя равноправными суммами, причём зачёркнутой бывает и первая, и вторая. Новые посты теперь теряют зачёркнутое при приёме. Старые перечитываются с публичной страницы поста и переписываются, только если прежнее прочтение совпадает с базой, то есть это та же редакция, а не текст, отредактированный позже.

Проект целиком, с архитектурой, решениями и цифрами, собран на странице кейса bazito.


В статье нет шаблонов разбора, порогов, списка каналов и адресов источников. Примеры текстов взяты из открытых каналов, цифры замеров относятся к 7–13 сентября 2026 года и сняты с рабочей базы только на чтение.