筆者「はっしー」へのお問い合わせはこちら
IT

【難しくない】誰でもできる!映画レコメンドエンジンの作り方【サンプルコードつき】

こんにちは、はっしー(@hassy_nz)です。

僕はWeb系のプログラマとして働いていますが、最近はデータサイエンスや機械学習に興味を持ってコツコツ勉強を進めています。

その一環として、好きな映画のタイトルを入力すると似た内容の映画をオススメしてくれる人工知能(映画レコメンドエンジン)を作ってみました。

↓どんな感じかは動画をご覧ください↓

この記事では、

  • レコメンドエンジンの内部の仕組み
  • プログラムの具体的な作り方
  • 人工知能アプリを作るオススメ学習方法

についてお伝えしていきます!

ざっくりとした仕組みの紹介

まずはレコメンドエンジンが一体何をやっているのか、全体像を説明しますね。

映画レコメンドエンジンの仕組み
  1. 映画のタイトルとあらすじのデータをたくさん用意する
  2. 任意の映画のあらすじを人工知能に与える
  3. データにある映画のあらすじとの類似度を比較する
  4. もっとも類似度の高い映画をオススメとして返す

一言でいえば与えられた映画とあらすじの似た映画を返すってことになります。

たとえば「ゴジラ」が与えられた場合は、「でかい怪獣が大暴れする映画」がオススメされるといい感じですし、「フォレスト・ガンプ」の場合は「男が主人公のなんか泣ける話」がオススメされればいい感じですよね。

しかし、機械的な処理しかできないコンピュータに「あらすじが似た映画を探してもらう」には、ちょっぴり工夫が必要になってきます。

詳しい作り方について、順番に見ていきましょう。

ステップ1: 映画のタイトルとあらすじのデータを用意する

まずは、オススメするための映画データを準備しなくてはいけません。
例えるなら、TSUTAYAに置いてある大量のDVDです。
あれをコンピュータの中に用意してやるイメージですね。

ところが、映画のあらすじをデータとして用意するのはなかなか難しいんです。
Amazonの商品情報とかから取ってこれないのかな〜とも思ったんですが、いろいろ障害があってうまくいきません。

今回はとりあえず作ってみることが目標なので、探してみた中ではもっとも簡単に使えそうだった「OMDb API」を採用しました。

参考▶OMDb API

HTTPリクエストを送るだけで、映画のタイトルやあらすじ、メインキャストなどの情報を引っ張ってこれる便利なAPIです。
無料枠なら1日1000件、月1ドル払えば1日10万件までリクエストの送信が可能になります。

また、取得する映画のリストはこちらのリンクにあった全世界興行収入ランキングの上位約770作品としました。

参考▶All Time Box Office

では、この映画リストとOMDb APIを利用して、タイトルとあらすじを取得していきましょう。

ステップ1-1: あらすじを取得する映画のタイトル一覧を作る

最初に、先ほど紹介した映画の興行収入ランキングのページからタイトルをごっそりと取得し、テキストファイルに吐き出します。

言語はPythonを利用すると、スクレイピング処理をきれいに書けて便利です。
↓コードはこんな感じになります↓

ステップ1-2: 映画のタイトルとあらすじを格納するテーブルを作る

あらすじを取得する前に、データを格納するためのテーブルを作りましょう。

テーブル名は「movies」、カラムは「title」「plot」の2つのみとしておきます。
データベースに接続してテーブルを作るだけなので、簡単ですね。
以下のコードを実行すると、空のテーブルを作成してくれます。

ステップ1-3: OMDb APIを使ってあらすじを取得する

ステップ1-1で作成した「titles.txt」と、OMDb APIを組み合わせてあらすじを取得します。

OMDb APIのリクエスト方法は簡単で、

http://www.omdbapi.com/?apikey=xxxxxx&t=movie_title

のように、パラメータ「t」に映画のタイトルを渡せばあらすじを含むデータをJSON形式で取得できます。

ただし、titles.txtにあるタイトルそのままではデータが取れない場合があるので、手作業による修正が必要です。
たとえばタイトルに「&」が含まれている場合は「%26」に変換して、URLとして有効な書式に直さなければいけません。
そのほかにも考慮すべき点がいくつかあるんですが、詳細は割愛します。

以下のコードを実行すると、moviesテーブルに映画のタイトルとあらすじの情報が格納されます。

ステップ2: あらすじの類似度を比較する

ところで、「映画のあらすじが似ている」ことをどのように表現すればよいのでしょうか?

コンピュータは、映画のあらすじのような人間の話す言葉で書かれた文章をそのまま理解することはできません。
また「どの程度似ているか」についても、コンピュータが計算できる何らかの方法を定義する必要があります。

「あらすじが似ている」ことを計算するために必要なもの
  1. あらすじの特徴を計算できる形式に置き換える
  2. 「どれくらい似ているか」を計算する方法を決める

では、それぞれのステップを詳しく見ていきましょう。

ステップ2-1: あらすじの特徴をtf-idfで表す

今回は一般に広く使われている「tf-idf」という指標を用います。

これは簡単に説明すると「文章中に特徴的な単語がどれくらい使われているか」を示す指標です。

たとえば次のようなあらすじがあったとします。

高校生の男の子と女の子がいる。
ふたりは夢の中で人格が入れ替わっていることに気づく。
しかし、その入れ替わりは突然途絶えてしまう。

大ヒットしたアニメ映画「君の名は。」のあらすじです。

この中で特徴的な単語はどれでしょうか?
「高校生」「男の子」「女の子」などではなさそうですね。
なぜなら、高校生や男の子、女の子が出てくる映画はほかにもたくさんあるからです。

