用JPlag在一组程序中寻找抄袭行为(翻译)

摘要:JPlag是一个Web服务,可以在给定的集合中找到类似的程序对的程序。它在实践中被成功地用于检测学生Java程序提交中的剽窃行为。能支持的语言除了java之外,还有C、C++和Scheme。我们描述Jpalg架构和jplag的比较算法,这个算法是基于名为“Greedy String Tiling”的已知算法。那么,这篇论文的贡献主要有三个方面:首先,对JPlag在几个不同的集合上的表现进行评估的Java程序,证明抄袭很难通过JPlag的检查。再一次测试中,在我们的各种基准程序集中,77个剽窃者中有90%以上被可靠检测到,其他人中的大多数都会引起怀疑。运行时间仅为几百秒,用于提交每个100个程序的100个程序。其次,参数研究表明,该方法在配置参数方面相当稳健。第三,我们研究了用于伪装抄袭的种类,频率和成功的种类。

关键词:剽窃,相似性,搜索,令牌,字符串拼贴
类别:GT算法,GT性能,F.2.2。 模式匹配,H.3.3,H.5.2。,
I.5.4。 文本处理,K.3.m.,K.5.1

检测类似的程序
1.所有要比较的程序都被解析(或根据输入进行扫描)
语言)并转换为令牌字符串。
2.将这些标记字符串成对比较以确定相似性
每一对。

将程序转换为令牌字符串的前端过程是JPlag中唯一依赖于语言的过程。 目前存在三种前端实现:Java和Scheme的实现都是实现完整的解析器。 C ++(或C)的第三个前端只包含一个扫描器。

作为一项规则,应该选择令牌,以便表征程序结构的本质(剽窃者难以改变),而不是表面方面。 JPlag忽略空白,注释和标识符的名称。 此外,JPlag在可能的情况下将语义信息放入令牌中,以减少纯粹偶然发生的虚假子串匹配。 例如,在Java中,我们使用Begin Method标记而不是仅仅一个Open Brace标记。 基于解析器的前端在这方面更胜一筹。 有关Java示例,请参见表1。 请参阅第4节以了解标记化方法的基本原理。

我们在第3.4节中的评估表明,JPlag对令牌集的更改非常有效

 Greedy-String-Tiling(String A, String B) {
     tiles = {};
     do {
         maxmatch = M;
         matches = {};
         Forall unmarked tokens Aa in A {
             Forall unmarked tokens Bb in B {
                 j = 0;
                 while (Aa+j == Bb+j && unmarked(Aa+j) && unmarked(Bb+j))
                 j + +;
                 if (j == maxmatch)
                     matches = matches ⊕ match(a, b, j);
                 else if (j > maxmatch) {
                     matches = {match(a, b, j)};
                     maxmatch = j;
                 }
             }
         }
         Forall match(a, b, maxmatch) ∈ matches {
             For j = 0 ...(maxmatch − 1) {
                 mark(Aa+j);
                 mark(Bb+j );
             }          
             tiles = tiles ∪ match(a, b, maxmatch);
         }
     } while (maxmatch > M);
         return tiles;
   }

表2:“贪婪字符串拼贴”算法[Wise,1993]。 第12行中的⊕运算符在匹配集合中添加匹配项,当且仅当它与集合中已有的匹配项之一不重叠时。 三重匹配(a,b,l)表示A和B的相同子串之间的关联,分别从位置Aa和Bb开始,长度为1。

用于比较两个标记字符串的算法本质上是“贪婪字符串拼贴”[Wise,1993]。 比较两个字符串A和B时,目标是找到一组具有以下属性的连续子字符串:每个子字符串都出现在A和B中,尽可能长并且不涵盖已由其他某个其他字符覆盖的标记子。 为了避免虚假匹配,强制执行最小匹配长度M.

最小匹配长度M被强制执行。“贪婪字符串拼贴”是一种启发式算法,因为保证找到的一组子字符串的最大值会使搜索过于昂贵。 这里是粗略的草图(参见表2的伪代码)。 该算法重复以下两个步骤:

步骤1(第5-18行):搜索两个字符串以查找最大的连续匹配。 从概念上讲,这是通过3个嵌套循环完成的:第一个循环遍历A中的所有标记,第二个将当前标记与B中的每个标记进行比较。如果它们相同,则最内部循环搜索Prechelt L.,Malpohl G.,Philippsen M .: Finding Plagiarisms ... 1021比赛结束。 这些嵌套循环收集所有最长的公共子串集合

步骤2(第19-25行):标记步骤1中发现的所有最大长度的非重叠匹配。这意味着它们的所有标记都被标记,因此可能不会用于后续迭代步骤1中的进一步匹配。 在Wise的术语中,通过标记所有的标记,匹配成为一个贴图。

重复这两个步骤直到找不到进一步的匹配。 由于在每一步中标记了更多的标记,所以算法总是终止。 它返回我们需要计算相似性度量的瓦片列表。 这项措施应该反映原始程序中由比赛覆盖的部分代币。 我们将其定义为sim(A,B)= 2·coverage(tiles)/(| A | + | B |)其中coverage(tiles)=? 匹配(a,b,长度)∈tiles长度。

这种启发式算法的运行时复杂度仍然相当高。 在最坏的情况下,所有三个嵌套循环都会执行到最大限度。 尽管在后面的迭代中匹配长度递减,但如果在每次迭代中只标记一个最短的可设想的匹配,则这可能导致与Θ((| A | + | B |)3)一样大的步骤, 最后涵盖了字符串[Wise,1993; Prechelt等,2000]。 在最好的情况下,根本不存在来自A的单个令牌,并且搜索需要Θ((| A | + | B |)2)个步骤。

2.2.3 Wise和JPlag的运行时间优化

尽管最坏情况下的复杂度不能降低,但通过应用Karp-Rabin模式匹配算法[Karp and Rabin,1987]的想法,实际情况下的平均复杂度可以提高到几乎Θ(| A | + | B |。

通过使用哈希函数来处理更长的字符串(“文本”T)。 为此࿰

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值