ソーシャルブックマークのデータマイニング

Kikker の学習の仕組みと Rocchio アルゴリズム - naoyaのはてなダイアリー から。
ずっと以前に del.icio.us の登録タグを利用して、これと似たように Cosine similarity からユーザー間の類似性を計算するプログラムを作ったことがあります。
きっかけは、偶然ウェブ上で見つけたアマゾンのレコメンデーションシステムに関する資料。そこには、ユーザーに紹介するおすすめ商品を求める方法の概説が書いてありました。確かこの頃プログラミングのネタをひたすら探していて、その中の候補として協調フィルタリングに関心があったのかな。当時は全く前知識がなかったので、資料を読んだ時は「こんな単純な内積計算で実現されてるのか」と驚いた記憶があります。その後、勢い余って半日ぐらいでプログラムを書き上げました。(もちろん、アマゾンが所有するような大規模データベースとなると、線形代数の参考書の問題を解くようにはいかないのは分かってますが。)ちなみに、この時期ちょっとSchemeにはまっていたので、言語の練習を兼ねてプログラムはGaucheで書いたのでした。
ユーザーの類似性を計算するアルゴリズムはおおよそ以下のような感じです。

  • 適当に収集したユーザー名(行)と各ユーザーの登録タグ名(列)から、登録タグ数を要素とする行列を作成する。なお、登録タグ名は同じ意味の単語でも表記はユーザーによってまちまちなので適当に正規化しておく。
  • ユーザー名の集合から適当にユーザー二人を選んでその行ベクトルを求める。
  • 行ベクトルの内積を計算して結果の正負で類似性を判定する。

ただこの時は、アルゴリズムがそこそこ思い通りに動いたという事だけで満足してしまって、プログラミングが一通り終わった後、いまいち興味が続かず、結局この類似性判定プログラムは日の目をみないままお蔵入りになってしまいました。もう少し根気よく継続していればものになったかもしれないのに。残念。