Djangoでアニメ推薦のWebアプリを作ってみた話
お久しぶりです。
前回の投稿から1年以上経ってしまいました。
修士1年もほぼ終わり、今まさに就活が始まってしまいました。
思ったよりも景気が悪いんでオロオロ泣いております。コロナもあるし先行き不安定ってやつ。
そんなことで今回は、Djangoを利用してWebアプリを作ってみたので、それについて記述したいと思います。
👇Githubに公開しています
Djangoとは
wikipediaによると、"DjangoとはPythonで実装されたWebアプリケーションフレームワーク。model-view-controller デザインパターンに緩やかに従う"とあります。DBを利用した動的なWebサイトがPythonを使って簡単に構築できる、ということなんですかね(多分)。ちなみにDjangoという名前は、ジャンゴ・ラインハルトに由来しているらしい。
今回作ったものの概要
今回は、ユーザの嗜好に合わせた、2020年冬アニメの推薦アプリケーションというものを作ってみました。推薦手法はコンテンツベースフィルタリングです。これについては後々詳しく述べます。
これはもともと、学校のグループワーク課題として、Google Colaboratoryで構築したものです。今回せっかくなので、Webアプリとして実装したら面白いかなと思い、やってみた次第です。
なぜこのアニメ推薦を行うアプリケーションを構築したかというと、現在同じクールにかなり大量のアニメが放送されており、配信サービスなどの普及に伴い、視聴するアニメの選択肢が増えている中で、効率的に見るべきアニメを教えてくれたら嬉しいよな、的なマインドがあったので、です。実際はアニメ推薦の他にも、アニメの立ち位置(?)的なものを示すために、2次元空間にアニメ作品をマッピングしてみたり、出演作品から声優の特徴量をはかり、それもマッピングしてみたりと、色々やりましたが、今回はユーザに対するアニメ推薦に絞ってアプリを作ってみました。
今回作ったものの動かし方
今回のアプリケーションは、Dockerに Dockerfileを利用してイメージ(Ubuntu)を構築し、その上でアプリケーションを動かしています。ので、あらかじめDocker環境を用意し、GithubのREADME.mdに従い、Dockerイメージの構築をし、Djangoモデルの準備、createsuperuser等のコマンドを実行する必要があります。
また、アニメのデータの準備として、事前に準備されたアニメのリストをDBに挿入するコマンドを叩く必要があります。これもGithubのREADME.mdに書かれています。
今回はアニメのデータとして、あにこれさんからアニメのリストを収集させていただきました。さらに、各アニメの特徴ベクトルを作る際、あにこれさんに寄せられた各アニメのレビュー文を利用させていただきました。ありがとうございます。
各アニメの情報は[src]というディレクトリの[anime_list.csv]というファイルに入っています。2001年からのアニメが3055件収録されています。
実際のウェブアプリの使いかた
アニメのデータをDBに挿入するコマンドを叩いたら、実際にWebアプリを起動し、使ってみてください。Webアプリの起動は、
$ docker-compose up
です。
アプリを起動したら、Google Chromeか何かで http://127.0.0.1:8000/app/home/ にアクセスしてみてください。(Google Chrome以外の挙動は確認できていません)
このような画面が出てくるかと思います。(サインインしていた場合には別の画面が出ます。)
まずはアカウントでサインインしましょう。(superuserでも入れます)
アカウントがない場合 、 [Sign up] をクリックします。
希望するユーザ名、パスワード、パスワードの確認を入力し、 [Create an account] をクリックすると、ユーザを作成し、ログインすることができます。
アカウントがある場合、Home画面の[Sign in] をクリックします。
ユーザ名とパスワードを入力し、 [Sign in] をクリックします。
サインインが完了すると、Home画面が次のようになります。
このように表示されたらサインインが完了です。
サインインが完了したら、早速あなたにオススメのアニメが何か、教えてもらいたいものなんですが、このアプリではユーザの嗜好を元にユーザが好きなアニメを推薦するため、あなたがみたアニメが何か、登録しておく必要があります。Amazon Prime VideoやNETFLIXなんかでは、ユーザの視聴履歴を収集していますが、今回のアプリではそのような機能はない為、手動で好きなアニメを登録していきます。
Home画面の [好きなアニメを登録する] をクリックしてください。
テキストボックスにアニメタイトル(一部で大丈夫です)を入力し、[入力]を押すと、上の図のようにそのキーワードが含まれるアニメタイトルの一覧が表示されます。ポケットモンスターアドバンスジェネレーションを途中までみていた場合、[途中までみた]、にチェックを入れ、[このアニメを登録する] を押すと、
このような画面が表示され、登録が完了します。アニメの登録は一個ずつしかできない為、他のポケモン系のアニメも登録するには、[検索結果に戻る]を押してください。
登録が完了したら、実際にアニメ推薦を行います。Home画面に戻り、[2020冬アニメのオススメ]を押してください。
このようなページが表示されると思います。アニメ推薦を開始するためには、[判定を開始する]をクリックしてください。
すると、ユーザの視聴履歴を元に、アニメ推薦を行います。表示されたタイトルをクリックすると、あにこれさんのそのアニメのページにジャンプします。
以上が実際のWebアプリの使い方になります。
推薦アルゴリズムについて
先ほども言いましたが、今回はアニメ推薦手法としてコンテンツベースフィルタリングを用いています。詳しい手法について、ここから説明します。
コンテンツベースフィルタリングということで、コンテンツ、ユーザを数値化して表現する必要があります。今回は、アニメレビューを元に、アニメとユーザを特徴ベクトル化しています。これらは事前に定義されたものを利用しています。
まず各アニメをベクトル化します。各アニメのレビュー文をMeCabを利用して、形態素解析し、それらをWord2Vecを利用して単語ベクトルとします。また、単語ごとのIDF値(TF-IDFのIDFです)をあらかじめ求めておき、各アニメについて、そのレビューに含まれる単語(名詞、動詞、形容詞、形容動詞)の単語ベクトルの重みをIDFとした重み付き平均を各アニメの特徴ベクトルとします。この特徴ベクトルは300次元です。
次にユーザの特徴ベクトルについてですが、これはユーザの視聴済みアニメの特徴ベクトルの重み付き平均として求めます。今回の重みはユーザの各アニメに対する視聴度合いとします。こちらのベクトルも300次元です。
今回使用したWord2Vecモデルについてですが、学習コーパスは今回収集したレビュー文の単語(名詞、動詞、形容詞、形容動詞)とし、vector_sizeは300,window_sizeは10,min_countは1,iterationは5回としています。
次に、ユーザにアニメを推薦する方法について説明します。ここではまず、2020年冬に放送するあるアニメ「アニメi」について考えます。
ユーザの特徴ベクトルと、「アニメi」の特徴ベクトルを用意し、それらのコサイン類似度を求めます。ユーザの特徴ベクトルはアニメの特徴ベクトルを元に作られているので、ユーザの特徴ベクトルとアニメの特徴ベクトルの類似度を求めることで、ユーザの嗜好にどの程度マッチしたアニメなのかわかる、ということです。このコサイン類似度をユーザに対する「アニメi」のオススメ度とします。
これらのオススメ度を2020年冬アニメ全てについて求めたのち、このオススメ度が高いアニメ5件をユーザに推薦しています。
今後の課題
今回は2020年冬アニメの推薦しか行えません。ですので、今後は適宜情報を収集し、その時その時に放送されているアニメを推薦するシステムを構築していきたいと考えています。
また、今回のWebアプリでは、CSSまで手が回らなかったので、なんとも殺風景なページになっています。ここら辺も改良していきたいです。
参考文献
Docker
- プログラマのためのDocker教科書 第2版 - 著:阿佐志保 監修:山田祥寛 - 翔泳社
-
DockerでDjangoを動かしてみる - Djangoの学習ができるチュートリアルサイトDjangoBrothers
-
はじめに · Django Girls Tutorial - Django Girls Tutorial
情報推薦あたりの元のアイデア