はてな村の地図『HatenarMaps』を公開しました

はてな村』のアナロジーを本当に地図にできたら面白いだろうなと思って、週末を潰して作ってみました。TopHatenarが蓄積しているDBを一部活用したサービスになっています。


このサービスを簡単に説明すると、はてなダイアリーのユーザに、獲得ブクマ数に応じた領土面積を割り当て、さらに似た者同士の領土を隣接させるという試みです。

地図の全体を見渡すことで、はてダの大まかなトレンドを掴むこともできるし、スケールを拡大していけば個別記事に到達することもできます。さらに、Google Mapsで検索するような感覚ではてなidやキーワードを入力して地図を探索したり、「去年と今年で勢力図がどう変わったか」を調べることもできます。

HatenarMapsTopHatenarと同様、Javaで開発しました。フレームワーク構成もTopHatenarと一緒で、Cubby+Mayaa+S2JDBCです。以下、動作原理を説明します。

はてなダイアリートップ1000ユーザの抽出

まず、以下のルールに基づいて、はてなダイアラーの「上位1000人」を抽出します。

  1. 被ブクマ数総計の多いユーザから順に抽出。
  2. ただし、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ですが、はてなーの動向を俯瞰的に把握できて、意外に実用性高いかも、と思っています。何となく眺めるだけでも楽しいので、ぜひ使ってみてください。

追記

まだクローラが安定していないため、本来地図に入っているべき人が入っていないケースがあるようです。しばらく日数が経てば落ち着いてくると思いますので、よろしくお願いします。