集合知プログラミング
購入したままになっていた「集合知プログラミング 」を読み始めた。

ナレッジを扱うシステムに関わっているので、何かしら応用できないかな、と考えたのだった。

よくあるのが検索の際に「プロクシとプロキシ」「引越しと引っ越し」を同じとみなすような検索が出来ないか?ということ。
※他に「ossとオープンソース/opensource」「セマンティックwebとsemantic web/semanticweb」みたいな。

単純に考えると辞書を用意して検索ワードを拡張して検索エンジンに食わせよう、となる。けど、どうせなら自動的になんとかできないだろうか。

で、「集合知プログラミング

ユーザの与えた語に対し、類似あるいは関連の強い語を推薦できないかと考えた。
googleのように巨大なコーパスを扱える状況ならともかく、少ないリソース・計算力でどうにかそれらしい結果を出したい。

近年の分類方法の1つといえばタグ。多数のタグが集まる場所といえばソーシャルブックマーク。

あるURLで識別されるリソースに対し、不特定多数の人がタグをつける。
よほどおふざけな人が集まらない限り、ついたタグはリソースにまつわる一定の関連があるだろう。さらにそこには表記ゆれもある。これらタグ同士の相関係数を事前に計算しておいて提示するという試み。

僕ははてブを使っている。ちょうどいいことに特定URLをブックマークに関する情報をJSONで取得するAPIがある。
とりあえず自分のブックマークを起点に、他の人がつけたタグの数を取得し計算した。
URLの数は1300ちょい。タグの種類は約5500種類。

うーん、それっぽい結果になっているものもあるけど・・・・
※負の相関が降順なのは(僕のコードの)仕様です。
※ケンドールの順位相関係数です。

セマンティックweb
    0.866666666667: semantic web
    0.8: semanticweb
    0.6: メタデータ
    0.6: web
    -0.733333333333: rdf
    -0.142857142857: xml

rails
    0.733333333333: ruby on rails
    0.642857142857: ror
    0.6: soft
    0.52380952381: develop
    0.444444444444: web開発
    0.428571428571: rubyonrails
    0.418181818182: tutorial
    -0.8: manual
    -0.6: tools
    -0.6: 資料
    -0.52380952381: reference
    -0.4: ソフトウェア開発
    -0.357142857143: web制作
    -0.333333333333: リファレンス

oop
    0.6: モデリング
    0.6: agile
    0.575757575758: オブジェクト指向
    0.563636363636: oo
    0.466666666667: design pattern
    0.433333333333: programming
    0.4: devel
    -0.6: 未読
    -0.6: 設計
    -0.428571428571: デザインパターン
    -0.4: programing
    -0.333333333333: design
    -0.222222222222: システム開発
    -0.2: develop

母集団が小さいからなのか。母集団が偏っているのか。

考えてみれば、ソーシャルブックマークのタグに全て(といいたくなるくらいたくさん、の意)の語が登場するわけではなく、「自分がブックマークするときのタグの推薦に使える」ぐらいの結果か。
母集団の中には「ソーシャルブックマークを便利に使う工夫のタグ」も存在するので、そもそも推薦に向かないものがある。
※「*お役立ち」とか「2-便利」とか「あとでよむ」みたいな

表記ゆれのネタにしようと思ったら、「同じURLに対して同じ人がつけたタグ同士」は表記ゆれではなくて、何かしら別の軸の意味を持った言葉のはず。なので、こういうタグ同士でペナルティを加味したらもう少しマシになるかな。

ま、それでもなんとなーく相関のありそうな語の固まりが取り出せたのは、ちょっと面白かった。
サンプルをどーんと拡大してhadoopで分散処理、みたいなことをやってみたいな。