目录

一、Java 代码查重的特殊性

二、代码查重的核心原理

三、代码查重的范围

四、主流检测技术

代码相似度算法

基于抽象语法树(AST)的方法。AST方法将代码转换为抽象语法树,然后对比两棵树的结构和节点。这种方法能够更好地捕捉代码的语义相似度,但实现起来相对复杂。

基于控制流图(CFG)的方法。

五、重复率阈值

六、常见的代码查重软件

七、技术发展趋势


一、Java 代码查重的特殊性

  • 语法结构的特殊性。编程语言具有严格的语法规则,同一功能可以通过多种编码方式实现。仅依靠文本相似度检测的误判率高达34%(百度学术数据,2023)
  • 代码重构的隐蔽性。常见的规避手段包括:变量重命名(将"count"改为"counter")、控制流重构(将for循环改为while循环)、添加冗余代码、调换语句顺序等。这些修改可能使抄袭代码在传统检测系统中显示为"原创",但实际逻辑完全一致。
  • 开源代码的灰色地带。GitHub等平台上的开源代码常被直接复制使用。

二、代码查重的核心原理

代码查重的核心其实就是用算法来分析代码的相似性。 

代码查重的过程一般分为:

✔️预处理:在查重之前,工具会对代码进行标准化处理。比如,它会忽略空格、重命名变量等,目的是把代码形式上的差异最小化。

