オススメゲーム検索をYoutubeDataAPIv3とfastTextで作ったら、それまで知らなかった面白そうなゲームがザクザク見つかった話

Youtube上の実況動画を収集してfastTextで分散表現を作成し、ユーザの好みに沿ったオススメゲーム検索ができるサービスを作った話をします。

[あなたが好きそうなゲームを探せるサービス
『ゲームコンシェル.AI』](https://games.youmight.love/)

## なぜ作ろうと思ったか
普通のネット検索だと、次やりたいゲームを探すのがしんどかったから。

そもそも、ネット検索で能動的に未知のコンテンツを見つけるのは難しい。『スプラトゥーン2』という言葉を知らない人が『スプラトゥーン2』を見つけ出すのはかなり大変。

まぁ、「新作ランキング」とかで検索すれば知らない作品を見つけること自体は可能っちゃ可能です。けどその場合、たくさんの未知の作品の中から自分がやりたいゲームを見つけ出す必要があります。それぞれの作品の概要を調べ、それぞれ比較して一番面白そうなものを選ぶ・・・。考えただけで相当面倒です。※実際やったら面倒すぎて普通に心が折れました。

もっと簡単に、もっと素早く、自分が次にやりたいゲームを探せる方法があったらいいなと思ったので、個人開発で作りました。

## どういう思想で作ったか
まず前提として、次やりたいゲームがすでに決まっている人のことは考えません。
次やりたいゲームが特に決まってないけど、何かゲームがしたい人をメインターゲットとして検討します。

単純な売上ランキングや新作リストではダメです。リストアップされた件数が多かったら、多数のゲームをいちいち調べるのが面倒なのでNG。件数が少なかったら、自分が気に入るゲームがないかもしれないのでやはりダメです。

そこで思いついたのが、「自分が好きなゲームをもとに、芋づる式にオススメゲームを見つけ出す」というアイデアです。

具体的にはこうです。

- 自分が好きなゲームを1つ思い浮かべる
- そのゲームを好きな人を特定する
- その人が好きなゲームを列挙する
- 自分と同じゲームを好きな人が好きなゲームだから、自分も気に入るはず！

要するに、ECサイトでよくある『他の人はこちらの商品も見ています』と似た発想です。
『このゲームが好きな人はこちらのゲームも好きです』ってオススメされたら、やってみたくなりますよね。

## さっそく作ってみた
まず、僕が好きなゲーム『ファイアーエムブレム 風花雪月』でオススメゲーム検索してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241764/d7bee250-d221-d57b-7210-a5d1474ce8e0.png)

『ファイアーエムブレム 風花雪月』がキャラゲー要素、戦略要素、育成要素などに特徴があると考えると、オススメされたゲームはどれもそれなりに納得感があります。と同時に、オススメされたゲーム同士が適度にばらけている感じも良いです。これら6作品は、発売日でみると2017年から2020年まで3年ほど幅があります。パッケージ画像の見た目についても、爽やかなイメージの『テイルズ オブ ヴェスペリア REMASTER』と少しダークな『九龍妖魔學園紀 ORIGIN OF ADVENTURE』が並んでいるのも面白いです。『ファイアーエムブレム 風花雪月』を起点に検索してこんな風な結果が出るサイトって他にないんじゃないでしょうか。

また、検索結果のみならず、検索体験も重要です。

検索結果のゲームの中で僕がもともと知っていたものは1つもなかったのですが、この記事を書くために各ゲームの概要を調べてみたら、どれも面白そうでやってみたくなるものばかりでした。
しかも、この検索結果を得るために僕がしたことは、自分が好きなゲームを思い浮かべることだけです。
たったそれだけで、次やりたいと思えるゲームがいくつも出てきたことにちょっと感動しました。
僕自身が最近のゲーム事情に疎すぎるという指摘はあるかもしれませんが、予備知識なしでも検索が機能するというのはスゴイことだと思います。

さらにもっと面白いのが、「このゲームが好きな人が好きそうなゲームを検索する」機能です。
これは検索結果に出てきたゲームを使って検索し直す機能なんですが、芋づる式にいろんなゲームがザクザク出てくるのが本当に楽しいです。

同じゲームが好き、という共通点に着目した繋がりをどんどんたどっていけるので、次やりたいゲームを見つけ出すのにほとんど時間が掛からないですし、なんなら気になるゲームが見つかりすぎてしまうほどです。

各ゲームにはかならずAmazonとYoutubeへのリンクが付いているので、口コミ評価を確認したりプレイ動画をチェックするのもスムーズに行えます。どのゲームが一番面白そうか判断するのに役立つと思います。

## いったんまとめ
手前味噌ですが、かなりいい感じのWebサービスができたと思っています。
もしデータがあれば、映画や小説などを芋づる式に検索するなど、いろいろと応用も考えられそうです。

