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

Однажды я потратил около часа на myanimelist.net в поисках чего-нибудь посмотреть. Глядя на то, сколько времени это отнимает у меня и, вероятно, у других, я решил создать систему рекомендаций по аниме, которая рекомендовала бы, что смотреть дальше, как можно большему количеству пользователей myanimelist.net.

В то время я также готовился к сертификации Google Cloud Professional Machine Learning Certification, поэтому решил, что имеет смысл использовать как можно больше различных сервисов GCP для учебных целей. (Кстати, я прошел сертификацию, спасибо, что спросили: P).

Полученные результаты

Вы можете попробовать Систему рекомендаций аниме по этой ссылке. Он содержит рекомендации для более чем 900 тысяч пользователей myanimelist.

Когда пользователь входит в веб-приложение, ему будет предложено ввести свой идентификатор myanimelist.

Как только это будет сделано, приложение покажет пользователю 5 случайных аниме из 20 лучших аниме, которые мы рекомендуем этому пользователю.

Просканированный набор данных, используемый для этого проекта, можно найти на Kaggle здесь. Набор данных содержит:

  • информация об аниме для 13 379 аниме
  • пользовательская информация для 1 123 284 пользователей myanimelist
  • 214 271 взаимодействие между парами аниме (рекомендуемые и похожие аниме)
  • 5 048 994 взаимодействия между парами пользователей (дружба)
  • 223 812 614 взаимодействий между пользователями и аниме

Я надеюсь, что Kagglers, специалисты по данным и поклонники аниме найдут набор данных и создадут с его помощью отличную систему рекомендаций.

Полный код этого проекта можно найти в этом репозитории Github.

Обзор системной архитектуры

Проект состоит из 5 основных частей:

  • Планировщик сканирования: задание, которое при вызове получает список URL-адресов аниме/профилей из базы данных и отправляет их в очередь сообщений. Планировщики сканирования развертываются как облачные функции, база данных — как база данных Postgres Cloud SQL, а очередь сообщений — как тема Pub/Sub.
  • Crawler: задания Scrapy, которые извлекают URL-адреса сообщений из очереди сообщений планировщика и сканируют их. Элементы данных для обхода помещаются в очередь сообщений приема данных, а задания обходчика также подключаются к базе данных расписания для ее обновления. Искатель развернут в Google Kubernetes Engine, а очередь приема данных является темой Pub/Sub.
  • Прием данных и ETL. Задание потоковой передачи Apache Beam извлекает элементы данных из очереди приема и отправляет их в BigQuery в целевой области. Конвейер Apache Airflow запускается для объединения, очистки и проверки просканированных данных в хорошо структурированные наборы данных. Новые данные сохраняются в BigQuery и Storage. Задание приемного луча развертывается как задание потока данных, а конвейер ETL Apache Airflow выполняется в среде Cloud Composer.
  • Конвейеры машинного обучения.Каждый конвейер обрабатывает этапы поиска и ранжирования. На этапе извлечения конвейер начинает с создания данных train/val/test для извлечения, затем обучает модель извлечения и, наконец, выполняет пакетный вывод для извлечения и сохраняет результаты. На этапе ранжирования конвейер начинает с создания данных train/val/test для ранжирования, затем обучает модель ранжирования и, наконец, запускает пакетный вывод для ранжирования полученных результатов и сохраняет окончательные результаты. Конвейеры — это конвейеры Kubeflow, работающие на конвейерах Google VertexAI. Данные извлекаются и сохраняются как в BigQuery, так и в хранилище.
  • Веб-приложение. Сгенерированные рекомендации загружаются в базу данных Redis, а небольшое веб-приложение Flask извлекает рекомендации из Redis для каждого запроса рекомендации пользователя.

Пронумерованные шаги на приведенной выше диаграмме:

  • 1: Задание cron Cloud Scheduler запускает планировщик сканирования Cloud Functions.
  • 2: Облачная функция планировщика сканирования извлекает URL-адреса для планирования из базы данных Scheduler Cloud SQL.
  • 3: Облачная функция планировщика сканирования отправляет URL-адреса для сканирования в очередь расписания PubSub.
  • 4: Работники сканирования, работающие в Google Kubernetes Engine, извлекают URL-адреса из очереди расписания PubSub.
  • 5: Работники сканирования сканируют URL-адреса, обновляют базу данных планировщика и помещают просканированные данные в очередь приема данных PubSub.
  • 6: Задание приема потока данных извлекает данные из очереди приема данных.
  • 7. Задание приема потока данных отправляет данные в целевую область BigQuery.
  • 8: Конвейер Cloud Composer ETL агрегирует, объединяет, очищает и проверяет данные из целевой области.
  • 9: Конвейер Cloud Composer ETL сохраняет очищенные наборы данных в обрабатываемой области BigQuery.
  • 10. Конвейеры Vertex AI ML используют данные в обрабатываемой области BigQuery для обучения моделей машинного обучения и создания пакетных рекомендаций.
  • 11: Пакетные рекомендации реплицируются в экземпляре Cloud Memorystore Redis для доступа с низкой задержкой.
  • 12: веб-приложение обращается к экземпляру Redis Cloud Memorystore, чтобы получить рекомендации для каждого пользователя.
  • 13: Пользователь отправляет запрос в веб-приложение и знает, какое аниме смотреть.

Благодарности

Я хотел бы поблагодарить MyAnimeList.net за отличную платформу и JikanAPI за отличный аниме-API, который они предоставляют.

Спасибо за чтение. В следующих статьях я планирую подробно описать процесс сканирования, используемые конвейеры ETL и ML.

Вклады в репо более чем приветствуются.