DSE Fest — технично и понятно про data science для разработчиков. Первые доклады уже на сайте >>
×Закрыть

DOU Проектор: Movie Expert — рекомендації фільмів за вашими інтересами

У рубриці DOU Проектор всі охочі можуть презентувати свій продукт (як стартап, так і ламповий pet-проект). Якщо вам є про що розповісти — запрошуємо взяти участь. Якщо ні — можливо, серія надихне на створення власного made in Ukraine продукту. Питання і заявки на участь надсилайте на editors@dou.ua.

Мене звуть Володимир Бондаренко, я співвласник компанії Mauris та один з творців мобільного сервісу Movie Expert. Наш додаток допомагає за 15 хвилин створити список фільмів та серіалів для перегляду на півроку вперед.

Ідея

Напевно, кожному відоме почуття «хочу подивитися щось, не знаю що, і ніхто мені не допоможе». Думка про створення кіносервісу приходила до нас неодноразово, але сформувался остаточно в 2013 році. Трудові будні хотілося скрасити хорошою підбіркою фільмів на вечір, в черговий раз стало зрозуміло: не все те подобається, чому ставлять високі оцінки. Ні рейтинг «Імхонет», ні «КиноПоиск» та IMDb не змогли допомогти в пошуку відповідних фільмів. Кінострічки з високим рейтингом були або переглянуті раніше, або не цікаві, що, власне, ставило в ступор. А фільми із середнім рейтингом було важко оцінити і відібрати. По-перше, коментарі і рецензії ділилися на два повноцінних табори: за і проти. По-друге, сам процес підбору фільмів займав досить багато часу (адже щороку тільки в Голлівуді випускають більше 800 фільмів і серіалів), і в більшості випадків часу на перегляд кінострічки просто не залишалося.

Так і прийшла думка створити сайт зі спеціальним алгоритмом, метою якого є:

  • відображення ТОПу класних фільмів згідно з інтересами конкретного користувача, базуючись на оцінках раніше вподобаних фільмів;
  • надати можливість ранжування рекомендацій фільмів з огляду на додаткові параметри.

Однак, приступивши до роботи, ми відразу ж зіткнулися з низкою проблем. Те, що зручно розробнику, не завжди комфортно для користувача: програмування зайняло всього 2 дні, а перетворення в зрозумілий для користувача сервіс — більше року.

Спочатку користувачеві необхідно було авторизуватися на сайті за допомогою ВК або ФБ. Далі він бачив сторінку з 9 фільмами, з яких потрібно було обрати ті, які він вже бачив, та оцінити. Якщо користувач відмічав більше 2 фільмів на сторінці, список фільмів для оцінки оновлювався. Із запропонованих фільмів можна було обирати ті, які хочеш подивитися, а також побачити список вже оцінених. На сайті також була доступна функція «подивитися фільм з другом», яка дозволяла визначити фільм, який не дивився ні користувач, ні його друг.

Проблема 1. Розробка зручного і зрозумілого інтерфейсу для користувача.

Спочатку потрібно було відтворити в пам’яті переглянуті фільми. Коли ресурс вимагав ввести в пошуковий рядок 10 улюблених фільмів, половина користувачів впадала в ступор: вони просто не могли їх пригадати.

Рішення. Швидкий хотфікс з постійно оновлюваною підбіркою фільмів з найкращим рейтингом — хороша підказка для забудькуватих.

Проблема 2. Функція «перегляд фільму з другом» не спрацювала: на FB або ВК обиралася сторінка користувача, по ній робився перехресний аналіз — які фільми не дивилися ні ви, ні друг. Сервіс добре підбирав фільми в одиночному режимі, але при перехресному аналізі виникала проблема: система видавала фільми, які в більшості випадків були нецікаві обом користувачам. В результаті комбінацією з двох списків не користувався практично ніхто.

Рішення. Відключили функцію, вирішивши залишити її доопрацювання до кращих часів, коли сервіс матиме постійну аудиторію.

Злет і падіння

Після анонсу про вихід сервісу в закритому співтоваристві результати перевершили всі очікування. За перший тиждень було зібрано більше мільйона оцінок фільмів. Але була й зворотна сторона медалі: наші сервери впали. На той момент у нас не було достатнього досвіду роботи з великою аудиторією: при одночасному заході на сайт більше 500 користувачів скрипт не витримав і впав.

