「音MAD」と一緒に使用されやすいタグを集計した

この記事は音MAD Advent Calendar 2022 in Summerの29日目の記事です。

この記事は前回の記事のアップデート的な立ち位置でもあるので、もしよければ前回のものから見てもらえると嬉しいです↓

naari.hatenablog.com

で、前回の記事を出した後、くらっちさんからこのような反応をいただいた。

ので、これをやってみる。

まず、相互情報量とは?

硬いことはWikipediaに尋ねてもらって、今回はやわらかく説明する。今回においては2つのタグがお互いに影響を与える量のことで、特定の2つのタグの結びつき度合いとも言えそう。この数字が高ければ高いほど、2つのタグの関係性が高いと言える。ここでは音MADというタグは固定で、音MADと一緒に使われるタグの相互情報量を算出する。

例えば Z会 + 音MAD と、ゲーム + 音MAD の場合、Z会 の方が 音MAD との依存度が高いことが予想でき、両者の相互情報量を比べると Z会 + 音MAD の方が高いはず。

今回は音MADと共に使われた全てのタグの相互情報量を算出した。

具体的な話については以下を参照。くらっちさんのDMに尋ねに行った時、このように教えてもらいました。(くらっちさんが言うには「個人の見解なので、用語や概念の正確性は保証しかねます」とのことでした!)

くらっちさんに助けてもらった

この直上のDMでのメッセージを読めば分かる通り、相互情報量については大部分をくらっちさんに教えてもらった。最初はこのページを参考に、月裏さんととげさんと一緒に理解を深めようとしていたが、結局うまく噛み砕くことができなかった。難しい言葉がそこそこ難しい言葉で説明されているので、頑張って読み解く感じ(未完)。以下は頑張っていた時の痕跡。

docs.google.com

それで手詰まりだったので、結局発案者だったくらっちさんに直接聞くことにした。僕らにもわかりやすい言葉と例で教えてくれたため、実装まで漕ぎ着くことができた。くらっちさん本当にありがとうございました!!

できるようになったこと

前回のものに追加して、相互情報量についての棒グラフが見れるようになった。降順でソートしてある。全体のものと年度ごとのページがそれぞれある。

また、相互情報量で愚直にソートすると、件数が少ないタグが強くなってしまうため、以下のようなフィルターをかけたものもそれぞれ用意した。ファイル名で分けているのでわかりにくいけど許してください。

思ったこと

感想を述べる。

  • おおよそ妥当な並び方をしている
    • 上位に来るものは知っていることが多かったり、後述するような音MADに対するメタなタグが多い
      • 素材に注目してみるとかなり楽しい、並びがより音MADらしくなった感じがする
      • 上述の「そのタグの音MADの投稿数が100件以上」のページや、年度ごとのページも一緒に見てみると結構面白い
    • 下位のタグはほとんど知らなかったり、ニコニコ動画のメインストリーム感が強いタグが多い
      • 逆に穴場なのでは?とか思ったりするが、まあ妥当に作るのが難しくてこうなっているのだろう
  • 音MADに対するメタなタグみたいなものが多い
    • ○○音MADリンク が多すぎる
      • 曰く「○○ + (音MAD + MAD) のようにクエリを組み立てるのがめんどくさいのではないか?」らしい
      • なので自ずとそういった機能を持っている ○○音MADリンク のようなタグは重宝されているっぽい
      • 正規化とかそういう問題を思い出さずにはいられない
  • 1未満からが本番感ある
    • 0.99.... って母数が多くないと出せない数字
      • このあたりの妥当感はかなり強いので見てみてください
    • 1ってもう自明なタグしかない感じがある
      • 問答無用で弾いてもよかったんだけど、10件以上あるものは残してみた
  • 0.5とか0.8とかの少数としてキリが良い数字がよく現れる
    • タグの持つ動画件数はおおよその場合で少なく、そんな場合の計算結果についてもキリがよかったり、よく見る数字になりがち
    • この対策として「そのタグの音MADの投稿数が100件以上」なページも用意した(上述)

実装について

リポジトリは前回と変わらず。

https://github.com/naari3/otomad-tag-sort

今回のものは前回よりも実装が難しかった。前回のものは音MADな動画に対してタグのみ集計すればよかったが、今回は全部を対象にする必要があった。メモリをかなり逼迫するか、かなり時間をかけるかの二択になっていた。

ので、今回はSQLiteを使ってみた。愚直に全動画をメモリ上に展開してループさせるよりはマシだろうと選択したが、それでも難しい部分はいくつか残った。そもそも現存する全部の動画↔タグの関係のカウントを取る必要があるが、この中間テーブルの時点で1億件ほど存在する。2007年から2022年までのすべてのページを素早く作成するためには、この1億件(とそれに付随する他テーブル)との対話を手早く済ませる必要があった*1

今回の動画↔タグの関係のテーブルを作成した場合、たとえば「2016年の動画のうち、音MADZ会 のタグが付いている動画の数」みたいなものをSQLだけで実現して取得するには少しだけ複雑なクエリを書かなければならないことがわかる。今回はSQLをいくつかに分け、Z会 の付いている動画ID一覧と 音MAD のついている動画ID一覧を別で取得し、その積集合を取ることでどうにかスピードを出している。

また、最初は動画のテーブルにのみ投稿日時をもたせ、中間のテーブルとINNER JOINさせることで年度の絞り込みを行っていたが、このJOINでかなりの時間を食うことがわかっているので、正規化を諦めて中間テーブル自体に動画の投稿日時を持たせるようにした。これによりJOINを減らすことができ、中間テーブルのみに注目するだけで絞り込みができるようになった。

勿論妥協の結果ではあるため、もっと良いテーブルの持ち方や、そもそもRDS以外で今回の要件に合っていそうなデータベースがあればそれを使っていきたい。

さいごに

そもそものアイデア相互情報量自体について詳しく分かりやすく教えてくれた くらっちさん、最初の解釈を手伝ってくれた とげさん と 月裏さん に感謝します。ありがとうございました!!

また、今回のデータベースを使用してなにかやってみたい方や、僕よりもデータサイエンスに詳しい方がいらっしゃったらこちらから何らかの支援は可能だと思うので遠慮なしに連絡してきてください。もっと詳しい人の取るアプローチがとても気になっています!!

おまけ

2022/09/03に取得した音○○○の一覧です

gist.github.com

*1:とは言っても180ページを作成するのに20分くらい掛かっているのだが