内容介绍

  1. 基本功能实现
    a) 预处理
    b) LCS实现
    c) 给出合适的r,求出D(i,j)
  2. 解决变量名代换的问题
    a) 字面距离
    b) 正则化截取

实验概述

  1. 对待查重的文件的预处理
  2. LCS基本实现
  3. 对r、D(i,j)和递归公式的推导
  4. 字面距离(Levenshtein距离和Jaro-Winkler距离)
  5. 正则化表达式截取字符串

实验内容

  1. 基本实现
    a) 预处理
    首先,考虑到不同人编程的习惯差异,会产生不同的缩进,因此空格、回车的数目是因人而异的,需要在查重前对代码使用clang format进行格式化,消除这些差异,并将注释语句删掉。而针对不同的语言,对于括弧“{}”的使用习惯也不同,如C、C++中,括弧的习惯是:
    void Func()
    {

    }
    而在java和一些语言中更适用于这种写法:
    void Func(){

    }
    因此括弧会影响查重,可以用方法将其去除或者在对比时无视,消除差异。
    其次,匹配规则是,当S1与S2字符串进行匹配后,S2不再与其他字符串进行匹配。如下图,当A.cpp中有字符串与B.cpp的字符串匹配成功后,将B.cpp的字符串对应的行标记,此后便不与之匹配。

    b) LCS实现
    LCS的基本实现思想是,取两个字符串的字符一一比对,若两者相同则令S[i][j] = S[i][j] + 1,否则S[i][j] = max(S[i-1][j], S[i][j-1]),这也是符合LCS的推导公式的。而得到最长相同子串的方法是通过数据结构的栈实现的,因为一般的实现会记录字符的方向,而输出字符串是要从S矩阵的右下角逆序输出,因此很契合栈的结构,其规则是:若S1[i] = S2[j],将字符入栈,否则对比S[i][j-1]和S[i-1][j]的大小,若前者不大于后者则遍历后者。

    c) 推导公式
    通过LCS得到的S矩阵可以求得D矩阵,若S[i][j] > r,则D[i][j] = 1,意味着当相似度超过设定的阈值时,视为两串相似。

    d) 实验结果
    通过使用LCS算法,并将r设为0.88的实验结果如下,可以发现对于A0,B0文件只能查出头文件,而对于A1,B1文件效果更不好,因此我们需要一种更好识别文本相似度的算法。

  2. 解决变量代换问题
    通过网上查阅资料,学习到了两种在文本相似度分析中十分常用的算法,它们思想相似,因此统称为字面距离。
    a) 字面距离
    i. Levenshtein距离
    Levenshtein距离(下文简称LD),中文译为莱文斯坦距离,它的核心思想是通过两个字符串之间的转换次数来判断两者的相似度。
    首先理解一下其转换次数的定义,例如将kitten变成sitting,首先要将头字母k替换为s,再将e替换为i,最后在尾部加上字母g,因此编辑距离为3。

    而如何求两个字符串的编辑距离,其算法思想与LCS的有着异曲同工之妙,它也是通过动态规划的思想实现的。因此首先我们需要得到当字符串的长度缩小对应的LD与原字符串的LD的关系。
    设两个字符串为X = (x1,x2…xi) , i = 1~m、Y = (y1,y2…yj) , j = 1~n,当字符串的长度都-1时:
    我们需要讨论最后一个字母是否相同:当字母相同时,去除该字母并不会对原有的LD产生影响,因为该字母对于两个字符串而言是对应位置相同的字符,所以删除不会产生影响。而当字符不相同时,一定会对该字符执行转换,因此对应的则是LD – 1。

    当任意一个字符长度-1时:
    我们可以假设两个字符串相同,因此对应LD = 0,若任意删除其中一个字符,则必须再添加一个字符才能让两者相等,因此LD + 1。


    而其算法的实现也与LCS类似,通过两者字符串的字符一一比对,按照推导公式填充S矩阵,最终可以得到最小的转换次数。这里值得注意的是,对矩阵的初始化需要将[0][1j],[1i][0]按从1按升序填充,因为空串与任意非空串的LD即是该串的长度。

    实验结果如下,同样是针对A0,B0和A1,B1进行分析,通过Levenshtein距离可以在变量名替换的情况下找出两者的相似度,效果提高明显。


    ii. Jaro-Winkle距离
    Jaro-Winkle距离(下文简称LWD)与Levenshtein距离的思想十分相似,也是通过两个祖父穿的换位数来分析两者的相似度。其原理很简单,只通过一个公式就可以实现:

    Jaro距离公式
    首先需要解释一下公式中的变量,m代表匹配数目,其与LCS中的相同子字符串的原理相同,例如create和trace中相同的是r,a,t;t代表换为数目,与Levenshtein距离的转换距离类似。而算法实现也很简单,只需按照公式对s矩阵进行填充即可。
    实验结果如下,同样是针对A0,B0和A1,B1进行分析,通过Jaro-Winkle距离可以在变量名替换的情况下找出两者的相似度,效果提高明显,不过比Levenshtein距离差一点。


    iii. 极端情况
    按照文本相似的算法思想,理论上当变量名替换的长度和字符相差很大时,效果会很差,因此做了额外的测试,将其中一个文件中的变量名进行魔改,而其他结构、顺序完全不变,理应是一个完全抄袭的结果,以此测试算法的功能。

    观察实验结果我们可以发现,对于魔改的情况三种算法都无法有效解决,因此其对于变量替换的识别是有局限的,需要实现一种功能来消除变量名长度等各种因素的影响。