Весь back-end був написаний на PHP, а в якості БД використовували MySQL. Для виправлення ситуації потрібно було максимально прискорити ресурс, тобто:

  • оптимізувати запити в БД;
  • змінити алгоритм;
  • змінити конфігурацію сервера;
  • дати можливість використовувати частково попередньо згенеровані дані (batch process) і кеші даних.

... до чого ми і приступили.

Виконану роботу можна розділити на кілька етапів:

1 етап. Сайт був багатомовним: мав російську і англійську локалізації. Нам довелося впровадити Memcached — систему кешування, в якій було закладено переклад контенту, а також інтерфейсу. У підсумку, всі сторінки почали відображатися вдвічі швидше — за рахунок вивантаження з оперативної пам’яті і усунення запитів в БД на переклад інтерфейсу.

2 етап. Об’єднав декілька операцій:

  • Зміна алгоритму отримання даних.
  • Розбивка складних запитів на підзапити.
  • Застосування табличних індексів.
  • Оптимізація обробки рядків (якщо просто з’єднати таблиці між собою через JOIN, не факт, що БД обере оптимальний варіант роботи сама).
  • Використання memory-таблиць. Щоб з автоматичного JOIN-a таблиць використовувати ручне з’єднання, ми зробили ряд простих запитів — вони отримували ті ж дані, але в певному порядку. Це зменшило кількість оброблюваних даних.

Після цього ми зайнялися перекладом індивідуального рейтингу фільмів зі звичайної таблиці в memory (розташованої в оперативній пам’яті) — в результаті отримали хороший приріст швидкості, з якою працював алгоритм перерахунку рейтингу. Вона збільшилась у 10 разів.

Схема оптимізації була такою: після кожних трьох оцінених фільмів відбувається перерахунок — дані генеруються дуже часто, і в нас немає необхідності їх зберігати. Навіть якщо база обнулиться або щось трапиться з сервером, ми просто заново згенеруємо для користувача ці дані (здебільшого вони є службовими).

Також ми застосували ручне партиціювання БД: зробили розбиття — оцінки фільмів певних груп відвідувачів зберігалися в різних таблицях. Тобто ми горизонтально розбивали оцінки по n-ій кількості таблиць в залежності від зростаючої бази користувачів. Розмір кожної таблиці був обмежений 1 мільйоном записів: це дозволяло виконувати SQL-запити з необхідною нам швидкістю.

3 етап. Оптимізація сервера. На той момент ми використовували VPS, ресурси якого були обмежені, але після конфігурації результат не змусив себе чекати. Ми збільшили кількість одночасних підключень до БД і запитів на сервер.

4 етап. Ми запустили перерахунок оцінок. Після перших днів роботи сервісу стало зрозуміло, що динамічний підрахунок рейтингу фільму уповільнює час завантаження сторінки: моніторились сотні записів і по ним виводилися середні оцінки. Написаний нами новий скрипт щодоби о 2 годині ночі запускав оновлення даних по рейтингах, за рахунок чого час завантаження сторінки скоротився.

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

Зміна концепції

Веб-сервіс — це не тільки питання розробки та технічної підтримки. З’явилася проблема різкого падіння кількості користувачів. Усе відбувалося так: користувач заходив на сайт, проводив 2-3 години за оцінкою фільмів та зникав. У кращому випадку повертався ще кілька разів. Це дало нам привід замислитися над тим, що в такому форматі сервіс себе вичерпав.

Сервіс повинен був стати більш зрозумілим за форматом і мотивувати користувача до наступних відвідувань. Для цього було потрібно:

  • оптимізувати шлях користувача при роботі з сервісом (ввести навчання);
  • розробити алгоритм по «утриманню» і залученню користувача.

Ми почали роботу, паралельно виконуючи аутсорс-замовлення в інших галузях — а їх було дуже багато. Минуло кілька місяців, потім ще і ще, і через 2 роки ми усвідомили: замовлень стає тільки більше, ми працюємо на піку. Якщо не реалізувати наш власний проект зараз, цього не станеться ніколи.

Отож, у грудні 2016 року ми знову провели перезапуск сервісу, змінивши його формат. Вирішили замість сайту створити додаток під дві платформи — iOS і Android.

Ми бачили, що перспектива розвитку проекту на мобільному пристрої значно вища:

  • є можливість нагадати про себе за допомогою push-повідомлень;
  • список фільмів завжди в кишені користувача;
  • мобільний продукт цілком успішно здатний відучити користувача напружувати пам’ять (за аналогією з Tinder) і спокійно «вести» його.

Принцип роботи програми такий: користувачеві динамічно подаються 10 карток фільмів для оцінки. Після 5 відмічених фільмів йде перерахунок рейтингу і завантажуються наступні 10 карток з урахуванням нових оцінок. Якщо користувач відмічає фільм як «не визначився», кінострічка може бути запропонована повторно для оцінки через кілька тижнів.

Щоб спростити інтерфейс програми, за основу взяли принцип Tinder. На головному екрані користувач повинен оцінювати фільми за допомогою свайпів вправо та вліво. У додатку доступні такі розділи: «Хочу подивитися», у якому зібрані фільми, які планує переглянути користувач; «Ми рекомендуємо» — рекомендації додатка; «Пошук фільмів» — де можна знайти фільми та серіали.

На початковому етапі втіленням в життя своєї ідеї я займався самостійно. Пізніше підключився друг, який налаштовував сервери. Потім у зв’язку з переробкою концепції, переходом від веб-сайту до мобільного додатку і розширенням функціоналу до розробки долучили серверного та мобільних розробників.

Складнощі

Крос-платформа. Одна з проблем полягала в тому, що ми хотіли випустити мінімально життєздатний продукт (MVP) на крос-платформі, щоб протестувати актуальність проекту і перенести його на Native. Тоді, коли почали розробку програми, з’явився React Native. З огляду на те, що хотіли запустити проект в найкоротші терміни, вирішили використовувати Cordova. Після реалізації низки проектів на React, побачили, що ця технологія більш продуктивна.

Зараз ми хочемо домогтися гарної статистики, щоб упевнитися в раціональності перенесення програми на іншу платформу, адже цей процес займе близько 4 місяців. Потрібно буде або заморозити проект, або паралельно розробляти проект на Native.

Інтерфейс. Як поєднати свайпи вліво і вправо з великою кількістю функцій програми (дивився, не дивився, хочу подивитися і т. д.)? Варіант «хочу подивитися — свайп вправо, не хочу — вліво», а внизу «оцінка» не виправдав надій: плей-тест показував, що люди не розуміють, чого від них хочуть. Від бездумних свайпів та оцінок навмання алгоритм починав працювати гірше.

Рішення прийшло тоді, коли ми цього зовсім не очікували. Влаштувавши виїзні корпоративні канікули з катанням на лижах в австрійських Альпах, ми, 3 кіномани, підключивши дизайнера і пляшку віскі, знайшли рішення.

Концепт став трохи складнішим, але можливість зробити помилку була зведена до мінімуму. Свайп вправо — користувач позначає, що фільм вже дивився, і йому пропонують поставити оцінку за десятибальною шкалою. Свайп вліво — фільм не був переглянутий раніше, тому потрібно вибрати один з 3 пунктів («не хочу дивитися», «хочу подивитися», «не визначився»). Ми пожертвували зручністю інтерфейсу заради того, щоб відсоток нерозуміння механіки звівся до нуля. У підсумку, користувач став розуміти, що і навіщо він робить, більш усвідомлено приймати рішення, після чого алгоритм видавав йому відповідні фільми.

Розчарування у фільмах. Перша підбірка для оцінки складалася з фільмів з високими балами топових рейтингів — і при цьому більшість з них люди просто не дивилися. Після 3 свайпів «не дивився» вони розчаровувалися і закривали додаток. Спочатку для вирішення проблеми просто поставили фільтри (стали показувати фільми останніх 10 років), але це не допомогло.

Проблему довелося вирішувати вручну: зібралися командою розробників і за один вечір сформували перелік з 52 фільмів, які бачила більшість. Саме їх користувачі оцінюють в першій видачі.

Підбірка була складена з фільмів різних жанрів, щоб по їх закінченні в людини сформувалася різнорідна картина, і додаток міг направити її в будь-яке русло, в залежності від уподобань. Після цього кількість користувачів, які «пройшли» перші 5 фільмів, склала 95%.

