Сейчас я разрабатываю сервис, который собирает объявления о недвижимости с торговых площадок. Сервис разбирает характеристики лотов, сравнивает цену за квадратный метр с заданными рыночными эталонами и присылает на почту интересные предложения. Проект ещё в разработке, и по этим письмам я заодно проверяю, что система насобирала.
В очередном дайджесте нашлась штукатурная станция — машина, которой штукатурят стены, в том числе в квартирах. Сама она квартирой не является, но парсер решил иначе.
Получилась «квартира» площадью 150 м² за 281 900 рублей. По расчётам системы — на 98,3% дешевле эталона. Такое предложение действительно трудно пропустить. Особенно если оно умеет подавать раствор.
Как оборудование получило жилплощадь
В рекламном тексте объявления была фраза:
Штукатурьте по 150м2 в смену на объёме и в обычных квартирах.
Для человека смысл понятен: продавец описывает производительность машины и места, где её можно использовать. В заголовке при этом прямо указаны штукатурная станция и оборудование б/у. Продавец квартиру из неё не делал.
Классификатор искал знакомые слова в объединённом тексте объявления. Увидел фрагмент «квартир» и присвоил лоту тип «квартира». Место применения инструмента стало типом продаваемого имущества.
Парсер площади нашёл число перед обозначением квадратных метров и забрал 150. Слова «в смену» он отбросил.
Так производительность 150 м² за смену превратилась в площадь 150 м². У машины появилось жильё, причём довольно просторное.
При загрузке подробностей настоящая площадь недвижимости так и не нашлась. Ошибочное значение с первого этапа осталось в базе.
Арифметика только помогла
Дальше система получила запись с типом «квартира», ценой и площадью. Анализатор делит цену на метры и сравнивает результат с эталоном для этого типа недвижимости и региона.
В расчёт ушли такие данные:
| Что считала система | Значение |
|---|---|
| Цена оборудования | 281 900 ₽ |
| Ошибочно присвоенная площадь | 150 м² |
| Рассчитанная цена за метр, округлённо | 1 879 ₽/м² |
| Эталон для квартир в выбранном регионе | 110 200 ₽/м² |
| Отклонение вниз от эталона | 98,3% |
Это сравнение с заданным эталоном, а не оценка по похожим объявлениям. Но даже самый хороший эталон здесь ничего бы не спас: с квартирой сравнивали штукатурную машину.
Арифметической ошибки не было. Цену оборудования разделили на число из его характеристики производительности. Получившееся маленькое число назвали ценой квадратного метра жилья.
Дальше запись получила высокий балл за «недооценённость», ещё немного за новизну и попала в фокус. После этого дайджест включил её в письмо. Причём при разборе нашлось два таких лота.
Ни один из следующих этапов не вернулся к вопросу, что именно продаётся. Они работали с уже заполненными полями.
Почему я не стал просто запрещать слово «станция»
Можно было добавить «штукатурная станция» в список исключений. Это отсекло бы два объявления, но следующий насос или станок с упоминанием квартир и квадратных метров прошёл бы тем же путём.
Расширить запрет до слов «станция» и «оборудование» тоже не получится. Здание насосной станции — недвижимость. Производственное помещение с оборудованием — тоже. Такой фильтр начал бы выбрасывать нормальные предложения вместе с машинами.
Исправили определение предмета продажи и разбор площади.
Предмет продажи теперь отделяется от рекламного рассказа о его применении. Если продаётся штукатурная машина, упоминание квартир, складов и офисов не должно превращать её в один из этих объектов. В этом случае помог заголовок самого лота. Достоверная категория тоже могла бы помочь, если бы площадка её предоставляла. Общий раздел «имущество» ничего не доказывает.
При разборе площади учитывается контекст числа. «Площадь помещения — 150 м²» и «обрабатывает 150 м² в смену» содержат одинаковые число и единицу измерения, но отвечают на разные вопросы. Производительность нельзя записывать в площадь, даже если рядом больше ничего подходящего не нашлось.
У смешанных объявлений остаются свои сложности. Если продаётся здание вместе с оборудованием, наличие машины в тексте ещё не повод отвергать весь лот. На таких случаях и проверяется, не стало ли исправление слишком грубым.
А где здесь искусственный интеллект
В этой классификации его нет. Машину записали в квартиры обычные правила поиска слов и чисел.
Подключать языковую модель ради этого случая я не стал. Причину удалось воспроизвести: конкретная фраза давала неверный тип, конкретное выражение превращалось в площадь. Обошлись исправлением правил и тестами на похожих объявлениях.
ИИ можно будет отдельно рассмотреть для сложных объявлений. Но он не избавит от необходимости решать, что делать с неоднозначным лотом, откуда взялось поле и насколько ему можно доверять. А расходы, задержки и собственные ошибки классификации добавит.
Что проверили
Оба объявления со станциями стали примерами для регрессионных тестов. Добавили и противоположные случаи, чтобы фильтр не начал отвергать всё подряд:
- штукатурная станция «для работы в квартирах», с производительностью в м² за смену;
- настоящее помещение указанной площади, которое продаётся с оборудованием;
- здание насосной станции;
- объявление, где одновременно указаны площадь здания и производительность машины.
Проверка одного извлечённого числа недостаточна. Важно проследить, что реально передаётся на сохранение после разбора объявления и загрузки подробностей. Иначе один этап уберёт ложную площадь, а следующий вернёт старое значение.
Отдельно понадобилось проверить уже отправленное письмо. Наличие объекта в текущем списке интересных лотов ещё не доказывает, что он был в конкретном дайджесте. В сохранённом составе отправки нашлись оба объявления: ошибка действительно дошла до письма, а не осталась промежуточным результатом обработки.
Ошибка воспроизведена и исправлена. В регрессионных проверках обе станции отсеиваются, производительность больше не становится площадью, а настоящие помещения с оборудованием остаются недвижимостью. Получился полезный набор тестов из двух совершенно неподходящих объявлений.
Теперь среди тестовых примеров есть машина, которая на короткое время стала выгодной квартирой. Для машины 150 м² в смену — полезная характеристика. Для квартиры — повод проверить парсер.
Делаю сервисы сбора и обработки данных: от парсинга сайтов до проверок, фильтров и рассылок. Если нужна такая система или существующий парсер приносит сюрпризы, напишите мне — обсудим задачу.
