CN108920361B - 一种串匹配代码相似度检测方法 - Google Patents
一种串匹配代码相似度检测方法 Download PDFInfo
- Publication number
- CN108920361B CN108920361B CN201810612296.0A CN201810612296A CN108920361B CN 108920361 B CN108920361 B CN 108920361B CN 201810612296 A CN201810612296 A CN 201810612296A CN 108920361 B CN108920361 B CN 108920361B
- Authority
- CN
- China
- Prior art keywords
- code
- similarity
- codes
- feature vector
- feature
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3616—Software analysis for verifying properties of programs using software metrics
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Collating Specific Patterns (AREA)
Abstract
本发明揭示了一种串匹配代码相似度检测方法,该方法包括如下步骤:程序代码预处理,将原始代码进行标准化处理;将得到的特征向量与待比较的代码进行按行比较,生成由二进制组成的特征值,0代表本行不包含特征向量值,1代表本行包含特征向量值;动态生成代码结构指纹;从待比较的代码中提取相同的特征向量,根据相同的特征向量查找所生成的对应结构指纹,组成代码特征的结构指纹。相似度比较;将待比较的代码的结构特征指纹通过最长公共子串匹配的方法,得到代码的结构相似度。本发明在原有的串匹配代码相似度方法检测的基础上,实现了对代码结构相似度的检测,提高了代码相似度检测的准确度。
Description
技术领域
本发明涉及一种串匹配代码相似度检测方法,涉及代码相似度检测技术领域。
背景技术
代码相似度检测技术目前主要应用于代码的抄袭检测上,是在线编程测试平台中重要的部分,其不仅可以帮助教师检测学生的编程作业抄袭情况,同时对于编程题的自动化判分也具有很好的现实意义。
对于目前高校开设的程序设计类课程,学生提交的源代码规模一般较小、结构比较简单。串匹配算法作为针对这类规模较小的源代码的相似度计算方法,在在线测试系统中有广泛的应用。
串匹配代码相似度算法通过比对源代码标准化生产的特征向量进行相似度计算,其计算代码相似度的算法过程大概如下:
1.程序代码预处理
去除提交的代码中注释、头文件、空格、换行符等影响代码特征值提取的冗余信息,并并将程序中的变量名和函数名进行标准化处理。
2.提取特征向量
根据程序语言的语法特征,利用正则表达式提取出特征向量。
3.特征向量加权
根据每个特征值在代码中的重要度对每一个特征向量进行加权处理。
4.相似度计算
通过向量空间模型中的夹角余弦法来度量两组特征向量之间的夹角大小,进而得出两份代码之间的相似度。
在上述算法中,两段代码的相似度度量公式如下:
该串匹配相似度检测方法主要是采用了属性技术法的技术理念,通过正则表达式提取出能代表出程序代码的特征向量,然后对特征向量的每一个对象进行加权处理,最后利用向量相似度度量方法对加权后的特征向量进行了相似度的计算,以比较两段代码的相似度。
但是,该方法在实际应用过程中,会遇到以下困难:
假设代码一中的代码块的出现顺序为{Block1,Block2,Block3,Block4,Block5},代码二中的代码块的出现顺序为{Block3,Block1,Block5,Block4,Block2}。
使用上述方法,两份代码计算得到的特征向量和特征向量的权值都是一样的,从而会误以为两份代码相同。
发明内容
本发明的目的就是为了解决现有技术中存在的上述问题,提出一种串匹配代码相似度检测方法。
本发明的目的将通过以下技术方案得以实现:一种串匹配代码相似度检测方法,包括如下步骤:
一种串匹配代码相似度检测方法,其包括如下步骤:
S1:程序代码预处理
将原始代码的两份待比较代码文件,依据编程语言相关的编译原理进行预处理,去除提交的代码中注释、头文件、空格或换行符影响代码特征值提取的冗余信息,并将程序中的变量名和函数名进行标准化处理。
S2:提取特征向量
将经S1步骤预处理后的代码按语法特征提取出特征向量,特征向量代表代码的结构特征;
S3:生成特征向量结构指纹
将经S2步骤得到的特征向量与两份待比较代码进行按行比较,生成由二进制组成的特征值,0代表本行不包含特征向量值,1代表本行包含特征向量值;
S4:动态生成代码特征的结构指纹
从两份待比较代码中提取相同的特征向量,根据相同的特征向量查找S3步骤中所生成的对应特征向量结构指纹,组成代码特征的结构指纹;
S5:相似度比较
S51:将两份待比较代码中共有的特征向量的代码特征的结构指纹逐一进行通过最长公共子串匹配的算法求两份代码中共有的特征向量之间的代码特征的结构指纹的相似度,
S52:然后,通过这些特征向量的代码特征的结构指纹的相似度得到两份代码的相似度。
优选地,在S1步骤中,读取给定的待比较的两份代码1与代码2源文件,按照所属编程语言的语法规则将代码1与代码2中的注释代码进行去除,然后,对于出现的连续的制表符、换行符进行缩减为一个换行符,将空格删除,最后,按所属编程语言的语法规则识别出代码中的函数名,统一以”func”开头重命名,识别出代码中的参数名,统一以”param”开头重命名。
优选地,在S2步骤中,将预处理后的代码作为输入,遍历整段代码,按照所选语言的语法规则,提取其中的特征向量。
优选地,所述S3具体包括如下步骤:
S31:从生成的特征向量中选取一个特征向量;
S31:将该特征向量与原始代码1和待比较的代码2分别进行按行比较,0代表本行不包含特征向量值,1代表本行包含特征向量值,最终生成由二进制组成的特征值序列;
S33:然后将生成的特征向量结构指纹添加到字典中。
优选地,在S51步骤中:首先通过最长字符串匹配的方法找出两份待比较代码中的最长公共字符串,通过最长公共字符串将代码分割成前后两部分,然后通过递归的方法对分割后的前后两部分进行相同的操作,最后通过公式计算得到代码特征的结构指纹的相似度,
结构指纹1与结构指纹2的相似度度量公式如下:
其中,|A|和|B|分别为代码特征的结构指纹A、B所包含的字符数,|A∩B|为代码特征的结构指纹A、B公共字符串的所含字符数。
优选地,在S52步骤中:
两份代码的相似度度量公式如下:
其中,x=(x1,x2,x3,…,xn),y=(y1,y2,y3,…yn)表示需检测的两份代码的特征向量,xi×yi表示相同特征向量的代码特征的结构指纹的相似度。
本发明技术方案的优点主要体现在:与传统的串匹配算法相比,更严谨;引入了特征向量结构指纹和代码特征的结构指纹的改变,能够检测出代码块的位置改变,从而提高相似度检测的准确性。本方法的特征向量从预处理后的代码后进行提取,在背景提出的串匹配代码相似度的基础上,增加了结构指纹相似度判断的操作,避免了背景中提及的串匹配算法普遍遇到的困难,提高了相似度检测的准确度。本发明在原有的串匹配代码相似度方法检测的基础上,实现了对代码结构相似度的检测,提高了代码相似度检测的准确度。本发明可应用于各类在线编程题测试平台的代码相似度检测系统中。
附图说明
图1为本发明的一种串匹配代码相似度检测方法的算法流程图。
具体实施方式
本发明的目的、优点和特点,将通过下面优选实施例的非限制性说明进行图示和解释。这些实施例仅是应用本发明技术方案的典型范例,凡采取等同替换或者等效变换而形成的技术方案,均落在本发明要求保护的范围之内。
本发明揭示了一种串匹配代码相似度检测方法,该方法的算法流程图如图1所示,该方法包括如下步骤:
S1:程序代码预处理
将原始代码的两份待比较代码文件,依据编程语言相关的编译原理进行预处理,去除提交的代码中注释、头文件、空格或换行符影响代码特征值提取的冗余信息,并将程序中的变量名和函数名进行标准化处理。
S2:提取特征向量
将经S1步骤预处理后的代码按语法特征提取出特征向量,特征向量代表代码的结构特征;
S3:生成特征向量结构指纹
将经S2步骤得到的特征向量与两份待比较代码进行按行比较,生成由二进制组成的特征值,0代表本行不包含特征向量值,1代表本行包含特征向量值;
S4:动态生成代码特征的结构指纹
从两份待比较代码中提取相同的特征向量,根据相同的特征向量查找S3步骤中所生成的对应特征向量结构指纹,组成代码特征的结构指纹;
S5:相似度比较
S51:将两份待比较代码中共有的特征向量的代码特征的结构指纹逐一进行通过最长公共子串匹配的算法求两份代码中共有的特征向量之间的代码特征的结构指纹的相似度,
S52:然后,通过这些特征向量的代码特征的结构指纹的相似度得到两份代码的相似度。
该方法并不仅针对某一种编程语言,此处为便于详细介绍具体实施方式,故选择两份C语言的程序代码代码1和代码2作为示例。
对待比较的代码1和待比较的代码2示例代码进行相似度检测,待比较的代码1如下式一所示:
待比较的代码2如下式二所示:
S1步骤至S 3步骤均为对两份代码独立进行处理,S4、S5步骤为将两份代码相关计算结果合并处理。
具体地,
1、程序代码预处理
将两份代码文件,依据编程语言相关的编译原理进行预处理,去除提交的代码中注释、空格、换行符等影响代码特征值提取的冗余信息,并将程序中的变量名和函数名进行标准化处理。
本步骤的目的是将原始代码进行标准化处理,去除冗余信息,以供后序提取特征向量。
读取给定的待比较的代码源文件,本例采用式一和式二的两份C语言代码源文件进行代码相似度比较。
首先,读取给定的待比较的两份代码1和代码2源文件,按照所属编程语言的语法规则将代码1和代码2中的注释代码进行去除。然后,对于出现的连续的制表符、换行符进行缩减为一个换行符,将空格删除。最后,按所属编程语言的语法规则识别出代码中的函数名,统一以”func”开头重命名,识别出代码中的参数名,统一以”param”开头重命名。
式三为预处理后的代码1,代码1经过预处理后的结果为:
式四为预处理后的代码2,代码2经过预处理后的结果为:
2、提取特征向量
根据程序语言的语法特征,利用正则表达式提取出特征向量。
本步骤的目的是从预处理后的代码中提取特征值向量,特征向量能代表代码的结构特征。
本步骤将预处理后的代码作为输入,遍历整段代码。按照所选语言的语法规则,提取其中的特征向量。
3、生成特征向量结构指纹
将特征向量与待比较的代码进行按行比较,生成由二进制组成的特征值,0代表本行不包含特征向量值,1代表本行包含特征向量值;
本步骤是将特征向量与预处理后的代码进行比较,得出能代表特征向量在代码中位置特征的结构指纹。
首先,从生成的特征向量中选取一个特征向量;其次,将该特征向量与代码1和代码2分别进行按行比较,0代表本行不包含特征向量值,1代表本行包含特征向量值,最终生成由二进制组成的特征值序列。
然后将生成的特征指纹添加到字典中。
如式五和式六所示,代码1、代码2的特征向量为根据上述方法得到的结构指纹。
式五为代码1中特征向量的结构指纹:
式五为代码2中特征向量的结构指纹:
4、动态生成代码特征的结构指纹
首先通过比对得到两份待比较代码中相同的特征向量,再根据相同的特征向量查找S3步骤所生成的对应特征向量结构指纹,组成代码特征的结构指纹。
本步骤是根据两段代码中相同的特征向量提取对应的特征向量结构指纹,用于最后的相似度计算。
5、相似度比较
将两份待比较的代码共有的特征向量的代码特征的结构指纹通过最长公共子串匹配的方法,得到两份代码的结构相似度。
首先,将代码1与代码2中代码特征的结构指纹逐一进行通过最长公共子串匹配的算法求相似度,然后,通过这些特征向量的代码特征的结构指纹的相似度得到代码的相似度。
在上述算法中,两段代码的相似度度量公式如下:
其中,x=(x1,x2,x3,…,xn),y=(y1,y2,y3,…yn)表示需检测的两份代码的特征向量,xi×yi表示相同特征向量结构指纹的相似度,称为特征向量的长度。所述步骤S5中通过最长公共子串匹配的方法的步骤具体如下:
首先通过最长字符串匹配的方法找出代码中的最长公共字符串,通过最长公共字符串将代码分割成前后两部分。然后通过递归的方法对分割后的前后两部分进行相同的操作。最后通过公式计算得到代码结构的相似度。
上述算法中,两段代码的相似度度量公式如下:
其中,|A|和|B|分别为代码特征的结构指纹A、B的所包含的字符数,|A∩B|为代码特征的结构指纹A、B公共字符串的所含字符数。
在计算程序相似度时,首先将代码进行预处理,去除冗余信息的干扰。然后从预处理后的代码提取能代表代码特征的特征向量,通过比较相同特征向量的特征向量结构指纹的相似度,得到代码结构的相似度。然后,通过这些特征向量的代码特征的结构指纹的相似度得到代码的相似度。该代码相似度检测方法可应用于在线测试领域中编程题自动判分和抄袭检测。
该方法可克服已有的串匹配相似度检测方法中没有考虑代码块位置调换情况的不足,与传统的串匹配算法相比,更严谨。
本方法的特征向量从预处理后的代码后进行提取,在背景提出的串匹配代码相似度的基础上,增加了结构指纹相似度判断的操作,避免了背景中提及的串匹配算法普遍遇到的困难,提高了相似度检测的准确度。
本方法前后主要分为预处理、特征向量提取、特征向量的结构指纹生成、代码结构指纹的构建、相似度比较五大部分。预处理是是根据所选语言的语法特征进行的,此块可以根据不同语言的特性进行实现。特征向量的提取可以根据所选语言的关键词进行提取。特征向量的结构指纹、代码结构指纹以及相似度比较与所选语言无关。故本方法可用于各种语言的相似度计算中。
本发明尚有多种实施方式,凡采用等同变换或者等效变换而形成的所有技术方案,均落在本发明的保护范围之内。
Claims (6)
1.一种串匹配代码相似度检测方法,其特征在于:包括如下步骤:
S1:程序代码预处理
将原始代码的两份待比较代码文件,依据编程语言相关的编译原理进行预处理,去除提交的代码中注释、头文件、空格或换行符影响代码特征值提取的冗余信息,并将程序中的变量名和函数名进行标准化处理;
S2:提取特征向量
将经S1步骤预处理后的代码按语法特征提取出特征向量,特征向量代表代码的结构特征;
S3:生成特征向量结构指纹
将经S2步骤得到的特征向量与两份待比较代码进行按行比较,生成由二进制组成的特征值,0代表本行不包含特征向量值,1代表本行包含特征向量值;
S4:动态生成代码特征的结构指纹
从两份待比较代码中提取相同的特征向量,根据相同的特征向量查找S3步骤中所生成的对应特征向量结构指纹,组成代码特征的结构指纹;
S5:相似度比较
S51:将两份待比较代码中共有的特征向量的代码特征的结构指纹逐一进行通过最长公共子串匹配的算法求两份代码中共有的特征向量之间的代码特征的结构指纹的相似度,
S52:然后,通过这些特征向量的代码特征的结构指纹的相似度得到两份代码的相似度。
2.根据权利要求1所述的一种串匹配代码相似度检测方法,其特征在于:在S1步骤中,读取给定的待比较的两份代码1和代码2源文件,按照所属编程语言的语法规则将代码1和代码2中的注释代码进行去除,然后,对于出现的连续的制表符、换行符进行缩减为一个换行符,将空格删除,最后,按所属编程语言的语法规则识别出代码中的函数名,统一以”func”开头重命名,识别出代码中的参数名,统一以”param”开头重命名。
3.根据权利要求1所述的一种串匹配代码相似度检测方法,其特征在于:在S2步骤中,将预处理后的代码作为输入,遍历整段代码,按照所选语言的语法规则,提取其中的特征向量。
4.根据权利要求1所述的一种串匹配代码相似度检测方法,其特征在于:所述S3具体包括如下步骤:
S31:从生成的特征向量中选取一个特征向量;
S31:将该特征向量与待比较的代码进行按行比较,0代表本行不包含特征向量值,1代表本行包含特征向量值,最终生成由二进制组成的特征值序列;
S33:然后将生成的特征向量结构指纹添加到字典中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810612296.0A CN108920361B (zh) | 2018-06-13 | 2018-06-13 | 一种串匹配代码相似度检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810612296.0A CN108920361B (zh) | 2018-06-13 | 2018-06-13 | 一种串匹配代码相似度检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108920361A CN108920361A (zh) | 2018-11-30 |
CN108920361B true CN108920361B (zh) | 2022-04-26 |
Family
ID=64420956
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810612296.0A Active CN108920361B (zh) | 2018-06-13 | 2018-06-13 | 一种串匹配代码相似度检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108920361B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111459789B (zh) * | 2019-08-28 | 2023-11-03 | 南京意博软件科技有限公司 | 一种应用程序编程接口的检测方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104407872A (zh) * | 2014-12-04 | 2015-03-11 | 北京邮电大学 | 代码克隆的检测方法 |
CN106202007A (zh) * | 2016-06-28 | 2016-12-07 | 电子科技大学 | 一种matlab程序文件相似度的评估方法 |
CN107273294A (zh) * | 2017-06-19 | 2017-10-20 | 电子科技大学 | 一种基于神经网络语言模型的重复代码检测方法 |
-
2018
- 2018-06-13 CN CN201810612296.0A patent/CN108920361B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104407872A (zh) * | 2014-12-04 | 2015-03-11 | 北京邮电大学 | 代码克隆的检测方法 |
CN106202007A (zh) * | 2016-06-28 | 2016-12-07 | 电子科技大学 | 一种matlab程序文件相似度的评估方法 |
CN107273294A (zh) * | 2017-06-19 | 2017-10-20 | 电子科技大学 | 一种基于神经网络语言模型的重复代码检测方法 |
Non-Patent Citations (2)
Title |
---|
程序代码相似度度量算法研究;邓爱萍;《计算机工程与设计》;20080930;全文 * |
面向代码相似度检测的指纹选取方法;黄柳柳等;《计算机工程与应用》;20100831;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN108920361A (zh) | 2018-11-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106485984B (zh) | 一种钢琴的智能教学方法和装置 | |
CN105244029A (zh) | 语音识别后处理方法及系统 | |
CN111368049A (zh) | 信息获取方法、装置、电子设备及计算机可读存储介质 | |
CN106815194A (zh) | 模型训练方法及装置和关键词识别方法及装置 | |
CN107193796B (zh) | 一种舆情事件检测方法及装置 | |
CN106202030B (zh) | 一种基于异构标注数据的快速序列标注方法及装置 | |
CN112149420A (zh) | 实体识别模型训练方法、威胁情报实体提取方法及装置 | |
WO2016112782A1 (zh) | 一种用户的生活圈提取方法及系统 | |
CN114647713A (zh) | 基于虚拟对抗的知识图谱问答方法、设备及存储介质 | |
CN113033204A (zh) | 信息实体抽取方法、装置、电子设备和存储介质 | |
CN111539383A (zh) | 公式知识点识别方法及装置 | |
CN108920361B (zh) | 一种串匹配代码相似度检测方法 | |
CN112966095B (zh) | 一种基于jean的软件代码推荐方法 | |
CN116503127A (zh) | 模型训练方法、检索方法及相关装置 | |
CN115063604B (zh) | 特征提取模型训练、目标重识别方法及装置 | |
Mengarelli et al. | OMR metrics and evaluation: a systematic review | |
CN115373982A (zh) | 基于人工智能的测试报告分析方法、装置、设备及介质 | |
CN112698833B (zh) | 一种基于局部和全局特征的特征依恋代码味道检测方法 | |
CN117390130A (zh) | 一种基于多模态表示的代码搜索方法 | |
CN113139379B (zh) | 信息识别方法和系统 | |
CN114021561A (zh) | 一种数学公式相似度计算方法及系统 | |
CN113836378A (zh) | 一种数据处理方法及装置 | |
CN112925961A (zh) | 一种基于企业实体的智能问答方法及装置 | |
CN111291155A (zh) | 基于文本相似度的同名小区辨别方法及系统 | |
CN116702898B (zh) | 一种基于知识表示学习的文言文知识迁移方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |