2

我正在为我的 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 在原始源中的开始和结束位置。

4

2 回答 2

1

ANTLR 词法分析器跟踪源流中的标记位置。

  • 将评论和空格移至隐藏频道
  • Text标识符标记的属性设置为“V”
  • 对 a 运行滚动哈希CommonTokenStream,查看Text每个令牌的属性。

令牌从头到尾完好无损,您也将保留映射。

于 2010-01-25T07:48:08.303 回答
0

嘿,为什么要使用这一步:

然后将该字符串分解为预设大小的 k-gram。例如说 k = 5(实际上它会更大): publi ublic blicc liccl iccla ... =0;}}

我的意思是为什么抄袭检测需要这样做?

于 2010-02-27T08:02:40.507 回答