はてな村の地図『HatenarMaps』を公開しました
『はてな村』のアナロジーを本当に地図にできたら面白いだろうなと思って、週末を潰して作ってみました。TopHatenarが蓄積しているDBを一部活用したサービスになっています。
このサービスを簡単に説明すると、はてなダイアリーのユーザに、獲得ブクマ数に応じた領土面積を割り当て、さらに似た者同士の領土を隣接させるという試みです。
地図の全体を見渡すことで、はてダの大まかなトレンドを掴むこともできるし、スケールを拡大していけば個別記事に到達することもできます。さらに、Google Mapsで検索するような感覚ではてなidやキーワードを入力して地図を探索したり、「去年と今年で勢力図がどう変わったか」を調べることもできます。
HatenarMapsはTopHatenarと同様、Javaで開発しました。フレームワーク構成もTopHatenarと一緒で、Cubby+Mayaa+S2JDBCです。以下、動作原理を説明します。
はてなダイアリートップ1000ユーザの抽出
まず、以下のルールに基づいて、はてなダイアラーの「上位1000人」を抽出します。
- 被ブクマ数総計の多いユーザから順に抽出。
- ただし、RSS購読者数が上位2000位以内にランクしていないユーザは除外。
TopHatenarのクローリングDBと連携しているので、この抽出は一瞬で終わります。
タームベクトルの構成
次に、この1000人についてそれぞれ、被ブクマ数の多い日記エントリのベスト5までを対象に、はてブに付与されたタグの頻度を合計し、タームベクトルを構成します。ただし、タグは全部で数万個あるので、使用頻度の低いタグを切り捨てて、ベクトルの次元数を300まで減らします。
一次クラスタリング
各ユーザに対してベクトルが定まったら、そのベクトルを基に、K-means法という手法による非階層的クラスタリングを実行して、1000人のユーザを100個のクラスタに分割します。この結果、はてブタグの類似性が強い(≒日記のテーマが似ている)ユーザ同士がグループを形成します。
このときついでに、グループに名前を付けます。グループに属する全ユーザのタームベクトルを合計し、一番強い成分のタグをグループ名とします。
二次クラスタリング
K-means法で形成されたグループを対象にして、今度はWard法の距離関数に基づく階層的クラスタリングを実行します。この結果、グループ同士がくっついて親グループを作り、その親グループが別の親グループとくっついて…という感じで、はてなーのグループ階層が構成されます。
ボロノイ図の計算
クラスタリングによって生成された各ノードを、ラン○ールを模したポリゴン内に敷き詰めていきます。
各ノードの領域はボロノイ図の原理に従って計算します。このとき、ノード間の大きさの比が被ブクマ数の比と対応するように、additively weighted power voronoi tesselationという重み付き手法を使っています。
描画
領域計算が終わったら、後はいろんなスケールでイメージに描画して保存するだけです。1つの地図平面につき、大体5000枚のPNG画像を作成しています。今のところ選択可能な時間系列が14個あるので、全部合わせると70000枚くらい。ファイルサイズの合計は500MB程度です。
最後に
ネタ的な意味で作ったHatenarMapsですが、はてなーの動向を俯瞰的に把握できて、意外に実用性高いかも、と思っています。何となく眺めるだけでも楽しいので、ぜひ使ってみてください。
追記
まだクローラが安定していないため、本来地図に入っているべき人が入っていないケースがあるようです。しばらく日数が経てば落ち着いてくると思いますので、よろしくお願いします。