✔️特征提取:查重工具会把代码分解成多个逻辑块,并提取这些块的特征(比如语法结构、控制流、函数调用等。提取每个词语或短语的特征,如词频、位置等。 以便后续比较代码逻辑上的相似性,而不是简单地比较字符相似度。 

✔️相似度计算:通过特定算法来计算代码之间的相似度。如果两份代码的相似度超过某个设定的阈值,那就可能被判定为抄袭。

✔️结果分析与报告:最后,查重会生成一份报告,标出相似的代码片段、相似度分数,以及可能的抄袭来源。

三、代码查重的范围

  • 课程作业:教育机构中这是代码查重最常见的场景。无论是个人作业还是小组项目,查重范围通常是同班同学提交的所有代码,以及课程的历史提交记录。
  • 跨课程查重:学校论文查重场景中,有些学校会建立全校范围内的代码数据库,用于检测不同课程之间的代码抄袭,特别是基础课程的项目可能会被多次使用。
  • 第三方参考资源:一些查重系统还会检测代码是否与网络上的教程、示例代码、历史代码等相似。PS: 类似的场景如知网的论文查重,就是将论文与论文库里面的所有论文查重。
  • 开源代码库:企业查重常见的场景。某些查重工具会把你的代码与公共开源代码库进行比对。如果你的代码直接复制了 GitHub、Stack Overflow 或其他公共资源上的代码,很可能会被检测出来。

四、主流检测技术

  • 文本比对技术

文本比对:基于字符串匹配的算法(如Smith-Waterman)

适用场景:适合检测直接复制粘贴的代码、适用于课程作业等基础场景

不使用场景:对重构代码场景

文本比对有可以具体分为:

✔️检测文字的直接重复。可以查出直接抄袭。比如,通过比对文本与数据库中的文本,计算重复字数比例来判断是否存在抄袭行为。这种方式存在着明显的局限性:无法识别同义词替换、语序调整等"高级"抄袭手段,更难以应对跨语言抄袭等等。

最小相似文本字数:用户可以自定义最小相似文本字数,即系统认定两段文本相似的最低字数标准。

容许最大连续差异字数:此参数用于设定在一段文本中,允许的最大连续不匹配字数。例如,如果设置容许最大连续差异字数为10字,那么在一段文本中,连续10个字的差异将不会影响相似度的判断。

✔️识别内容的相似性。包括句子的重组、表述方式的变化以及概念、术语、知识点的相似等。可以更准确地识别出潜在的改写抄袭行为,即使抄袭者进行了改写、句子重组或转换表述方式。

  • 抽象语法树分析(AST)

AST: 将代码解析为树状结构,忽略变量名等表面特征,专注检测逻辑结构相似性.MIT开发的反抄袭系统MOSS采用此技术

适用场景:相比文本对比技术,对重构代码的识别准确率大大提升

  • 程序依赖图(PDG)

程序依赖图(PDG):通过分析数据流和控制流关系,检测算法层面的抄袭。比如,IEEE期刊要求所有投稿论文必须通过PDG检测

适用场景:适合检测复杂项目

缺点:计算成本较高 

  • 混合检测混合检测:结合文本相似度与结构分析。 比如 国内知网"代码库比对"功能可追溯至2000万+开源项目

代码相似度算法

  • 基于令牌的方法。 这种方法通过比较代码片段中的最基本元素(如单词、标识符、操作符等)来评估相似度。尽管该方法简单直观,但可能无法准确捕捉代码的语义相似度。
  • 基于抽象语法树(AST)的方法。AST方法将代码转换为抽象语法树,然后对比两棵树的结构和节点。这种方法能够更好地捕捉代码的语义相似度,但实现起来相对复杂。
  • 基于控制流图(CFG)的方法。

    CFG方法通过构建代码的控制流图来对比代码片段。这种方法能够更深入地分析代码的执行逻辑,但实现难度较高。

五、重复率阈值

        查重中的“阈值”是一个重要的参数,阈值的设置直接影响到查重的严格程度和判断标准。阈值设定了一个界限,超出这个界限的重复内容被认为可能是抄袭或剽窃。低于阈值的重复内容则通常被视为合理引用或普遍知识。

      对于文本对比,首先会对文本内容进行分词处理;然后按照预设的阈值参数,比如最小相似文本字数、允许的最大连续差异字数等,来计算内容与其他文档之间的相似度。文本默认阈值是30字,即30字以上的相似内容判定为文本雷同,该部分内容将被标记为潜在的抄袭内容。

       对于论文的查重阈值,阈值的设置也需要考虑到不同学科的特性和学术惯例。在某些领域,文献综述部分可能会有较高的重复率,而其他部分如研究方法和结果则要求更高的原创性。

        计算机论文通常允许更高的代码重复率(一般15-25%),但要求核心算法必须原创。

PS: 对于课程作业查重,由于代码总行数并不太多,代码重复率可以更高些。

在一些高校内部的非公开标准中,存在“查重率合理区间”判断机制

  

注意:为什么查重率太低也会被怀疑? 果你论文里没有任何理论引用、没有一句经典模型、没有引用前人观点,反而不合理!要么是天才,要么是AI写的。查重率低 ≠ 原创度高,可能只是“被AI洗过”的内容罢了(用 ChatGPT + 降重工具 + 结构打散,可以大大降低查重率)

六、常见的代码查重软件

  • 使用现有的代码查重工具

✔️PMD。一个静态代码分析工具,可以用来查找代码中的问题,包括潜在的错误和重复的代码。

✔️Checkstyle。主要用于检查Java源代码的编码标准,但它也可以用来发现重复的代码

✔️JPlag;一个用于检测软件工程项目的抄袭和重复代码的工具,特别适用于大型项目。它基于抽象语法树(AST)来对比代码,能够检测更为复杂的代码克隆情况。JPlag提供了多种相似度度量方法,如子树匹配、克隆块匹配等。

✔️Simian。一个专门用于检测代码相似性的工具,支持多种编程语言。比如,可以检查Java项目中冗余代码,提高代码质量。命令行使用, java -jar simian.jar [options] [files]。也可以作为Eclipse插件使用。Simian采用基于令牌(token)的算法来对比代码片段,通过计算令牌间的匹配度来评估相似程度。

✔️CPD(Copy/Paste Detector)。CPD是PMD项目的一个组成部分,专门用于检测Java代码中的重复和相似代码块。它同样采用基于令牌的方法,并提供丰富的配置选项,如设置最小相似度阈值、过滤选项等。

注:根据实际需求选择一款合适的代码相似度检测工具。如果主要检测Java代码,JPlag是一个不错的选择;如果需要跨语言检测,可以考虑使用Simian。

  • 一些学校或机构会开发自己的内部查重系统

七、技术发展趋势

  • 深度学习检测。于深度学习的文本相似度计算模型能够学习文本的语义信息,而不仅仅是依赖于表面的词汇相似度。

         基于Transformer的模型可识别代码语义相似性,Google Research的CodeBERT系统已能检测跨语言抄袭。

  • 智能应用。智能化的查重系统将更加准确地识别相似内容,并且能够更好地区分原创性内容与非原创性内容。
  • 区块链存证。部分期刊开始要求代码哈希值上链,确保研究可追溯。SpringerNature自2024年起实施该政策。
  • 跨语言应用。跨语言的论文查重工具将成为未来的发展方向。这种工具将能够涵盖多种语言的文本,满足不同地区和不同领域的需求。比如,云端服务与大数据分析,实现全球范围内的知识产权保护。
  • 交互式查重。新型系统如CodeOcean提供可视化比对界面,可高亮显示相似逻辑块而非简单重复行。
  • 多模态信息处理。传统的查重技术主要针对文本信息进行比对,而多模态信息处理可以将文本、图像、音频等多种形式的信息进行综合分析和比对。

例如,将图像识别技术与文本相似度计算相结合,可以检测出图像中的文本是否与已有文本重复。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