Зачем приложению для аренды квартир bird нужны нейросети и как они работают
Привет, меня зовут Вова . Мы с командой занимаемся обработкой данных и всем, что связано с 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 .
Опубліковано: 14/12/20 @ 08:00
Розділ Різне
Рекомендуємо:
Как стать классным джуном. План действий, который поможет быстро расти
Эффективная креативность: как стать хорошим гейм-дизайнером. Часть 1
Навіщо і як QA писати тестову документацію. Структуруємо та робимо її зрозумілою
С чего начать свой путь в нейронные сети, или Ответы будущему AI-специалисту
Каждому из нас нужен ментор. И вот почему