クラスタリングとはなにか・・・Wikipediaによると
教師なしデータ分類手法、つまり与えられたデータを外的基準なしに自動的に分類する手法。また、そのアルゴリズム。
だそうです。
つまりこれをやると、とあるエントリーに関連するエントリーを探しだせたりしちゃうわけ。
与えられたデータ = ブログの全エントリー と考えて
全エントリーを関連するエントリーごとにいくつかのグループに分ける。という感じかな。
クラスタリングの手法の中にも階層型と非階層型に分かれておるらしく
今回は「集合知プログラミング」という本を参考に
・階層的クラスタリング(たぶんウォード法?)
・非階層的クラスタリング(k-means法)
の二つを試してみた。
どちらも「ピアソン相関係数」という係数を使ってそれぞれの距離(関連性)を測る。
ちなみに「集合知プログラミング」はPythonで書かれておりRubyに直すのは一苦労。
しかし橋本詳解というブログでなんとRubyによるサンプルソースを公開されているので
本もってなかったり、直すの「めんどい」って方はそちらを参照するのが楽です。
各エントリーの本文抽出にはExtractContentというライブラリを使用。
本文抽出モジュールを RubyForge に登録しました (nakatani @ cybozu labs)
エントリーの内容解析にはYahooの形態素解析APIを使用。
Yahoo!デベロッパーネットワーク - テキスト解析 - 日本語形態素解析
こいつで、本文の中の名詞とそれぞれの名詞の出現回数が取得できるようになる。
(本文じゃなくタイトルだけを解析対象にした方が良い場合もあるやも)
でもって、各エントリーに出現する名詞と、それぞれの名詞の出現回数を
ピアソン相関係数で 計算しつつクラスタリングするようにしてみた。
結果としては、、、
ウォード法だとかなりいい感じでクラスタリングされた。
k-means法だと、若干精度が落ちる感じ。
しかしウォード法は処理速度が遅い遅い。。。
100件分クラスタリングするだけでも時間かかりまくり。これではダメ。
k-means法もウォード法よりは速いけど、遅い。
ん~。
結局、毎回100件分計算しなおすのではなく
前回計算した結果を踏まえつつ(何らかの形で残しつつ)
投稿したエントリーがどのグループに属するのか(関連するのか)
を算出するようなロジックにしないとあかんのか・・・。
ん~。
さてどうしたものか。
ん~。