ソースコード検索エンジン

みんな似たようなことを考えるんだなぁと思う。
CNET Japan(http://japan.cnet.com/) のページで出ていて、Namazuの作者さんがこんなのをやっていたのは知らなかった...。

http://blog.japan.cnet.com/umeda/archives/001861.html

せっかくのOpenSourceをなんとか活用できないかと思ってソースの検索エンジンを考えていたのだが、既に色々やられてるんだなぁと思い、改めてすごいと思う。

ソースコードの検索は、似たような単語(Cで言えばmemcpyとか標準ライブラリ)がたくさん出てきて、1つの単語では情報量が膨大になって、目的の物を探すのが難しいのではないかと思う。

そうなると、どうやってページごとの順位付けをするかが鍵になるのではないかと思う。Googleは、PageRankによってページの順位付けをしているとのことで、その考え方は、より多くリンクされているページは、良質なページみたいなことと聞いた。一般的なページでは、有効に働いている事は実証されていると考えていいと思う。ソースコードに適用するとどうなるか?includeをたどるだけでは、単に標準ライブラリのinclude.hが参照されるだけになってしまいそうだ(テストしていないからわかんないけど)。

きっと、人によって色々考え方があると思うけど、私の中では、関数の使い方を知りたいような場合が多いのではないかと思う。そして、そのような使い方をしているのはどのような特徴があるのだろう?と考えると、例えば、より似たような使い方をしているコードは、きっと良い利用のされ方で、一般的な使い方に合致していると考えることができるのではないか。
その場合は、各候補のより似ている数が多いコードを取り出し、その中の代表的な(もっとも平均的な使い方に近い)ページをRankが高い候補としてもってくれば良さそうな気がしている。1つだけでいいのであれば、それで終わりだ。でも、通常は候補がいくつもあるとおもう。おそらく、各ページの近さ(相関が高い/低いと表現すべきか...) の山がいくつか出てくるだろう。その似ているコードの集まりを順位付けし表示させれば、それなりのものができそうに感じる。
そして、似たような候補は、代表的な個所の子供みたいに表示しておいたり、バージョン毎の候補、ついでに、色づけしたり、バージョンのDiffを出したり...。そんな風にしたら、結構便利になるのではないだろうか。

その為に、大事になりそうなのは、ソースコードの近さをどうやって計るか?というのが色々な手法がありそうだ。単純にテキスト比較(全く同じなら同じになる)とか、なんらかの関数で、テキストを表し、その差分で計るなど。この辺を考えるとおもしろそうだが、きっと数学を勉強している人は、もっと単純でいい方法をすぐに出せるのだろうなと思う。