旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

タグクラウドのアルゴリズム

2007年9月21日

タグクラウドの大きさを決めているアルゴリズムはどうなってるのかなと、PHPのTagCloud.phpと、Rubyのtagcloud-rubyを読んみました。

両方ともCSSセレクタ生成等が処理の中に入ってしまっており、ライブラリとしてはやや微妙な感じ。(元のPerlの実装に合わせているからだと思いますが)
なので、アルゴリズムだけ貰おうかと。

【最も基本的なアルゴリズム】

  • 最終的に、各タグの大きさは25段階の範囲で区分される。
    ソース内ではこれを level と読んでおり、0-24の範囲で指定している。
  • level算出方法は以下の通り
    1. 最もタグ付けされている回数が多いタグの回数を取得し、それの平方根を求める。以後この値を max と呼ぶ。
    2. 最もタグ付けされている回数が少ないタグの回数を取得し、それの平方根を求める。以後この値を min と呼ぶ。
    3. max – min の間を均等に 25段階に分け、各タグのタグ付け回数の平方根の値が、その範囲のどこに位置するのかを求め、それが level となる。

こんだけ!単純明快!
(・・・なはずなんだけど、文章がまずくてよくわからなくなってる。下の例を見つつの方がわかりやすいかも)

もうちょい、具体的な実装はどうなってんのか話をしますと

  • 各タグのfont-sizeは、level + 12 px
  • 全てのタグのタグ付け回数が同じ場合、つまり、max – min が 0 に等しい場合については特殊な処理をしている。
  • max – min を25段階に分けて、そこのどこに振り分けるかの処理は
    24 / (max – min) という式により係数を作り
    それを (各タグのタグ紐付け回数の平方根 – min) に乗じていた。
  • levelごとにCSSのセレクタを設定していた。

こんな感じです。

【level算出例】

"js"タグ 10件
"ruby"タグ 5件
"php"タグ 3件
"html"タグ 1件

の場合

max = 10の平方根 = 約3.16
min = 1の平方根 = 1
係数 = 24 / (3.16 - 1) = 約11.11

という処理のベースとなる値が取得され

"js"level = (3.16 - 1) * 11.11 = 23.99
"ruby"level = (2.23 - 1) * 11.11 = 12.55
"php"level = (1.73 - 1) * 11.11 = 8.11
"html"level = (1 - 1) * 11.11 = 0
※計算中の端数の処理は適当にやってください

と、概ねこのような結果になります。
へー

ちなみに、Rubyで書かれた方が256倍読みやすかったことで、やっぱRubyはいいなと思いました。
1行に処理を詰めることが出来たり、コード量が少ないと、読む方も相当楽です。
(Rubyが良いというよりは、PHPが良くないという方が真実かもしれないけど)