ノート4.8 タグのクラスタリングによって、新しいジャンルの発見を試みる(その1)

(注意)本作のデータは全て2021年1月19日から20日にかけて取得されたものです。


 ――――――――――――――――


「はい、ホットココア」


 俺――研究所主任研究員マッドサイエンティスト草薙くさなぎタケルが様々な問題を抱えている Excel とオサラバしようと新しい手法を試しているとき、幼馴染みのとう景子けいこが俺の為に飲み物を入れてきてくれた。


「ありがとう」

「どういたしまして。ところで、今日の新型コロナウィルスの感染数ってどうなってる?」

「今日はそんなに多くないよ。緊急事態宣言の効果か、大分新規感染者数は減ってきてるね。だが、どこぞの病院でまたクラスターが発生したらしい」

「あらら……可愛そうに。そう言えば、何気なく使ってる『クラスター』って言葉だけど、日本語にはどう訳せば良いのかしら」

クラスターClusterは、『群れ』や『集団』を意味している。同じような意味のグループgroupは有象無象の集合でも成り立つのに対し、クラスターは同じような人やものが集まっている集合と言う点でより限定的な状況を指す」

「つまり、コロナの場合は感染者という意味で同じ状態の人間が集まってるからクラスターって言うのか……」

「そう言うこと」

「なんだか嫌な言葉ね」

「誤解して貰っては困る。科学の世界でクラスターという言葉はよく使われてて、悪い意味なんか全くない」

「え、そうなの?」

「それじゃぁ今日はクラスターの威力を知ってもらうために、実際にカクヨムに対するクラスターの分析をしてみよう。便利だという事がよく分かると思うよ。

 ところでケイコちゃん、カクヨムにはすでに大きなクラスターがいくつも存在してるんだけど、何か分かる?」

「うーん、なんだろう。カクヨムで同じ種類のグループと言えば――あ、ジャンル!」

「その通り。ジャンルという言葉はクラスターと同じ意味だ。そこで今回は、タグをベースにした『階層型かいそうがたクラスタリング』を実施して、カクヨムのジャンルがどのように分かれていくのかを調べていく」

「どんなことが期待できるの?」

「もしクラスタリングした結果、カクヨムが決めたジャンルキーワードとは異なるタグによって形成されている大きなクラスターを発見出来たら、それは 1 つのブームになっている可能性がある。今後、新しい小説を書く上で参考になるだろう」

「そんなに上手くいくかしら」

「とにかくやってみよう。まず、今回使用する階層型クラスタリングについて簡単に説明する。

 最初に、データを全くグループ化していない状態から、近い者同士のデータをまとめてクラスターを作る。その後、それをまた 1 つのデータと見做して、再び他のデータもしくはクラスターと近いもので新しいクラスターを作る。これを繰り返していって、最後に所望のサイズのクラスター数になるまで繰り返すと言う手法だ」

「うーん、いまいちピンとこないんだけど……」

「まぁ、言葉だけじゃ分かりにくいよな」

「そもそも、タグって言葉でしょ。どうやって遠いとか近いとか比べるの?」

「良い質問だ。何かをクラスタリングしようと思ったら、2 つのデータが遠いか近いか――すなわち『距離』を定義しないといけないね」

「私とタケル君の距離が 2 メートルとか、そんな感じ?」

「そのイメージで完全に合ってる。ところで、研究ノート4.2 でタグを『ベクトル化』したことは覚えてる?」

「逆に聞くけど、覚えてると思う?」

「……だよね。それじゃぁ復習しよう。

 研究ノート4.2で何をやったかというと、いくつもの数字を塊にして表現するベクトルを使って、タグを数学的な表現に置き換えた。詳細な手法は当該研究ノートを見てもらうことにして、例を挙げるとこんな感じだ――」


 ――――――――――――――――

 ベクトルで表現されたタグの例

 ――――――――――――――――

 恋愛 = (3, 2, 2, 0, 0, 1, 1, 1, 1)

 学園 = (2, 3, 1, 1, 1, 1, 1, 0, 0)

 日常 = (2, 1, 2, 0, 0, 0, 0, 1, 1)

 魔法 = (0, 1, 0, 1, 1, 0, 0, 0, 0)

 異世界 = (0, 1, 0, 1, 1, 0, 0, 0, 0)

 短編 = (1, 1, 0, 0, 0, 1, 1, 0, 0)

 コメディ = (1, 1, 0, 0, 0, 1, 1, 0, 0)

 現代 = (1, 0, 1, 0, 0, 0, 0, 1, 1)

 青春 = (1, 0, 1, 0, 0, 0, 0, 1, 1)

 ――――――――――――――――

 研究ノート4.2『コサイン類似度って何?』より

https://kakuyomu.jp/works/1177354055450204744/episodes/16816452218458899966

 ――――――――――――――――


「この数字の羅列は見覚えあるわ」

