Как мы используем ИИ в разработке сервисов для приложения «Я здесь живу»

В нашей недавней статье про новый сервис в мини-приложении «Я здесь живу» «Развитие территорий» мы упоминали использование в работе искусственного интеллекта. Один из примеров применения ― нормализация адреса в строке поиска. Сегодня расскажу, как мы к этому пришли.

Напомню, что особенность мини-приложения во ВКонтакте «Я здесь живу» в использовании принципа шаговой доступности. Пользователь может найти в нем ближайшие к дому парки для прогулок с собакой, нетривиальные локации, спортивные площадки и так далее. И, разумеется, чтобы магия случилась, пользователю необходимо ввести свой адрес. Можно его написать один раз, а можно менять и смотреть, что же есть рядом с домом близких людей.

Немного статистики по мини-приложению «Я здесь живу»

Ежедневный охват пользователей на текущий момент около 1000 человек.

Ежемесячный охват ― 31 000

Ежегодное количество пользователей ― более 300 000

Человеку свойственно ошибаться

Рано или поздно любой сервис, в котором необходимо вводить адрес, сталкивается с таким фактором, как опечатки или ошибки в написании. До внедрения сценариев с использованием ИИ у нас была своя база адресов, переработанная из данных, полученных благодаря Государственному адресному реестру.

Мы часто сталкивались с некоторыми сложностями. Одна из наиболее распространённых ― различные форматы адресов в городских базах данных (отсутствие единообразия). Затрудняли работу неактуальные или некорректные адреса, иногда ― пересечение различных адресов. У Петербурга есть также локальные особенности, как, например, дома с литерами или одноимённые улицы, которые могут быть как в самом городе, так и в пригородах.

То есть у пользователя могло не получиться с первого раза найти то, что нужно. И это при условии, что адрес указан верно. А ведь случалось и иное: пользователь мог допускать опечатки при вводе адреса или даже не написать его целиком. В этом случае человек не находил релевантный для себя результат ― каждый 10-й натыкался на зияющую пустоту в адресном поле.

Такое положение дел печалило не только пользователей, но и нас, потому что мы и сами активно используем наши сервисы. Наша команда постоянно работает над тем, чтобы мини-апп развивался, становился удобнее и с ним было приятно взаимодействовать на постоянной основе.

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

Нам предстояло работать с наборами данных, в которых адреса могут быть и разных форматов, и произвольно введёнными сведениями, что, безусловно, усложняет процесс построения качественных моделей.

Например, пользователю хочется посмотреть, что полезного мини-апп может предложить по сервисам в Петроградском районе. В строке адреса он вводит «Аптекарский проспект, 18». При этом человек может допустить опечатку, и в итоге получится «Апекарский, 18». А другой пользователь хочет узнать информацию по Приморскому району и пишет: «Яхтенная, 12». Но ведь он также может в суматохе ввести адрес с пропуском буквы или даже запятой ― «Яхенная 12» и так далее.

Проблема в неправильном определении адресов и координат напрямую влияет на создание качественных наборов данных и функциональность сервисов.

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

Как мы это сделали

Наши разработчики проанализировали все имеющиеся наборы данных, очистили их от ненужной информации, знаков препинания и т.д. Затем воспользовались AddrExtractor из NLP-пакета Natasha для извлечения деталей (номер дома, улица, населенный пункт и т. д.). Разумеется, сами по себе полученные данные мало что давали, поэтому команда стала придумывать архитектурное решение.

Мы считаем, что лучший подход — это использовать пакет Natasha для обработки текста и извлечения фичей. Для получения векторных представлений (эмбеддингов) текста мы применяли FastText. После чего по эмбеддингам через cosine similarity искался ближайший вектор и таким образом ― нужный адрес. Для реализации нашего ML-сервиса мы создали API с помощью FastAPI, который предоставляет HTTP-интерфейс.

Эталонные данные для модели мы получаем из ФИАС посредством API. Данные для обучения ― путем парсинга адресов и данных геокодера. В работе используем библиотеки и модели с открытым исходным кодом.

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

Результат

Если говорить с точки зрения масштабов города, то разработанная модель позволила решить вопрос совершенствования методов определения корректного адреса из Государственных информационных систем, а также объединить большое количество разобщённых городских баз данных.

Такую выдачу теперь видит пользователь "Я здесь живу", когда вбивает нужный адрес даже с ошибкой
Такую выдачу теперь видит пользователь "Я здесь живу", когда вбивает нужный адрес даже с ошибкой

Наличие инструментов для точного определения адресов ― важный и необходимый аспект, как для создания приложений и сервисов на базе Государственных информационных систем, так и самих ГИС.

Если конкретизировать результаты внедрения сценария с использованием нейросети в мини-апп, то количество жалоб на некорректно определенный адрес снизилось на 90%. По обратной связи мы также видим, что теперь результат поиска соответствует ожиданиям пользователя, и лишь 1% не может пока найти искомый адрес.

Мы над этим продолжаем работать: пользователи могут отправлять личные сообщения о проблеме в официальном сообществе «Я здесь живу». Мы оперативно их читаем и передаем в работу. Данные, поступающие от пользователей, анализируются и становятся частью дата-сета для переобучения модели.

Команда «Я здесь живу» постепенно осваивает методы искусственного интеллекта и будет применять их в сервисах текущих и будущих.

Дальше ― больше!

1515
6 комментариев

Главное, чтобы пользователь при выборе правильного адреса снова не ошибся в спешке))

2
Ответить

Наконец-то понятный пример пользы от искусственного интеллекта) спасибо!

1
Ответить

кажется, такая мелочь - исправить ошибку в слове. а за этим такая большая техническая работа

1
Ответить

Я гуманитарий, приложением пользуюсь, а вот техническую часть не очень понял, но спасибо за рассказ )

1
Ответить

Здорово, что показываете, что "под капотом" у любимого ЯЗЖ.

1
Ответить

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

1
Ответить