Зачем приложению для аренды квартир bird нужны нейросети и как они работают

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Привет, меня зовут Вова. Мы с командой занимаемся обработкой данных и всем, что связано с AI, в компании ЛУН. Хочу рассказать о том, как мы делали процессинг с ML-алгоритмами для bird — нашего приложения для аренды квартир в Киеве.

Сегодня bird празднует свой второй день рождения. И сегодня мы объявляем о запуске bird AI — искусственного интеллекта, который помогает людям снять квартиру. Мы научили его понимать местоположение из текста, определять дубли объявлений, вычислять мошенников и их фейковые предложения, улучшать фотографии и фильтровать квартиры с «бабушкиным» ремонтом.

На самом деле, AI-алгоритмы присутствовали в bird с самого первого дня его запуска. Часть решений мы реализовали для ЛУН Поиска (теперь Flatfy) еще до того, как придумали bird. Эти решения прошли большой путь, от эвристик на if-else конструкциях до более сложных ML-based подходов. Очень хотелось бы рассказать о всех этапах подробно, но формат публикации не очень хорошо подходит для длинного повествования, потому опишу самые значимые части проделанной работы.

Основной фишкой приложения всегда была 3D-карта. А какая может быть карта, если мы вообще не знаем, где находится квартира? Именно здесь и начинается bird AI, с модуля экстракции и матчинга географии.

Работа с географией

Данные по объявлениям мы получаем в сыром виде из парсеров или XML-фидов. В некоторых присутствует поле «адрес», но таких очень мало, и часто при подаче объявления люди заполняют в поле адреса совсем другую информацию, используя его как дополнительное текстовое поле. В то же время реальный адрес добавляют в описание или заголовок объявления. Поэтому, чтобы определить местоположение квартиры, первым делом мы должны найти все упоминания геоданных в тексте и всех полях.

Для этого в текущей версии Geo Entity Extractor используем дообученный BERT for NER. Нам отлично подошла библиотека transformers на PyTorch. Основой всего решения стал BertForTokenClassification. Мы наследовались от предобученной модели bert-base-cased и дообучили ее на выборке из 100к размеченных текстов объявлений.

Для разметки данных под абсолютно все наши задачи мыиспользуем собственную платформу, которую назвали Flair Cortex. Ее основная задача — сделать процесс сбора данных максимально быстрым и удобным. Поэтому под каждый тип задачи существуют свои детально проработанные темплейты. Также Cortex позволяет удобно экспортировать готовые данные в удобном нам формате.

Как результат работы модуля Geo Entity Extractor, получаем токены четырех категорий: город, район, улица и адрес (улица + номер дома). Конечно, не во всех текстах объявлений есть эта информация, поэтому публикации без адреса не могут попасть в bird.

После построения кандидатов в географию запускается следующий этап обработки — матчинг токенов на нашу геобазу. Здесь используется надстройка над Elasticsearch с кастомным скором, которая быстро и точно сопоставляет найденную географию с имеющейся в базе. Иногда возникают проблемы, если в объявлении было указано несколько адресов или найденного адреса просто нет у нас в геобазе. Регулярно следим за «здоровьем» системы, анализируя количество токенов, которое не удалось сматчить. Эта метрика быстро сигнализирует о возникновении проблем.

Так мы получаем координату объявления и с этого момента точно знаем, в каком доме оно находится. А дальше bird красиво отображает это в виде подсвеченного домика с квартирами на 3D-карте.

Группировка дублей объявлений

Сейчас в bird мы обрабатываем объявления с 24 источников. В среднем каждую квартиру автор размещает на шести сайтах. Нам очень важно не захламлять bird повторяющимися квартирами и в то же время собрать максимум предложений со всего рынка в одном месте. Для этого разработали несколько вспомогательных систем.

Сильный «признак одинаковости» квартир — фотографии. Чем лучше мы умеем понимать, что на картинке одна и та же квартира — тем качественнее сможем их сгруппировать.

Первые версии дедупликатора изображений работали на ключевых точках. Использовали ORB (Oriented FAST and rotated BRIEF) как детектор фич и предварительный поиск по близости перцептивных хешей для сужения выборки. Со временем стало понятно, что систематично улучшать такое решение практически невозможно, а случаи неправильной группировки встречались часто. Потому применили совершенно другой подход с нейросетями.

Реализовали модификацию ResNet-50 путем конкатенации нескольких промежуточных слоев вместе с предпоследним выходным слоем. Таким образом получили экстрактор фич изображения, который одновременно «обращает внимание» и на low-, и на high-level-features. Для формирования предвыборки все так же используется pHash картинок с самописным движком быстрого поиска по Hamming distance. Итоговая точность определения дублей картинок на нашей базе составляет 99%.


