「類似した」ソースコードのクラスターを検出する


10

コンピューターサイエンスプロジェクトを行う必要のある400人の学生(大規模な大学の学生)がいて、彼らは(学生のグループではなく)一人で作業する必要があると仮定します。プロジェクトの例としては、「Fortranでの高速フーリエ変換アルゴリズムの実装」が挙げられます(これはセクシーに聞こえませんが、質問が簡単になります)。私は修正者であり、「本当に独立して書くにはあまりにも類似している」実装を提案している学生のグループがあるかどうかを確認するルーチンを送信したいと思います。

これは、クラスターの教師なし検索です。問題は、使用するクラスタリングアルゴリズムではなく、使用する属性に関するものだと思います。最初に行うのは、文字ごとのヒストグラムです。理想的には、詐欺師はそれより賢いので、最終的には文字のランダムな順列を選び、文字のヒストグラム(順列を含む)の適切な一致が存在するかどうかを確認します。また、それらはコードの構造を探求せず、文字の周辺分布のみを探索します...どのような解決策がありますか?その問題専用の既存のソフトウェアまたはパッケージはありますか?(実際、私の昔、コンピュータサイエンスの教師は、そのようなツールがあったと主張していましたが、今では、非常にシンプルなものがあったと思います)

私は、ソフトウェア開発の弁護士もそのような問題を抱えていると思います(1000人の学生ではなく、2つの大きなコードがあるため、事態が難しくなります)。

回答:


4

明白な前処理ステップは、まったく同じファイルをマージすることです。

その後の鍵は正規化です。ある時点で、学生はコードのリファクタリング、変数名の変更などを開始します。またはコメントを書き直す。文字ヒストグラムはこれによる影響が大きすぎます(さらに、言語プロパティの多くをキャプチャします)。

一般的な手法は、言語固有のパーサーを使用して、ソースコードを抽象構文ツリーに変換することです。次に、これから特徴を抽出します。また、コメントを個別に並行して分析することもできます。

次に、ラインベースの「最長共通サブシーケンス」アプローチがあります。単一の行にかなり良い類似性がある場合は、任意の2つのファイルの最も長い共通のサブシーケンスを検索できます。これにより、多数の一致が発生します。


サフィックスツリーまたはサフィックス配列を使用して、最も長い共通のサブシーケンスを効率的に見つけることができることを追加したかっただけです。
12

Anonyに感謝します。私はあなたの答えの精神が本当に好きです(そしてそれを支持しました)。「データ変換」を使った真の高次元統計のように聞こえ、極端なパターンを検索します。それらの木にどのような距離を置きますか?
ロビンジラール

私はAST表現の類似性の専門家ではありません。1つのツリーが他のツリーの特別な種類のサブツリーであるという意味で、「シミュレーション」の概念があると思います。ASTを比較するには、それらを調整し、相対的な違いを数える必要があると思います。ブランチの順序を考慮に入れていない可能性があるため、簡単なコードの順序変更によって結果が変わることはありません。問題を効率的に解決する方法はn個しかないため、誤検出が発生する可能性があることに注意してください。正しい解決策が見つかったために誤検出が発生します...
QUIT-Anony-Mousse

0

反盗作の世界から、以前は「グラフ同型」という概念に出くわしました。たぶん、あなたもそれを見ることができます。

LCS-最長の共通サブシーケンスも可能です。しかし、これらすべてのソリューションを比較して、何が最良かを確認してください:)


このサイトへようこそ!読者がグラフ同型またはLCSが目の前の問題をどのように解決できるかについて読者がより良いアイデアを得ることができるように、前述の作業に関するいくつかの参照、およびおそらくより詳細な情報を提供できますか?
2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.