「思い出してきたかな? ベクトルは足し算等の様々な演算が出来るんだけど、その 1 つに距離がある。今回は最も基本的なユークリッド距離を用いる」

「ユー! クリとキュウリ!」

「なんだか妙な組合せだな……。さて、ユークリッド距離は以下のように定義されている」


 ――――――――――――――――

 2 つのベクトルのユークリッド距離(4次元)

 ――――――――――――――――

 d(a, b) = √((a₁ - b₁)² + (a₂ - b₂)² + (a₃ - b₃)² + (a₄ - b₄)²)

 例:d(a, b) = √((0.0 - 0.4)² + (1.0 - 0.5)² + (2.0 - 0.6)² + (3.0 - 0.7)²) ≒ 2.77

 ――――――――――――――――


「なんかこんな感じの計算をやったことがある気がする」

「そりゃそうだろう。例えば、地図上の 2 地点間の距離は 2 次元のユークリッド距離だし」

「あー、基本的って言うのは『よく使われている』と言う意味だったのね。タケル君は簡単なことを難しく言う天才ね!」

「それ、絶対褒めてないよな……。

 とにかく話を続けよう。これで、タグ同士の距離を測れることは理解出来たと思う。後は、それぞれのタグ同士の距離を地道に計算して距離行列というものを作るんだ。こんな感じのね――」


 ――――――――――――――――――――――――――――――

 タグの距離行列

 ――――――――――――――――――――――――――――――

      恋愛 学園  日常  魔法 異世界 短編 コメディ 現代 青春

 ――――――――――――――――――――――――――――――

 恋愛   0.00 2.65 2.00 4.47 4.47 3.32 3.32 3.32 3.32

 学園   2.65 0.00 3.32 3.32 3.32 2.83 2.83 4.00 4.00

 日常   2.00 3.32 0.00 3.46 3.46 3.00 3.00 1.73 1.73

 魔法   4.47 3.32 3.46 0.00 0.00 2.24 2.24 2.65 2.65

 異世界  4.47 3.32 3.46 0.00 0.00 2.24 2.24 2.65 2.65

 短編   3.32 2.83 3.00 2.24 2.24 0.00 0.00 2.45 2.45

 コメディ 3.32 2.83 3.00 2.24 2.24 0.00 0.00 2.45 2.45

 現代   3.32 4.00 1.73 2.65 2.65 2.45 2.45 0.00 0.00

 青春   3.32 4.00 1.73 2.65 2.65 2.45 2.45 0.00 0.00

 ――――――――――――――――――――――――――――――


「コサイン類似度の行列とは違うの?」

「計算方法が違うので全く別のものだ。

 さて、自分自身の距離が 0 なのは当たり前なので考えないとして、この中では『魔法』と『異世界』、『短編』と『コメディ』、そして『現代』と『青春』タグが距離 0.00 で最小値だ。従って、この 3 つを新しいクラスターとしてまとめるんだ」


 ――――――――――――――――――――――

 タグの距離行列

 ――――――――――――――――――――――

      恋愛 学園  日常  クラ1 クラ2 クラ3

 ――――――――――――――――――――――

 恋愛   0.00 2.65 2.00 4.47 3.32 3.32

 学園   2.65 0.00 3.32 3.32 2.83 4.00

 日常   2.00 3.32 0.00 3.46 3.00 1.73

 クラ1    4.47 3.32 3.46 0.00 2.24 2.65

 クラ2    3.32 2.83 3.00 2.24 0.00 2.45

 クラ3    3.32 4.00 1.73 2.65 2.45 0.00

 ――――――――――――――――――――――

 クラ1 = {魔法, 異世界}

 クラ2 = {短編, コメディ}

 クラ3 = {現代, 青春}

 ――――――――――――――――――――――


「いきなり 3 つもクラスターが出来て、タグが減ったわね」

「そうだな。さて、本当は各クラスターの代表地点をどう計算するかという話があって、今回はウォード法と呼ばれるものを用いるけど、詳細は割愛するぞ。上の表はすでに代表地点の計算が終わった状態だ。

 さて、ここから何をするかというと、再び距離が 1 番小さいタグもしくはクラスターの組合せを探す。今回だと距離 1.73 の『日常』タグとクラスター 3 が最小だな。と言うことで、『日常』タグはクラスター 3 の仲間になってもらうことにしよう」


 ―――――――――――――――――――

 タグの距離行列

 ―――――――――――――――――――

      恋愛 学園  クラ1 クラ2 クラ3

 ―――――――――――――――――――

 恋愛   0.00 2.65 4.47 3.32 2.83

 学園   2.65 0.00 3.32 2.83 3.70

 クラ1    4.47 3.32 0.00 2.24 2.83

 クラ2    3.32 2.83 2.24 0.00 2.51

 クラ3    2.83 3.70 2.83 2.51 0.00

 ―――――――――――――――――――

 クラ1 = {魔法, 異世界}

 クラ2 = {短編, コメディ}

 クラ3 = {現代, 青春, 日常}

 ―――――――――――――――――――


