CSクラスの剽窃防止プロジェクトに取り組んでいます。これには、 「Winnowing: Document Fingerprinting のためのローカル アルゴリズム」で説明されている手法を使用して、コンピューター サイエンスのコース (プログラミングの課題) で盗作を検出することが含まれます。
基本的に、私はプログラミング課題のグループを取っています。割り当ての 1 つが次のようになっているとします。
public class MyClass
{
public static void main(String[] args)
{
// declare a variable called someVar
int someVar = 0;
}
}
これは、フロントエンドの字句解析部分を実行して、不要なコードの機能を取り除く必要があります。この例では、すべての識別子の名前を定数 "V" に変更し、コードからすべてのコメントを削除します。
これを行うには、ANTLRとさまざまな言語の既存の文法を使用して、適切なレクサーを生成します。
最終結果は次のとおりです。
public class V
{
public static void V(String[] V)
{
int V = 0;
}
}
次に、すべての空白を削除して取得します。
publicclassV{publicstaticvoidV(String[]V){intV=0;}}
この文字列は、事前設定されたサイズの k グラムに分割されます。たとえば、k = 5 とします (実際にはもっと大きくなります)。
publi ublic blicc liccl iccla ... =0;}}
問題は次のとおりです。
各 k-gram はローリング ハッシュ関数でハッシュされ、ソース テキスト内の元の文字位置で記録されることになっています。k-gram ハッシュと文字位置が一緒になってフィンガープリントを形成します。
識別子、コメント、および空白のすべてのフロントエンドストリッピングにわたって、ソーステキスト内の k-grams の元の位置を追跡するにはどうすればよいですか?
これは、元のソース テキスト内のドキュメントのペアで一致を強調表示するプログラムの最終フェーズに不可欠です。k-gram ハッシュの一致を強調するには、その k-gram が元のソースのどこで始まりどこで終わるかを知る必要があります。