いま、コロナ禍の巣ごもり消費でゲーム需要が高まっていると聞きます。
もし、久しぶりに何かゲームしたいのにどのゲームを選べばいいか分からないと思っている方がいれば、試しに使ってみていただけると嬉しいです。

[ゲームコンシェル.AI](https://games.youmight.love/)が、皆さんの「次のゲーム探し」の役に立てれば嬉しいです。何か気になることがあれば感想・批評など何でもコメントいただければと思います。

サービス公開はしましたが、並行してまだまだデータ収集・分析を進めています。
サイト上で取り扱っていないゲームがあればご連絡いただければ優先的に取り上げるようにしますし、サイトの評判が良ければスマホゲームもカバーできるようにアップデートしていけたらなと思っていますので、ぜひ[ゲームコンシェル.AI](https://games.youmight.love/)を使ってみてください。




- - -

最後に少しだけこのサービスを作るうえで考えたことを書きます。
※詳細は後日別記事でまとめますので、ご期待ください。

## 基本的なアルゴリズム
大まかな処理の流れは下記。

- YoutubeDataAPIv3から動画データを収集
- 各動画が何のゲームのプレイ動画か判定する
- チャンネル単位でプレイ履歴をまとめ、fastTextで分散表現を得る

言葉で言うと、「たくさんの人々が実際にプレイしたゲームの履歴情報から分散表現を作成し、あるゲームをプレイした人たちが他にプレイしたゲームをオススメする」という仕組みになっています。

※bokenekoさんの[『fastTextを使って単語じゃないものの分散表現を獲得する』](https://qiita.com/bokeneko/items/2208d2b625d37e0a7820)を参考にさせていただいてます。

このような仕組みにすることで、最近のゲーム界隈の状況に疎い人（僕）でも、過去にやったことがあるお気に入りのゲームから芋づる式に面白そうなゲームを探せるサービスになりました。

さて、分散表現を作成するためには、たくさんの人々が実際にプレイしたゲームの履歴情報を集める必要があります。でも、当然ながら僕自身はそんなデータ持っていません。なので、今回はYoutubeDataAPIv3 を使って大量のプレイ履歴を収集しました。
チャンネル内の動画でプレイされているゲームを日付順に並べてfastTextのインプットデータとし、分散表現を作成しています。

``` sh:参考）データイメージ：1行が1チャンネルに対応
ゲームA ゲームA ゲームB ・・・ ゲームX
ゲームa ゲームb ゲームc ・・・ ゲームy ゲームz
```

なお、YoutubeDataAPIv3を使ったデータ収集をする際、いくつか注意が必要です。
まず、API利用回数のデフォルト上限値は1日あたり100リクエストまでです。1回のリクエストで50件まで動画データを取得することが可能ですが、動画数が50件未満のチャンネルは結構ありますので1日あたり5,000件も集まりません。
また、1つのチャンネルから取得できる動画数は約500件（タイミングにより変動するらしいが詳細は謎）で、それ以上の数の動画を含むチャンネルからはすべての動画を取得できません。
さらにそれとは関係なく、チャンネル内の動画を全部取得できない（動画が10件あるチャンネルなのに、5件しか取得できないなど）というケースもそこそこありました。
僕の場合、今回の用途ではプレイ履歴は厳密でなくても問題ないと判断し、そのまま進めました。

YoutubeDataAPIv3から大量の動画データを収集したら、それぞれの動画が何のゲームのプレイ動画なのかを判定する必要があります。やり方はいろいろあると思いますが、今回は動画のtitleかdescriptionにゲームのタイトルが含まれている場合に、そのゲームのプレイ動画とみなすことにしました。
※厳密にやるには、各動画の内容をAIで処理して分類させるとか人力で1本1本視聴して判定するなどすべきかと思いますが、今回はそこまでの厳密性は不要と判断しました。
しかし、titleやdescriptionの書き方は動画によってかなり異なるうえ、ゲームタイトル自体の表記ゆれ問題（スプラトゥーン２ / Splatoon2 / スプラ2 など）もあり、なかなか苦労しました。
ゲームコンシェル.AIでは、いまのところ表記ゆれ対応は手動で頑張ってやっています。すでに限界を感じているので、今後改善していきたいです。

このような形で、Youtube動画からチャンネルごとのプレイ履歴を作成し、fastTextに食わせて分散表現を作成しました。
ゲームコンシェル.AIの画面から入力されたゲームのタイトルをキーに、分散表現上で距離が近いゲームの上位15件を返すようにしています。

- - -

この記事ではいったんここまでとしたいと思います。
データ取得・データ分析・アプリ構築などの詳細については、後日別記事でまとめようと思います。

特に今回無料Herokuにホスティングしていますが、レスポンス速度には結構こだわっていますので、サイト応答最適化についてもガッツリ深堀りしていく予定です。ご期待ください。