「後はこれをひたすら繰り返して、所望のサイズのクラスター数が得られれば終了だ」

「これって、距離はいちいち計算し直してるの?」

「し直してる。だから自分でアルゴリズムを実装しようと思ったら結構面倒くさい。と言うことで、今回は Python の機械学習ライブラリの 1 種である scikit-learn サイキットラーンのお世話になったぞ」

「とりあえず、タグをグループにまとめられそうだなーという雰囲気は分かったわ」



「さて、ここからは実際のデータを使った結果を紹介していこう」

「タケル君は自信満々みたいだけど、本当に出来るのかしら……」

「まずは今回使用しているデータのおさらいだ。タグ自体はカクヨムに 114,416 種類存在するが、計算機パソコン能力の限界により出現頻度が 9 回未満のタグを破棄したデータになっている」


 ――――――――――――――――

 統計情報:出現頻度が 9 回未満のタグを破棄

 ――――――――――――――――

 タグもしくはセルフレイティングが付いている作品:183,022作品

 種類:6,757種類(セルフレイティング込み+作品ジャンル)

 ――――――――――――――――


「確か、ジャンルのキーワードもタグ扱いにして含めてるのよね」

「その通りだ。つまり、1作品に付いているタグは通常の 8 種類、セルフレイティングの 3 種類、そしてジャンルキーワードの 1 種類で、最大 12 種類のタグが付いている可能性がある。

 なお、仮にジャンルキーワードと全く同じタグが作品に付いていた場合は、重複無くカウントしている」

「1 作品につき 1 回だけってことね」

「その通りだ。では、前置きが長くなったけど結果を発表する。まずはクラスター数を 2 とした場合だ」

「タグを 2 つのグループに分けたのね。ちゃんと分かれるかしら?」


 ――――――――――――――――

 タグクラスタリング(クラスター数:2)

 ――――――――――――――――

 ┏ クラスター 0:6,754タグ(代表タグ『恋愛』)

 ┫

 ┗ クラスター 1:3タグ(代表タグ『残酷描写有り』)

 ――――――――――――――――


「2 つに別れてそうと言うのは棒線みたいなので分かるけど、データの読み方が分からない」

「『クラスター 0』の数字は、単にクラスターを識別するために付けた ID だから、特別な意味は無い。その後ろ、『6,754タグ』と言うのはクラスターに含まれているタグの種類を表している」

「『代表タグ』って何?」

「そのクラスターに含まれているタグの中で、最も多くの作品に出現しているタグを表示している。『残酷描写有り』は41,728作品で全体ランキング 1 位、『恋愛』タグは 34,573 作品で全体ランキング 4 位と言った具合だ」

「なるほど、そのクラスターで 1 番メジャーってことか。それにしても、タグの種類が偏りすぎてない?」

「うーん、確かに」

「なんか上手くいってる気配がしないんだけど。それに、クラスター 1 に含まれているタグが 3 種類で、クラスター 0 でトップのタグが 4 位ってことは、1 位から 3 位までのタグが全部クラスター 1 に含まれちゃってるんじゃないの? 」

「そ、そんなはずは……。とりあえず、クラスター数 3 の場合を見てみよう」


 ――――――――――――――――

 タグクラスタリング(クラスター数:3)

 ――――――――――――――――

  ┏ クラスター 0:15タグ(代表タグ『恋愛』)

 ┏┫

 ┫┗ クラスター 2:6,739タグ(代表タグ『詩・童話・その他』)

 ┗ クラスター 1:3タグ(代表タグ『残酷描写有り』)

 ――――――――――――――――


「絶対おかしいって。研究ノートを見返したら、『詩・童話・その他』が付いてる作品は 17,630 作品でランキングは 10 位、ってことは、他のメジャーなタグは全部クラスター 0 かクラスター 1 に含まれてるってことにならない?」

「むむ、ケイコちゃんにしては鋭い指摘……」

「なーんだ、やっぱり上手くいかなかったわ。残念ね」

「あ!」

「ちょっと、いきなり叫び声なんか上げちゃって、どうしたの?」

「そうか……そうだったのか……」

「タケル君、1人の世界に入らないで私に説明してくれないかしら」

「上手くいかない理由が分かった」

「本当?」

「データの『正規化』を忘れてた!」

「……正義感?」

「特徴を損なわずに上手くデータを変形する方法のことさ」

「正規化をすると本当に上手くいくの?」

「それは――」

「それは?」

「長くなったので、次回へ続く!」

「あー! またやられたっ!!」



 ――――――――――――――――

 今日の研究ノートまとめ

 ――――――――――――――――

 ・階層型クラスタリングという手法を使ってタグによるジャンル分けを検討

 ・しかし、距離行列をそのままクラスタリングに使用すると上手くいかない

 ・次回、果たしてクラスタリングは成功するのか? ヒントは『正規化』だっ!

 ――――――――――――――――

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る