Я работаю над проектом по борьбе с плагиатом для моего класса CS. Это включает в себя обнаружение плагиата на курсах по информатике (задания по программированию) с помощью описанной методики «Зависание: локальные алгоритмы снятия отпечатков пальцев».
По сути, я беру группу заданий по программированию. Допустим, одно из заданий выглядит так:
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 = 5 (в действительности это было бы больше):
publi ublic blicc liccl iccla ... =0;}}
Вот проблема:
Каждый k-грамм хэшируется с помощью скользящей хеш-функции и должен записываться с исходной позицией в исходном тексте. K-грамм хеш и позиция символа вместе образуют отпечаток пальца.
Как я могу отслеживать исходное положение в граммах в исходном тексте по всему внешнему интерфейсу идентификаторов, комментариев и пробелов?
Это важно для заключительной фазы программы, где вы выделяете совпадения в парах документов в оригинальном исходном тексте. Чтобы выделить совпадения хешей k-грамм, мне нужно знать, где этот k-грамм начинался и заканчивался в исходном источнике.