我正在为我的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在原始源中开始和结束的位置。
答案 0 :(得分:1)
ANTLR词法分析器跟踪源流中的令牌位置。
Text
属性设置为“V”CommonTokenStream
运行滚动哈希,查看每个令牌的Text
属性。从开始到结束,令牌保持完整,您也可以保留映射。
答案 1 :(得分:0)
嘿,为什么要使用这一步:
然后将该字符串分解为预设大小的k-gram。例如,假设k = 5(实际上它会更大): publi ublic blicc liccl iccla ... = 0;}}
我的意思是为什么这需要抄袭检测?