b) 正则化截取字符串
i. 正则化表达式
正则化表达式是指一种字符串匹配的模式,检测其中是否含有某种符合特定条件的子串。例如:
因此正则化表达式特别适用于找到变量名的位置并将其替换掉。

ii. 规则
而使用的方法也很简单,首先用正则化找到变量名的位置,并按顺序用a,b,c…这样简单的字符去替换,这样就可以达到消除变量名的影响,并可以通过问题看本质,直接对比两个字符串之间的结构。
iii. 实验结果
可以发现,使用正则化是可以解决极端情况的,对于变量名替换的情况可以完全解决和识别出来。

c) 算法汇总
如下表格所示,不论是对于普通的抄袭情况(A0,B0;A1,B1),Jaro距离和levenshtein距离都比LCS算法要好,不过三种算法在极端的变量名替换的情况下效果都比较差。

d) 算法缺陷
从上述实验可以发现,LCS无法准确地对比变量名更换的情况,查重能力较弱,而字面距离的算法对于极端的变量名替换的情况效果也不佳,正则化截取变量名的操作虽然可以解决上述问题,但是由于截取的规则是,除去字符串当中所有不是变量名的内容(去除String,int,for等),剩下的则是变量名,而当引入第三方库时,则无法正确截取。

代码查重——LCS、Levenshtein距离、Jaro-Whinkle距离和变量代换相关推荐

  1. 毕业论文html代码查重吗,「毕业之家」“抄”一篇毕业论文,会被学校查重出来吗?...

    大家好,我是毕业之家小毕同学.后续会持续为大家更新毕业论文写作.修改.降重,记得关注哟. 毕业论文一直是毕业生的"老大难".尤其是本科生,其实在大学四年的培养计划里真正涉及到论文写 ...

  2. Android内存优化之图片查重

    本文将图片重复分为两种类型: 1.APP运行时加载了多个相同的图片对象,造成了内存浪费 2.APK包中存在多个相同的图片文件,影响了APK包大小 下面分别进行讨论: ----------------- ...

  3. 参加数学建模比赛如何降低论文查重率?

    在参加数学建模比赛中,写作是很重要的一部分,引用参考文献并不代表可以直接进行复制粘贴,改编也并不代表瞎编,一定要确保原意没错.那么在两者之间的权衡需要把握好度量,需要掌握基本的技巧以达到降低查重率的目 ...

  4. 毕业设计基于Springboot框架作业查重系统2.0版本

    作业查重系统2.0版本 文章目录 作业查重系统2.0版本 前言 一.摘要 二.相关技术 1.系统框架 2.查重功能简介 3.相似度检测算法简介 4.系统功能架构图 三.系统功能运行图 1.登录 2.学 ...

  5. 降低知网查重最有效的方法,至少降低10%

    本博客主要介绍的是关于计算机专业(主要是以软件设计专业为主),在知网查重如何降低查重率的一些介绍,以及降低重复率的方法. 很多人觉得知网查重很严格,但是事实上却并不是如此.阅读完本文,至少能够让你的论 ...

  6. 【NLP】Python实例:基于文本相似度对申报项目进行查重设计

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  7. 【代码模板】simHash算法文本查重(golang代码实现)

    ps: 供自己以后参考以及供了解simhash算法的人看 本代码针对通用文本查重,故所有分词的权重均为1 由于没有安装分词器,所以目前只能对英文句子进行相似度检测 代码只提供一个大致思路,没有做进一步 ...

  8. 计算代码重复率_了解了知网大学生论文查重原理,重复率想高于6%都难!

    大家好,我是毕业之家小毕同学.后续会持续为大家更新毕业论文写作.修改.降重,记得关注哟. 每年的毕业季,相信大家面临论文查重都会头疼.想到这,作者真想拉最初设计查重系统的人聊一聊:就算长得帅,也不能这 ...

  9. 【Python代码】文件查重(01)-简易版

    文章概述 [说明] 文章后面附有具体实现代码: 此内容通过对比文件名查重: 还有其他方式来查重的文章: 各内容都有增强版和最终版: 功能描述 [功能] 查找一个目录里的所有同名文件\目录,并以控制台的 ...

  10. 计算机毕业设计(论文+代码+数据库+查重)

    论文部分: 一. 基于JavaEE的婚纱摄影平台完整版的设计与实现 摘要 当下,科技在不断创新发展,科学技术实力不断提升,国民经济实力普遍提高,人们开始向往追求休闲化娱乐,以及互联网信息平台带给人们更 ...