Зі специфічних проблем:

  • У додатку ми використовуємо трейлери фільмів з YouTube. Щомісяця 10% YouTube-роликів стають недоступні, тому довелося розробити алгоритм аналізу і швидкої заміни недоступних відеороликів.
  • Однойменні фільми. Як виявилося, їх існує досить багато. Доводиться ретельно аналізувати контент.
  • Існує низка трейлерів, які захищені авторськими правами. Вирішуємо проблему автоматичним відсіюванням таких трейлерів.
  • Основна частина проблем була юридичного характеру, а саме пов’язана з авторським правом на постери, які використовуються в додатку. Нам довелося витратити багато часу на складання звернення до правовласників, підбір постерів з певним типом ліцензії, а також розробку механізму, який допомагає швидко виключити фільм в разі запиту від правовласника.

Після випуску першого масштабного оновлення аудиторія Movie Expert почала активно зростати (наразі є близько 18 тис. користувачів). Ми ретельно аналізували всі коментарі, а також побажання людей. І тоді побачили, що у деяких користувачів iOS-пристроїв (з Android проблем немає) відбувається автоматичний вихід з облікового запису. Почалася активна робота над пошуком і відтворенням цього бага.

Нам вдалося з’ясувати, що коли пам’ять iPhone переповнена, вночі відбувається очищення всіх локальних даних нашого сервісу. І зайшовши наступного разу, людина бачить порожній додаток. До речі, відтворити таку ситуацію вийшло досить випадково: один з наших співробітників завантажив велику кількість музики, чим заповнив всю пам’ять свого iPhone. А на наступний ранок відкрив Movie Expert і побачив, що не авторизований у додатку. Щоб вирішити цю проблему, ми впровадили перевірку користувача за ідентифікатором пристрою і не показуємо інтро та першу вступну підбірку.

Як виявилося, ця проблема вирішується на старих айфонах, але в останніх версіях операційних систем iOS ввели налаштування відображення рекламного ідентифікатора для додатків (за замовчуванням він прихований). За рахунок цього ми не можемо отримати ідентифікатор пристрою, тому нам доводиться генерувати йому свій ідентифікатор, який зберігається локально. А в разі, якщо iPhone очищає дані, ідентифікатор теж зникає, і для пристрою створюється новий ідентифікатор. Над вирішенням цієї проблеми ми все ще працюємо. В цілому, розробники прагнуть збільшувати пам’ять на нових смартфонах, тому проблеми з авторизацією у користувачів зустрічаються все рідше.

Що в результаті

Перша версія додатку була доступна у липні 2017 року. Ми провели бета-тестування, зібрали фідбек, впровадили ряд доробок і в кінці січня 2018 року випустили оновлену версію, яка вже доступна в Google Play та AppStore. З iOS-версією все виявилося складніше — нам довелося пережити 5 перевірок від прискіпливих модераторів: співробітники компанії Apple ретельно тестують кожен додаток на всіх iOS-гаджетах. Вони змогли відловити баг при запуску iPhone додатку на iPad, який полягав у тому, що при свайпі картка не зникала, її потрібно було вести пальцем до кінця екрану.

Додаток безкоштовний. Можна придбати одну з підписок на 3, 6 або 12 місяців. Вона дає доступ до всіх фільмів без перегляду реклами.

В оновленій версії користувачів очікують такі фічі:

  1. Щоденні підбірки фільмів на різноманітні тематики — відмінна альтернатива свайпам і рекомендаціям. Ми очікуємо, що це вмотивує людей частіше користуватися додатком.
  2. Розширений профіль зі статистикою за своїми оцінками і визначенням улюблених жанрів, а також система досягнень користувача з бонусами (критик, кіноман, сценарист, експерт).
  3. Тепер у видачу можна додати серіали.
  4. Пошук фільму: можна відразу знайти кіно і додати його в список «хочу подивитися» або оцінити переглянуті раніше фільми. Додана функція «поділитися фільмом з другом» (посилання, при переході на яке відкривається сторінка фільму).
  5. PRO-режим — можливість отримати повний доступ до фільмів зі списку «Рекомендації», які обирає для користувача система на основі його оцінок. Деякі картки фільмів у цьому списку знаходяться під знаком питання. Якщо хочеш дізнатися, який це фільм, можна або подивитися рекламу, або купити один з PRO-режимів, і всі фільми будуть відкриті. Також можна побачити розширену статистику за своїми оцінками.