Еще одним вспомогательным алгоритмом для группировщика объявлений стал классификатор картинок. При анализе «одинаковости» предложений нам важно сравнивать именно интерьеры, так как изображения фасадов зданий зачастую публикуются одинаковые для разных квартир. Считать объявления дублями, если у них много одинаковых фоток, но это фотки фасадов — нельзя. Здесь используется дообученный на 120к картинок EfficientNet-B4 без каких-либо модификаций, он классифицирует картинки на 34 категории. Эта информация в дальнейшем используется в разных местах обработки. Для сравнения объявлений о квартирах мы пользуемся фотками категорий «indoor»: гостиная, кухня, санузел, коридор и так далее.

Эта информация вместе со всеми доступными параметрами квартир, такими как цена, площадь, этаж, количество комнат и множество других, отправляется на модуль принятия решения, который работает на XGBoost.

Фейки — огромная боль каждого, кто ищет квартиру

До bird мы уделяли качеству данных в аренде откровенно мало внимания. Все изменилось, когда реальные пользователи приложения начали писать нам о том, как много фейков они встречают в процессе поиска квартиры. Мы увидели эту проблему и плотно работаем над ее решением.

Система анализирует десятки параметров квартиры, проверяет «поведение» автора публикации, смотрит на другие похожие объявления. Наибольший вклад в итоговой результат дали три решения.

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

Мы применили подход, который комбинирует Error level analysis и CNN. Для ускорения разработки в этом случае использовали библиотеку fastai2. Она не подходит, если нужна какая-то серьезная кастомизация, но отлично справляется с задачей быстрой проверки гипотез. Сейчас классификатор правильно определяет 9 из 10 рендеров.

Вторым важным элементом системы стала проверка, не украдены ли изображения из сайтов в других странах. Для этого пришлось парсить один известный поисковик. Наконец, сопоставление указанной цены в объявлении с ценой, которая, как мы предполагаем, должна быть адекватной для этого предложения.

Современные фейки очень разнообразные. В некоторых случаях все можно определить по явно заниженной для этого ЖК цене, в других ситуациях определить, что объявление — фейк, без звонка вообще невозможно. Наша первая версия справляется с задачей на 95%.

Зачем это все?

Как итог, хотелось бы сказать, что все наши действия мотивированы желанием сделать жизнь человека, выбирающего жилье — проще. Изначально мы работаем с данными в сыром виде, а качество этих данных оставляет желать лучшего. С помощью AI мы делаем шаг на ступень выше в качестве данных и, соответственно, в качестве продукта для пользователя.

AI — это суперсила для bird, мультипликатор усилий, который позволяет нам маленькой командой (Дима, Даня, Аня, Макс — спасибо вам, вы лучшие) делать большие вещи и улучшать продукт для наших пользователей.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось5
До обраногоВ обраному15
LinkedIn



30 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

🖤👌🎉 яка б була казка — якщо б вдалося масштабувати і на інші міста країни

Класна стаття і класний проєкт!!!!
По статті та ситуації коли її читаєш у тебе виникає питання, а в наступному абзаці отримуєш відповідь! Я намагався зробити подібний проєкт на примітивному рівні для себе. Навіть писав статтю на доу по його частині. Так що розумію який об’єм роботи ви зробили. Маю 2 питання: звідки ви брали дані для геобази(OSM чи інші джерела). А друге питання чому Ви обжежуєтесь лише квартирами а не берети скажімо ще будинки та ділянки (це питання я собі задаю що разу коли відкриваю ваш сайт:-)).

У домов и тем более участков — редко есть точный адрес. Нужно менять продукт под эти разделы. А спрос на эти разделы еще год назад был в 3-5 раз ниже чем на квартиры.

Сейчас ситуация меняется, все больше интерес к загородной недвижимости — так что мы активно думаем в эту сторону)

По ділянках в частині оголошень є кадастрові номери (читай адреси) по яких можна визначити їх розташування і додаткові характеристики. До речі не планує зробити сервіс який би визначав відносні рамки, у скільки можна було б оцінити нерухомість для продажу (в даному випадку мова йде не про справжню ринкову вартість а про вартість яку може пропусти база ФДМУ при реєстрації звіту). Це можна використовувати при розрахунку податків які потрібно буде сплатити, зазвичай їх платять покупці.

