最近はあんまりブログを書いていませんが、実はPHPでウェブアプリ作りに励んでいました。Web2.0風な掲示板を作っていたのですが、やっと社内の空きIPを使って仲間内リリース。そこそこ好評でした。
ソーシャルタギングをサポートしているのですが、タグデータを元にタグクラウドを作る方法についてまとめてみます。
※ここで出てくるDBはMySQL前提です。
1.タグの出現回数の抽出
単純にタグの値でグループ化して出現回数をカウントするだけですが、「注目のタグ」みたいな感じで、流行っているタグと流行っていないタグを混在させたい場合、ちょっとした工夫が必要になります。
流行っているタグは出現回数でソートして上位n件のみを取得します。流行っていないタグはカウントを取りつつも結果をシャッフルしてn件取得します。結果セットのシャッフルは業務システムをやっているとあんまり経験する事がないと思いますが、こんな感じのSQLになります。
select tag, count(*) ,rand() as count from tags group by tag order by 3
早い話、擬似列に乱数を並べて、その乱数でソートするだけです。後はunionでマージしてdistinctで一意にしてから、再度シャッフルして結果セットを返します。
2.出現回数から偏差値を求める
タグの大きさをn段階にするために、偏差値を求めます。手順は以下のような感じです。(数学が苦手なので、突っ込みあればヨロシクです)
-
件数と平均出現回数を求める
-
(個々の出現回数 - 平均)の2乗の合計を求める
-
2の合計を件数で割って平方根を求める......これを標準偏差とする
-
(個々の出現回数 - 平均出現回数) / 標準偏差を求める......これを偏差値とする
-
偏差値の上限と下限を取得する
-
(偏差値の上限 - 偏差値の下限) / n段階の値を求める
-
(偏差値 - 偏差値の下限) / 6の値を求めて四捨五入する
偏差値は値としてみる場合、上記の値*10+50の計算が行われますが、不要なので省いています。途中の割り算で、0で割らないようにする注意が必要です。
3.スタイルシートを用意する
スタイルシートでタグの大きさを決定するのが楽です。以下のような定義を行います。大きさについては見栄えを考慮して適度に設定すればよいと思います。
a.tag1{font-size:90%} a.tag2{font-size:100%} a.tag3{font-size:115%} a.tag4{font-size:135%}
4.HTMLを生成
アンカータグを生成して、そのアンカータグのクラス名にtag[n]を指定します。[n]は偏差値を元に算出した値です。
こうすることで、流行、非流行なタグを混ぜ込んだタグクラウドが完成します。
久々に数学をやると混乱しますね。数学が苦手なので、「~がXXXであるとき、~を満たすYYYを求めよ」みたいな問題があっても、プログラムで解決する事が多いですね。
解ける理論を知らなくても、「今のPCって早いから総当りでいいじゃん。件数が膨大じゃないし」くらいの感覚です。でも余計に数学が分からなくなりそうですね。