我正在为我的 CS 课做一个反抄袭项目。这涉及通过一种描述为“Winnowing: Local Algorithms for Document Fingerprinting”的技术来检测计算机科学课程(编程作业)中的抄袭行为。
基本上,我正在做一组编程作业。假设其中一项任务如下所示:
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-gram。例如说 k = 5(实际上它会更大):
publi ublic blicc liccl iccla ... =0;}}
这是问题所在:
每个 k-gram 都使用滚动散列函数进行散列,并且应该与它们在源文本中的原始字符位置一起记录。k-gram 哈希和字符位置一起形成指纹。
如何在标识符、注释和空白的所有前端剥离中跟踪源文本中的 k-gram 原始位置?
这对于程序的最后阶段是必不可少的,您可以在原始源文本中突出显示成对的文档中的匹配项。为了突出 k-gram 哈希的匹配,我需要知道 k-gram 在原始源中的开始和结束位置。