最新文章

  1. DOM Node Element Attr 的联系与区别汇总
  2. LCCL网络:相互指导博弈来提升目标检测精度(附源代码)
  3. python格式规范的要求_python模块规定的格式,按照这样写,最规范
  4. C++11特性(模板类 initializer_list)
  5. hadoop(9)--MapReduce入门WordCount
  6. 对RESTful Web API的理解与设计思路
  7. 传统排插即将淘汰,品胜智能排插率先符合新国标
  8. 你好,C++(34)有一只叫做多利的羊 6.2.4 拷贝构造函数
  9. php软删除代码,PHP laeavel软删除以及软删除还原 易错点
  10. 【LeetCode笔记】160. 相交链表(Java、链表)
  11. Java 中子类是否只继承父类的非私有变量和方法?
  12. C++中内存泄漏的检测
  13. 银河水滴打响步态识别商用第一枪!3大产品1.35亿订单,工业视觉平台免费开放...
  14. Apache HttpClient 客户端使用详解
  15. 动态服务器值 回放报错 没有关联到_LR之关联
  16. TC397 MCMCAN
  17. 解绑数字身份,解锁新玩法与构建方式(下)
  18. 一个初创企业的“生还”记录
  19. 土库曼人纳德沙为什么选择波斯一方与奥斯曼人作战?
  20. Solana之旅1:Solana是什么

热门文章

  1. 《Learning_object_interactions_and_descriptions_for_sematic_image》论文阅读
  2. 海马玩模拟器无法链接问题处理
  3. 威金蠕虫(网吧杀手)肆虐互联网 九千用户十余企业遭攻击
  4. abs函数的使用方法 oracle,abs函数什么意思oracle
  5. uc手机浏览器 手机模拟_移动端页面调试工具——UC浏览器开发者版
  6. 滤波器测试系统|矢量网络分析仪滤波器测试软件NSAT-1000
  7. 微型计算机的主机常用部件,组成微型机主机的部件是
  8. 电子通讯录(数据库版存储)
  9. 2021年中国企业信息归档(EIA)市场趋势报告、技术动态创新及2027年市场预测
  10. 央央家政:住家育儿嫂和月嫂的工作内容明细