Назад

Рекомендательный сервис и туристический помощник

Рекомендательный сервис и туристический помощник

В рамках самого большого туристического хакатона страны «Moscow Travel Hack», мы с командой разработали прототип туристического помощника на основе машинного обучения и больших данных.

Трек «Russpass» которым мы занимались предполагал разработку ПО, которое собирало бы индивидуальный маршрут для пользователя и соотносило его с загруженностью Москвы.

Загруженность Москвы предоставлялась нам в виде огромного массива полигонов на карте с указанием количества людей в них за каждый день в течении месяца. С помощью этих данных нужно было построить предсказательную модель, свести её с рекомендательной системой и завернуть её в блестящую обертку геймификации и приятного дизайна. И всё это за чуть больше 28 часов. Делов-то.

В ядро идеи нашей системы лёг принцип «то что отличает нас от других, одновременно делает похожими».

То есть, если у вас с человеком одинаковый вкус в музыке, политике и у вас похожая психология, то скорее всего те объекты туристического притяжения, что понравились ему – понравятся и вам.

Исторически сложилось так, что вкус в музыке и политике, математически опознать довольно трудно. А вот психологический портрет человека в понятной для программы метрике оценить очень просто. Поэтому, для построения матрицы схожести я решил использовать психологический тест. Но среди нас не было психологов, поэтому вопросы в тесте были сделаны от балды. Но главное ведь – идея.

Примерный информационный путь, который мы предполагали:

Пользователь, заходя в приложение, проходит простой тест, который определяет его в кластер людей, похожих на него.

Экран приветствия, экран теста Скриншот страницы

Экран профиля Скриншот страницы

Далее, юзер собирает туристическую группу из авторизованных пользователей или вступает в существующую.

Список групп/создание группы Скриншот страницы

После того как группа создана, хост группы проходит конфигурационный тест – указывает,на сколько дней планируется поездка, какие места он хочет посетить в этот раз, а какие нет, сколько у него денег, хочет ли поесть по дороге и так далее. На основании этого теста в следствии фильтруются POI.

Фильтры Скриншот страницы

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

После этого в меню группы начинается тендер – голосование за объекты. Если хост увидит, что на каком-то объекте много дизлайков, то обновит POI, поставив на его место новое. И так пока программа всех не устроит.

Тендер Скриншот страницы

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

После этого вступает предсказательная система. Берется период времени, указанный пользователем, беруться координаты POI, и алгоритм сравнивает в какой час лучше всего посетить объект по этим координатам в течении этого периода времени. Такое происходит сначала с теми объектми, которые больше всего подходят для пользователей, а потом со всеми остальными. Так, чтобы наиболее приоритетные объекты попали в самое оптимальное время.

Трип Скриншот страницы

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

Как это было на самом деле:

В три часа ночи случилась депрессия, ведь прогресс встал. Бекендер лёг спать, я начал думать над тем, как буду смотреть в глаза системному архитектору мейлру, когда он с утра спросит, как дела.

Я перед ноутбуком в 02:59 Скриншот страницы

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

Я презентовал нашу работу проверяющим жюри, фидбек был колоссальный: им очень понравилось. Я выступил отлично, приложение выглядело так же. Первая мысль – это победа. Радостные, готовим презентацию для выступления уже на большой сцене, предвкушаем этот мандраж в голосе, легкую растерянность. Но как только огласили победителя, весь энтузиазм иссяк. Это были не мы.

Постирония Скриншот страницы

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

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

Не вспомнили сделать командный снимок на площадке, поэтому нашли рандомный билборд в москве и сфоткались там Скриншот страницы

А теперь об организации: всё было на высшем уровне. Нам выдали отличный мерч: тапочки, футболки, термокружки, стикеры и много чего ещё. Персонал, окружавший нас во время мероприятия, был технически подкованный и очень вежливый. Еду, которую нам подавали, можно было назвать ресторанной. Только одно её отличало – количество. Еды было много.

Хороший, терпкий кофе, чай, закуски, снеки и прочее – всё было в наличии. Фуршет после финала: закуски из красной рыбы, икры, крутоны и прованские травы, хорошее пиво, вино и живое музыкальное сопровождение.

Тапочки Скриншот страницы

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