一方で「入れ替わり」という言葉が2回も登場しています。
あらすじに「入れ替わり」が出てくる映画はあまりないので、これは特徴的な単語と言えそうですね。

このように、「ほかの文章中にあまり出てこない単語が、どのくらいたくさん登場しているか」を調べることによって、文章の特徴を数値化できるんです。

tf-idfは、Pythonのライブラリ「scikit-learn」の中に用意されている「TfidfVectorizer」というモジュールを使うと、簡単に計算できます。

ステップ2-2: あらすじの類似度をコサイン類似度で表す

2つの映画のあらすじがどの程度似ているかは、三角関数の「コサイン」を用いて表せます。

実は先ほど登場した「tf-idf」は、文章をベクトルに変換する手法なのです。

そしてベクトルとは、ざっくり言うと矢印のこと。
(高校の数学で習いましたよね)

ふたつの矢印のコサインを取ると、矢印どうしの角度がわかります。
コサインは角度が0°のとき最大(1)になり、角度が180°のとき最小(-1)になります。

つまり、文章の特徴がまったく同じ場合にコサインが最大となり、まったく正反対の場合に最小になると解釈できるわけです。
このように、ふたつの文章がどれくらい似ているかをコサインで表す指標のことを、コサイン類似度と呼びます。

ふたつのベクトルのコサイン類似度は、やはりscikit-learnで提供されている「cosine_similarity」関数で簡単に計算できます。

映画レコメンドエンジンを動かしてみよう!

さてできあがったプログラムがこちらです。

「映画をおすすめする」という複雑な処理を行う人工知能が、たった100行程度で表現できちゃうのはなかなかすごいですね。
(僕がすごいんじゃなくてPythonがすごい)

ではさっそく、人工知能にオススメの映画を教えてもらいましょう。

まずは僕が大好きな映画である、北野武監督の「HANA-BI」

created by Rinker
¥3,253
(2019/05/20 21:36:14時点 Amazon調べ-詳細)

英語のタイトル「Fireworks」を入力してみます。

ふむふむ! 「アメリカン・スナイパー」ですか。

created by Rinker
¥1,500
(2019/05/20 21:36:19時点 Amazon調べ-詳細)

両方ともバイオレンスな香りのする映画だし、結末の雰囲気もなんとなく似てます。
これは割とうまくオススメできてるんじゃないでしょうか。

次は、泣ける映画として人気の高い「ライフ・イズ・ビューティフル」で試してみましょう。

created by Rinker
¥199
(2019/05/20 21:42:46時点 Amazon調べ-詳細)

なんと……
「イングロリアス・バスターズ」がおすすめされてしまいました。

created by Rinker
¥1,500
(2019/05/20 21:36:15時点 Amazon調べ-詳細)

どちらもナチスドイツが舞台な映画ではありますが、「ライフ・イズ・ビューティフル」が笑って泣ける感動作なのに対し、「イングロリアス・バスターズ」は残虐描写満載のブラックコメディ。
ちょっと設定に引っ張られすぎな感じがしますね。

そのほかいろんな映画タイトルで遊んでみましたが、うまくおすすめされる確率はざっくり50%という感じです。

「ジョーズ」と入れると「ジョーズ2」、「トイ・ストーリー」と入れると「トイ・ストーリー3」がオススメされるなど、同一作品シリーズが返ってきてしまうのは要改善。
また、主人公の名前が同じというだけで「インセプション」に「ワイルド・スピード」がオススメされる例もありました。

改善策としては、以下のものが考えられそうです。

  • 同じシリーズの続編を候補からはずす
  • 人名や地名などの固有名詞を評価しない
  • オススメする映画の本数を圧倒的に増やす

今回作成したコードは、GitHubリポジトリからダウンロードできます。
hashikuchi/movie_recommendation_engine

Jupyter Notebook上で動かせますので、ぜひいろんな映画を入力して遊んでみてください。

人工知能を勉強したいなら「Aidemy Premium Plan」がおすすめ!

この映画レコメンドエンジンを作るにあたっては、「Aidemy Premium Plan」を受講して作り方を勉強しました。

Aidemy Premium Planは、プログラミング未経験からでも人工知能アプリ開発が学べるオンラインコースです。
今回のレコメンドエンジンに必要な「自然言語処理」以外にも、「画像処理」「時系列分析」など、人工知能の開発に欠かせない内容を幅広く学べます。

学習につまづいたときでも、オンライン上でチューターに質問ができるので安心!
すでにプログラミングの基礎が身についている人なら、1ヶ月もあればオリジナルのアプリが作れるでしょう。
僕も人工知能を使ったアプリの開発経験はほぼゼロでしたが、3週間の学習でここまでできるようになりました。

「自分も人工知能を使ったアプリが作りたい!」と思った方は、無料カウンセリングに申し込んでみてはいかがでしょうか。
僕もカウンセリングを通して、作りたいアプリのためには何を学ぶべきなのか明確になり、学習へのモチベーションが一気に高まりました。
その勢いにのって、映画レコメンドエンジンも作ることができましたからね。

迷ったときにすぐ行動できるかどうかで、成長できるかどうかが決まりますよ!

【無料】Aidemyのカウンセリングに申し込む

ABOUT ME
はっしー
ニュージーランドで働くプログラマ。 日本のIT企業で月100時間超えの残業を経験して過労死しかけたことをきっかけに国外脱出、毎日定時帰りの生活と年収アップを実現させる。脱社畜、英語、海外移住などをテーマに情報発信中。Twitterフォロワーは1万人を超える。ニュージーランド永住権ホルダー。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です