機械学習で映画の辛口レビューをブログから集めるウェブサイトを作った

映画の辛口レビューと感想を機械学習を使ってブログ記事から集めてウェブサイトにした。名前は[ホット チリ レビューズ](https://www.hotchillireviews.net/)。

現在は約３万件のレビュー記事と６千本の映画が収録されている。最終的には機械学習の精度を高めてレビューを集めまくって世界一の映画ブログ総合サイトにするつもり。

[映画の感想と辛口レビューをブログから集計
ホット チリ レビューズ](https://www.hotchillireviews.net/)


**ウェブスクレイピング　＋　機械学習　＋　ビッグデータ　＝　なんかスゲーもの**

３つの要素を足すと個人が立ち上げるウェブサイトであっても、すごいことができるはずという確信がある。機械学習はまだまだ学習中ではあるが成果が出てきたのでサイトを公開した。


# 映画レビューについて

わりと映画のレビュー好きである。単なる映画好きとはちょっと異なる。あくまで「映画のレビュー」好き。 映画のレビューはそれだけで十分に楽しめるコンテンツになっている。必ずしも「レビューを読むこと」と「映画を観ること」がリンクしている訳では無い。ただウェブサイトを巡回してひたすら映画レビューを読んでいるだけで楽しくて、きっと同様の感覚を持つ人も居ると思う。

同じひとつの映画を軸として、いろんなブロガーがそれぞれの視点で書いたレビューを読むと多角的に映画が理解できてくる。「おお、あの映画にそんな捉え方があったのか」という気付きがあったり、「これ書いた奴、映画が分かってねーなー」とツッコんだり。

そういう楽しみ方はブログに掲載されたレビューが最も適している。ツイッターのつぶやきで「スターウォーズすげーっす」と140文字以内のひとこと感想を読んでも何も分からない。アマゾンやヤフー映画のレビュー欄ではフォーマットが規定されていて、かつ文章も短く、読み応えが無い。

その点ブログは多様なフォーマットで各ブロガーが思う存分に映画レビューを書いている。中にはプロの映画評論家ですらできないような評論を個人ブログで発信されてたりする。
本当に自分に合った映画ブロガーとの出逢いはその後の映画人生を何倍も充実させてくれる。ただそんな「映画のレビュー好き」には常に問題があって、それは「どうやって自分に合った映画ブロガーを見つけるのか？」と。これってググってもなかなか出てこない。当然ながら検索キーワードに「私の感性に合う映画ブロガー」と入れても意味が無い。
そこでブロガーごとに書かれたレビューを数値解析してサイトに集計表示させた。そうすることで「アクション映画の感想を書かせたらピカイチのブロガーに出逢いたい」や「恋愛モノの映画の感想の第一人者は誰？」といったニーズに応えることができる。

「アクション映画のランキング」というのはどこの映画サイトでも手に入る。 でも「[アクション映画のブロガーランキング](https://www.hotchillireviews.net/bloggerlists/5b13af7a9d1fa23966211143/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)」というのはおそらくホット チリ レビューズでしか手に入らない。


# ブロガー分析

ブロガーごとに映画レビューを数値化分析した。映画のカテゴリーとリンクさせているのでどの映画分野に強いブロガーなのかがチャートでひとめで分かる。例えばこんな感じ。 

<img width="400" alt="Screen Shot 2018-07-19 at 22.42.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/49b1ed94-37ff-f34c-5dca-dafeeaf12e2c.png">

きっとブログの作者さんにとっても参考になるのでは、と思っている。




# 機械学習

このウェブサイト構築で最も重要なことは「ネット上にある様々な映画レビュー記事をその対象の映画にマッチングさせること」だった。最初はカンタンに考えていて、こんなに難しいとは思っていなかった。

いろいろやって出した結論としては、機械学習でAIにパターンを認識させてマッチングさせる以外に方法は無いな、と。

最初は機械学習を使わない方法で試してみた。本文中にある映画の公式ページのリンクとかアマゾンリンクから認識しようと試みた。でもブロガーによってやることがバラバラでまったく役に立たなかった。例えばゴッドファーザーのレビュー記事を書いて、最後にゴッドファーザーとゴッドファーザーPART2、同じ監督の別の映画リンクを貼ったり、ということがある。
映画のタイトルもほぼ当てにならない。人によってタイトルの書き方がバラバラなのだ。以下は全て同じ映画を示していることになる。

- スターウォーズ　フォースの覚醒
- SW　フォースの覚醒
- スターウォーズ　エピソード７
- スターウォーズ　EP７
- スターウォーズ　EP７　フォースの覚醒
- スターウォーズ７
- スターウォーズ　The Force Awakens
- Star Wars: Episode VII The Force Awakens

私が他人のブログに注文つけるのもおかしいが、もうちょっと統一してくれよ、と。
 人間の目で見て確認するのもいいが、何万件もある記事と映画は全部確認できないし、そんな方法では絶対にスケールしない。
そこで機械学習を使ってこんなことをした。

```rb
> classifier.classify "【ネタバレあり】スターウォーズ エピソード8 最後のジェダイ 感想文。早速観てきた！"
=> "スターウォーズ／最後のジェダイ"

> classifier.classify "宇宙好きのパパの影響を受けた２歳の娘と『スターウォーズ　フォースの覚醒』を観だけど、娘はアンパンマンの方がいいみたい"
=> "スターウォーズ／フォースの覚醒"
```


この精度にまだちょっと満足できていない。まずはRubyのclassifier-rebornを使った。つまりナイーブベイズ分類器（Naive Bayes classifier）でやったわけだけど、特にAIにシリーズものの映画の違いを分かってもらうところで苦労している。これをPythonのDoc2Vecに代えて今コードを書き直している。
しかしプログラム言語やツールを変えたところでこの精度向上のキーになるのは、いかに有用な教師データを用意してそれを正しく読み込ませることができるかどうかにかかってくると思う。内容的にも教師無しでは無理っぽい。

AI系の文献とか読むと難しい数式を使ってその理論が解説されているが実装面においてはどんなに崇高な理論があっても、キレいな教師データが無ければ意味が無いことが分かった。そしてそのアプリや企画に特化した教師データはなかなか手に入りにくい。
この辺りでアドバイスがあればぜひください。


# SEO

大量のページを持つウェブサイトをいきなり投下してGoogle様に自動生成ページとして捉えられるとSEOとしては相当に不利になる。しかしユーザー目線でみたら、好きな映画タイトルで検索してヒットゼロだとがっくりくる訳で、そこはまずはGoogleではなくあくまでユーザー目線でサイト構築を目指した。

今のところ映画タイトルごと、ブロガーごと、ジャンルごと、俳優ごと、映画監督ごとにページがあるので５万ページ以上をいっきに投下したことになる。それがSEOに及ぼす影響についてはまだ判明していない。はっきりしたらまとめて記事にでもするつもり。

ちなみにSPAのSEOはサーバーサイドレンダリングはせずにNetlifyのプリレンダーで対応した。Fetch as Google、Twitterカード、タイトルの動的変更、と対応はできていそうなのでしばらくはこれで様子見するつもり。


# 使った技術

- Ruby on Rails
- GraphQL
- React + Redux
- Heroku
- Netlify
- classifier-reborn
- django
- Google Cloud Platform

というわけで[ホット チリ レビューズ](https://www.hotchillireviews.net/)です。なんでも感想とかコメント、批評いただければありがたいです。