ソースコード一致度解析ツール

実装しました。そして、利用したときに感じたことです。

  • 正規化の必要性
  • 統計的な何かの必要性
  • 構造解析の必要性

なお、採用したアルゴリズムは、2つのソースコードを字句で分割し、2配列のアライメントの問題へと帰着させ、ダイナミックプログラミングで解くというものです。(参考URL:http://www.genome.ad.jp/Japanese/lect/13-01.html
正規化の必要性は次の理由からです。ダイナミックプログラミングで求められる結果は、ソースコードの性質に依存した値であるということです。私のプログラムでは、比較するソースコードが長くなればなるほど、結果は大きな数字に偏り、ソースコードが短くなればなるほど、結果は小さな数字に偏ります。ですから、そのあたりを一意的に判断するために、何らかの正規化を行わなければならないと考えています。また、このことを発展させれば、統計的な何かが必要であるとも考えられます。
たとえば、あるAというソースコードと、それ以外のソースコードB1,B2,…,BNと比較したときの結果が、R1,R2,…,RNとなったとします。このとき、ソースコードが明らかに似通っているペアは、その結果が他の結果と比較して明らかにおかしい数値を叩き出している場合が多いです。ですから、その明らかにおかしいというのを見抜くためには、統計的な何かが必要です。
構造解析は次の理由から必要です。コードというのは、階層的な木構造をしています。コードAでは関数実装の並びがFA,FBとなっており、コードBではFB,FAとなっていたとします。このとき、採用した方法だと、FAまたはFBのみ一致と判断されてしまいます。FA,FBの中身が完全に同じでもです。ですから、何らかの方法で階層判定をしなければならないと考えました。
はてさて、どうしたものか。