У найближчих планах:

  • випустити оновлення з фільтрацією фільмів по акторах;
  • додати можливість коментувати фільми і серіали;
  • створити стрічку, в якій можна буде стежити за оновленнями і оцінками друзів.


Завантажуйте додатки в AppStore і Google Play, оцінюйте, залишайте відгуки. Будемо вдячні за будь-який зворотній зв’язок про виконану нами роботу!

LinkedIn

33 комментария

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

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

aidecider.com/tree/movie

Пример
aidecider.com/...​9f-11e8-b3e9-ad0ce272f459

можно парсить tvtropes.org — это даст относительно объективные данные о том, что и как происходит в данном фильме
пример tvtropes.org/...​18?from=Film.Annihilation

Это слишком трудоемкий способ, особенно если потом персонализированные рекомендации добавлять

Хорошо — дизайн приложения понравился, фильмы подобрались по моему вкусу
Плохо — на андроид 4 не запустилось

Вдохновения вам и предлагаю расширять идею на книги.

Интересная идея и крутая реализация!
Вот только если планируете развивать многоязычность, то я бы дал возможность выбора языка изначально, а то мне лично с английской локалью пришлось гуглить половину фильмов, чтобы узнать их русские названия, пока 5 лайков набрал)

Спасибо за совет. Сейчас включается английская локаль, если такая используется на мобильно устройстве.

Готовим выход обновленной версии.

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

Более детальный фидбек дам только когда стану вашим активным пользователем хД)

Спасибо за фидбек. Какая модель телефона и какая версия андроида?

спасибо за информацию! изучим и постараемся устранить

Статья реально ценная и полезная сама по себе. Однозначно зачет. Ребята прошли трудный путь. Это очень знакомо. Описанные проблемы, поиск путей решения, неожиданные повороты. Все как положено при запуске своего продукта. Очень желаю успеха и прибыльности продукта. Благодаря одной только статье, установил себе приложение и буду пробовать. Тем более проблема насущная. Удачи.

Успехов!

В статье немало моментов про «пользователем было неудобно» и пр. Интересно узнать подробнее, как вы проводили тестирование интерфейса (как долго, с какой аудиторией и т.д.)?

Давали друзьям и коллегами телефон в руки и молча следили за их действиями с приложении.

Не думали о том, что выборка может быть нерелевантной?

Давно использую, отличное приложение.

Звучит интересно. Установил. Выглядит неплохо. Хотя к направлениям свайпа нужно привыкнуть (благо есть кнопка Назад). Как будут определяться рекомендации, посмотрим.
Есть вопрос. А для чего Вам информация о геолокации устройства?

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

Які методи машинного навчання ви використовуєте для рекомендації фільмів?

Алгоритм подбора фильмов мы не разглашаем:)

Основною мовою додатку є англійська. Російська додана як мова регіону СНД для проведення пілотного запуску.

А мене обурила назва пакету в кемел кейсі.

Встановив. Виглядає цікаво

Здравствуйте. Интересный сервис.
Пара вопросиков:
1. Данные хранятся у вас на серверах? То есть я смогу видеть свои оценки с разных устройств?
2. Есть ли импорт оценок, например с Kinopoisk?

Добрый день, Александр.
1. Оценки пользователей хранятся на сервере. Если Вы авторизируетесь через фб, оценки привязываются к профилю фб и будут восстановлены при повторном заходе.
2. Импорт оценок пока не делали.

Здравствуйте, спасибо за ответ.
Импорт с Кинопоиск был бы крайне желателен. Например, у меня там порядка пятисот оценок. Как Вы понимаете, повторять эту работу с нуля и на память будет лень :)

Это займет час времени в Муви Эксперте и за это время Вы найдете десяток новым фильмов для просмотра)

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

Молодцы, удачного развития!
Такие вопросы
— оправдала ли монетизации ваши ожидания/планы?
— как обновляете базу фильмов? Самому надо решить эту проблему, дампы имдб вроде есть но нужен апи для поддержания актуальности данных.
— Не находили ли дампы нетфликс? У них своя таксономия жанров, около 30к, очень удобно использовать для подбора аналогичных рекомендаций...

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

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