Мы не проводили детальный анализ по участкам/домам, но навскидку точное расположение можно получить по 10-20%. У квартир ситуация с точностью до наоборот, у 80-90% адреса есть (хотя 12 лет назад, когда мы только начинали ситуация была далеко не такая). Нас ждет долгая кропотливая работа :)

Оценка — пока вне нашего фокуса.

Дякую за відповідь, ви абсолютно праві, з будинками та ділянками така проблема дійсно є. Але з появою публічної кадастрової карти ситуації по трохи покращується

Как-то определяете ложноположительные срабатывания по фейкам?

Вспомнился мой случай: на одном популярном сайте моё объявление о продаже мотоцикла банили по причине того, что цена ниже аналогичных на 30%. При этом они не учитывали пробег (у моего пробег был в разы больше), а также считали «аналогичными» весь модельный ряд дорожников одного производителя с объемами от 125 до 1300 см3. Заявленная цена была адекватна для своевременной продажи, что и было вскоре сделано без того сайта.

перед выводом в продакшн тестировали все с пост-модерацией на новых потоковых данных, проверяли в 4 этапа пачки из разного кол-ва обьявлений, средний уровень фолс позитив срабатываний на них — 3%
дополнительно реагируем на все жалобы пользователей о том, что мы неправильно отметили квартиру как фейк, перепроверяем так ли это и добавляем в трейнинг сет

Расскажите пожалуйста подробней про

high-level-features

и целом как это работает

конкатенации нескольких промежуточных слоев вместе с предпоследним выходным слоем. Таким образом получили экстрактор фич изображения, который одновременно «обращает внимание» и на low-, и на high-level-features.

это тема для отдельного поста, если интересуют детали :)
с удовольствием отвечу на более конкретные вопросы в dm или могу сбросить пейперов по этой теме)

dm

 что это? — не знаю такой аббревиатуры

А можно статьи скинуть по этой теме? Спасибо.

Стаття дуже цікава, дякую.
До речі, хотілося б бачити не тільки рейтинг «гарного спрацювання», а й якій відсоток «ложних спрацювань» — коли нормальна квартира відноситься системою до фейкової. Це важливий показник добротності фільтрів.

Думаю, ви спробували багато систем рейтингів, але все одно ще порекомендую подивитись в сторону spamassassin, там доволі розлога система рейтингування та винесення вердикту й доволі проста система підключення будь-яких джерел репутації. Гадаю, сама модель може лягти на ваш кейс доволі гладко.

Спасибо)

Мы всегда смотрим на показатели полноты и точности по каждому из классов. Для простоты понимания в статье привели одним числом. Среди фейковых объявлений процент ложноположительных срабатываний 3-4%, с этими ситуациями продолжаем работать и улучшать результат.

На spamassassin не смотрели, обратим внимание, спасибо

Проясните для того кто не в теме.
Приложение Bird это аренда квартир от Лун.
Flatfy это аренда квартир (в том числе) от Лун(?)
Используют ли оба проекта единую базу?
Использует ли Flatfy ваши AI фишки (или будет ли)?

bird — приложение аренды для Киева
flatfy — продажа и аренда квартир и домов по всей Украине

Мы используем одну базу объявлений, но критерии попадания в bird строже (например, у объявления должен быть указан точный адрес). Когда точность bird AI будет 99% — сможем использовать алгоритм в других проектах

flatfy — просто подтягивает данные с других ресурсов. Идея с картой шикарная, но — переходишь по ссылке — «квартира уже месяц как сдана» :(

Да, это большая наша боль и все еще нерешенная проблема(

Первым приоритетом взялись за борьбу с фейками, сейчас все время наблюдаем, добавляем примеры, улучшаем систему. Следующим шагом будем браться за вопрос актуальности объявлений

Ребята, очень круто! Как всегда мы большие молодцы:)
P.S. Вова, пишите больше таких статей. Реально интересно читать.

Спасибо, интерсная статья и ваша компания! Успехов в разработке и написании текстов.
Жаль нету по Андроид прилаги

Спасибо!

На Андроид bird точно появится) Подписаться и следить за новостями об этом можно тут — android.birdrent.com

Чудова й пізнавальна стаття!

Для этого в текущей версии Geo Entity Extractor используем дообученный BERT for NER. Нам отлично подошла библиотека transformers на PyTorch. Основой всего решения стал BertForTokenClassification. Мы наследовались от предобученной модели bert-base-cased

Закину этот абзац в свою копилку эрудита

Столько разных хитростей под капотом, чтобы сделать простую и удобную аппку. Очень круто!

Підписатись на коментарі