CN112925874B - 基于案例标记的相似代码搜索方法及系统 - Google Patents
基于案例标记的相似代码搜索方法及系统 Download PDFInfo
- Publication number
- CN112925874B CN112925874B CN202110214970.1A CN202110214970A CN112925874B CN 112925874 B CN112925874 B CN 112925874B CN 202110214970 A CN202110214970 A CN 202110214970A CN 112925874 B CN112925874 B CN 112925874B
- Authority
- CN
- China
- Prior art keywords
- code
- case
- symbols
- line
- code block
- 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
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/31—Indexing; Data structures therefor; Storage structures
- G06F16/316—Indexing structures
- G06F16/325—Hash tables
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/33—Querying
- G06F16/3331—Query processing
- G06F16/334—Query execution
- G06F16/3344—Query execution using natural language analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/22—Matching criteria, e.g. proximity measures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/10—Text processing
- G06F40/12—Use of codes for handling textual entities
- G06F40/151—Transformation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Artificial Intelligence (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Databases & Information Systems (AREA)
- Evolutionary Computation (AREA)
- Evolutionary Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Bioinformatics & Computational Biology (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Audiology, Speech & Language Pathology (AREA)
- General Health & Medical Sciences (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于案例标记的相似代码搜索方法及系统,涉及代码搜索技术领域。该方法包括:获取待搜索的代码案例;对代码案例进行词性分析,得到形式代码;根据预设的加权规则对形式代码的符号进行加权;计算加权后形式代码的每一行的哈希值,在预设的哈希索引中定位查找出具有相同行的代码块编号,加入备选代码块列表;根据预设相似度计算规则计算待搜索的代码案例与备选代码块列表中代码块的相似度,据此得到搜索结果。本发明适用于相似代码的精确搜索,对代码文本进行了不同权重的处理,保留了重要的信息,略去不重要的信息,使得搜索结果更加精准,再通过预设的哈希索引进行搜索,提高了搜索的效率。
Description
技术领域
本发明涉及代码搜索技术领域,尤其涉及基于案例标记的相似代码搜索方法及系统。
背景技术
在软件开发和维护的过程中,程序员经常需要搜索相关代码示例。现有的开源代码库代码丰富,软件开发人员和维护人员可以通过代码搜索以达到重用代码、修改bug、提高开发效率和维护代码质量等目的。
然而,目前的代码搜索方式主要是两种,一种是输入自然语言描述搜索相关功能代码,另外一种是输入代码搜索类似代码。对于输入自然语言功能描述的代码搜索方法,如何将自然语言准确地进行转换仍然是一个较难的问题,导致目前技术难以实现精准搜索。
而对于输入代码搜索文本类似代码的方法,目前,主要是利用克隆检测功能去搜索与输入代码存在高相似度的代码,或者使用爬虫和搜索技术去收集源代码和相关的技术信息。虽然这两种方式能够搜索到的代码与输入代码在文本上相似度非常高,但是很容易遗漏那些语句上有一定差异的代码,导致遗漏搜索结果,使搜索精度不够高。
发明内容
本发明所要解决的技术问题是针对现有技术的不足,提供一种基于案例标记的相似代码搜索方法及系统。
本发明解决上述技术问题的技术方案如下:
一种基于案例标记的相似代码搜索方法,包括:
获取待搜索的代码案例,所述代码案例中包括被标记的代码片段;
对所述代码案例进行词性分析,将所述代码案例中的关键词转换为预设符号,得到形式代码;
根据预设的加权规则对所述形式代码的符号进行加权;
计算加权后所述形式代码的每一行的哈希值,在预设的哈希索引中定位查找出具有相同行的代码块编号,将所述代码块编号对应的代码块加入备选代码块列表;
根据预设相似度计算规则计算所述待搜索的代码案例与所述备选代码块列表中代码块的相似度,将相似度大于预设阈值的代码块作为搜索结果。
本发明解决上述技术问题的另一种技术方案如下:
一种基于案例标记的相似代码搜索系统,包括:
获取单元,用于获取待搜索的代码案例,所述代码案例中包括被标记的代码片段;
转换单元,用于对所述代码案例进行词性分析,将所述代码案例中的关键词转换为预设符号,得到形式代码;
加权单元,用于根据预设的加权规则对所述形式代码的符号进行加权;
查询单元,用于计算加权后所述形式代码的每一行的哈希值,在预设的哈希索引中定位查找出具有相同行的代码块编号,将所述代码块编号对应的代码块加入备选代码块列表;
匹配单元,用于根据预设相似度计算规则计算所述待搜索的代码案例与所述备选代码块列表中代码块的相似度,将相似度大于预设阈值的代码块作为搜索结果。
本发明解决上述技术问题的另一种技术方案如下:
一种存储介质,所述存储介质中存储有指令,当计算机读取所述指令时,使所述计算机执行如上述技术方案所述的基于案例标记的相似代码搜索方法。
一种基于案例标记的相似代码搜索装置,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序,实现如上述技术方案所述的基于案例标记的相似代码搜索方法。
本发明的有益效果是:本发明适用于相似代码的精确搜索,通过对代码进行词性分析和统一符号转换,能够使代码便于搜索,再对代码文本进行了不同权重的处理,保留了重要的信息,略去不重要的信息,使得搜索结果更加精准,再通过预设的哈希索引进行搜索,提高了搜索的效率。
本发明附加的方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明实践了解到。
附图说明
图1为本发明基于案例标记的相似代码搜索方法的实施例提供的流程示意图;
图2为本发明基于案例标记的相似代码搜索方法的其他实施例提供的源代码示意图;
图3为本发明基于案例标记的相似代码搜索方法的其他实施例提供的从源代码提取出的代码块示意图;
图4为本发明基于案例标记的相似代码搜索方法的其他实施例提供的输入的标记代码序列及词法分析后对应的符号示意图;
图5为本发明基于案例标记的相似代码搜索方法的其他实施例提供的权重分配示意图;
图6a为本发明基于案例标记的相似代码搜索方法的其他实施例提供的源代码词法分析后对应符号的示意图;
图6b为本发明基于案例标记的相似代码搜索方法的其他实施例提供的源代码词法分析后对应符号的权重标记的示意图;
图7a为本发明基于案例标记的相似代码搜索方法的其他实施例提供的输入的代码案例示意图;
图7b为本发明基于案例标记的相似代码搜索方法的其他实施例提供的针对输入的代码案例搜索出的相似代码示意图;
图8为本发明基于案例标记的相似代码搜索系统的实施例提供的结构框架示意图。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实施例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,为本发明基于案例标记的相似代码搜索方法的实施例提供的流程示意图,该相似代码搜索方法包括:
S1,获取待搜索的代码案例,代码案例中包括被标记的代码片段;
应理解,为了提高代码搜索的准确性,被标记的代码片段通常是关键代码,关键代码可以人为设定,例如,通常的格式如括号等,可以认为不是关键代码,又例如,对于for、if等逻辑连接词,可以认为是关键代码,从而进行标记。
如图2所示,提供了一种示例性的源代码示意图。
S2,对代码案例进行词性分析,将代码案例中的关键词转换为预设符号,得到形式代码;
需要说明的是,符号的具体形式可以根据实际需求设置,例如,可以将代码中的变量名和函数名都转换成“id”,“id”就是符号。
可选地,可以使用Flex工具进行词法分析,将源代码中的关键词分别映射为相应的符号,通过词法解析器,可以将代码格式进行规范化。
通过将变量名、函数名以及代码格式进行统一化,以消除这些因素可能带来的影响。
优选地,具体解析过程中,可以删除代码块中的注释、空格和空行,以消除注释以及空格空行引起的代码差异,从而进一步提高搜索的准确度。
例如,如图4所示,提供了一种示例性的代码词性分析示意图,以“for”和“if”为例,“for”经过转换得到的符号可以为“FOR”,“if”经过转换得到的符号可以为“IF”。
按照上述示例,可以对全部的代码进行转换,如图6a所示,给出了一种示例性的将图3中的源代码进行词性分析后得到的符号示意图,例如,“for”转为为“FOR”,“(”转为为“LP”,“)”转为为“RP”,“{”转为为“LB”,“}”转为为“RB”,“for”转为为“FOR”,“int”转换为“INT”,不再一一赘述。
S3,根据预设的加权规则对形式代码的符号进行加权;
需要说明的是,加权规则可以根据实际需求设置,例如,对于被标记的代码片段,通常为比较重要的代码,那么可以给被标记的代码片段赋予较高的权重,对于其余未被标记的代码,可以根据其符号的类型的重要程度分别赋予不同的权重,如图5所示,给出了一种示例性的权重分配示意图,图中权重的取值范围设定为1-10之间的整数,数值越大则权重越高。
例如,对于“FOR”和“IF”这种比较重要的逻辑连接词的符号,可以赋予权重9,仅次于被标记的代码片段的权重10,对于“id”这种对应于变量名和函数名的符号,可以赋予权重1,表示较低的权重。
如图6b所示,给出了一种示例性的加权结果示意图,按照图5分配的权重对符号进行加权后,各个符号如图6a所示,加权结果如图6b所示。
S4,计算加权后形式代码的每一行的哈希值,在预设的哈希索引中定位查找出具有相同行的代码块编号,将代码块编号对应的代码块加入备选代码块列表;
可选地,可以使用Murmurhash哈希函数对单行符号进行哈希计算得到相应的哈希值,用该哈希值作为查询关键字在哈希索引查找出具有相同哈希值行的代码块编号,并将该编号加入候选代码块列表。扫描完全部代码行后,候选代码块列表构建则完成。
S5,根据预设相似度计算规则计算待搜索的代码案例与备选代码块列表中代码块的相似度,将相似度大于预设阈值的代码块作为搜索结果。
需要说明的是,预设阈值可以根据实际需求设置。例如,假设经过比较,得到到两段代码的相似行数m,与案例代码的行数n相比得到相似度为m/n,若相似度大于一定阈值d,则认为对应的源代码块与案例代码相似,输出为搜索结果。
如图7a所示,给出了一种示例性输入的代码案例示意图,经过本实施例公开的搜索方法进行处理,得到的结果如图7b所示,从结果可以看出,虽然图7a和图7b的代码形式相差很大,但是其实质功能相同,如果采用现有技术进行搜索,则会遗漏这种搜索结果,导致搜索效果差。
本实施例适用于相似代码的精确搜索,通过对代码进行词性分析和统一符号转换,能够使代码便于搜索,再对代码文本进行了不同权重的处理,保留了重要的信息,略去不重要的信息,使得搜索结果更加精准,再通过预设的哈希索引进行搜索,提高了搜索的效率。
可选地,在一些可能的实施方式中,获取待搜索的代码案例之前,还包括:
建立哈希索引,哈希索引的键为单行代码关键词的符号的哈希值,哈希索引的值为单行代码对应的代码块编号。
可选地,在一些可能的实施方式中,建立哈希索引,具体包括:
获取预设代码库内的源代码,对源代码进行分析和切分得到函数代码块集合;
分别对函数代码块集合中的每个代码块进行词法分析,将全部代码块中的关键词映射为预设符号,得到形式代码集合;
以形式代码集合中的单行符号的哈希值为键,对应的代码块编号为值构建哈希索引。
例如,假设确定好代码库,给定搜索代码库的目录后,调用现有代码解析工具TXL,对代码库内全部源代码提取出函数代码块。
以图2为例,假设图2为代码库的源代码,那么由源代码提取出的函数代码块格式如图3所示,可以为:每个<source></source>标签表示一个代码块,其中第一行以<source>开头,保存了该代码块在源文件中的路径、文件名,在源文件中的起、止行号;下一行开始给出完整的格式标准化后(去除了空行和注释)的代码块源码;以</source>为该代码块的结尾。
对于函数代码块集合中的每个代码块进行词法分析,可以采用与上述实施例相同的方式,在此不再赘述。
然后扫描词法分析后的代码库的每一个代码块,按照源代码所在的行连接该行全部的符号的字符串,为了加速查询且保证查询时的低碰撞率,可以使用Murmurhash哈希函数对单行符号进行哈希计算。然后以<单行符号的哈希值,代码块编号>为键值对插入哈希表进行索引。扫描完全部代码块后,哈希表索引构建则完成。
可选地,在一些可能的实施方式中,根据预设的加权规则对形式代码的符号进行加权,具体包括:
对被标记的代码片段转换得到的符号赋予最高权重,对未被标记的代码转换得到的符号,按照预先规定的符号类型赋予不同的权重。
例如,假设最高权重为10,那么如图5所示,可以对被标记的代码片段转换得到的符号赋予最高权重10,对于其余未被标记的代码转换得到的符号,可以根据重要程度赋予权重1~9。
通过词法分析统一化代码表达,使用基于符号及权重表征代码块,保留了重要的信息,略去不重要的信息,使得搜索结果更加精准。
可选地,在一些可能的实施方式中,根据预设相似度计算规则计算待搜索的代码案例与备选代码块列表中代码块的相似度,具体包括:
根据最长公共子序列算法对备选代码块列表中的每个代码块与待搜索的代码案例的相似度进行计算,得到备选代码块列表中的每个代码块与待搜索的代码案例的相似度。
可选地,在一些可能的实施方式中,根据最长公共子序列算法对备选代码块列表中的每个代码块与待搜索的代码案例的相似度进行计算,具体包括:
以行为单位,分别将待搜索的代码案例与备选代码块列表中的每个代码块逐一比较,将代码块中与待搜索的代码案例的相似代码行作为最长公共子序列算法中的等同元素,使用最长公共子序列算法进行相似度计算;
相似代码行由预设比较规则确定。
可选地,在一些可能的实施方式中,根据以下方式确定相似代码行:
条件一:计算两行代码的符号数目的比值,将符号数目相对较小的一方作为分子,另一方作为分母,要求比值大于或等于第一阈值;
条件二:计算两行代码的符号的最长公共子序列,并分别得到最长公共子序列的符号的权重之和w1,以及待搜索的代码案例的对应的代码行的符号的权重之和w2,要求w1/w2大于或等于第二阈值;
条件三:若待比较的代码案例包含被标记的关键词,则计算关键词在符号的最长公共子序列中出现的个数n1,得到符号的最长公共子序列中的关键词的数量n1与对应行代码包含的全部关键符号的总数量n2之比,要求n1/n2大于或等于第三阈值;
若代码块中的目标代码行与待搜索的代码案例中对应的代码行同时满足条件一、条件二和条件三,则目标代码行为相似代码行。
需要说明的是,最长公共子序列算法中判断两个序列是否相似是通过判断元素是否等同实现的,即代码是否相同,这也是现有技术常采用的方案,然而对于那些实际执行的功能或实质相同但具体形式不同的代码,采用最长公共子序列算法则难以实现精准的匹配,本申请通过将最长公共子序列算法中的等同元素判断替换为通过以上三个条件进行代码的相似性判断,即使代码的具体形式可能不同,但是只要包含的符号数目比值、符号的最长公共子序列权重比值和标记符号数目比值符合要求,那么就能够认为两行代码是高度相似的,将这种相似的代码替换为等同元素进行最长公共子序列的相似度计算,能够提高提高代码的搜索准确度。
应理解,为了在允许单行符号一定的细微差异性的前提下判断待搜索代码与候选代码的相似性,需要选取合适的粒度来进行比较。若选取单个符号为比较粒度,去计算两段代码的符号的匹配程度,会存在符号序列长度长,时间复杂度较高的问题,除此之外,因为符号的种类有限,会造成一定的误配,降低比较的准确率。
若选取单行符号为比较粒度,由于单行符号所包含的信息量较大,一旦一行代码中有细微的修改,都会导致这一行无法严格匹配上,造成回收率的降低。
因此,本发明在对单行代码进行匹配时,不是仅仅简单匹配单行的哈希值或者符号序列是否相同,而是从以下三个维度进行比较:
1)计算两行代码的符号数目的比值,将符号数目相对较小的一方作为分子,另一方作为分母,要求比值大于或等于阈值a,若比值小于阈值a,则认为两行代码长度相差过大,不是相似代码;
例如,假设某代码案例的A行代码共有5个符号,而备选代码块列表中的第一个代码块的A1行代码共有4个符号,第二个代码块的A2行代码共有20个符号,那么假设阈值a为0.5,那么经过比较,A行代码与A1行代码的符号数目比值为4/5,大于阈值a,可以认为A行代码与A1行代码是相似代码;A行代码与A2行代码的符号数目比值为5/20,小于阈值a,可以认为A行代码与A1行代码不是相似代码。
2)以符号为单位,计算两行代码的符号的最长公共子序列,并分别得到最长公共子序列及对应的代码案例的代码行的符号的权重之和w1和w2,若w1/w2低于阈值b,则认为两行符号序列的差异过大;
例如,假设某代码案例的A行代码共有5个符号,分别是“abcde”,假设权重依次是21453,而备选代码块列表中的第一个代码块的A1行代码共有6个符号,分别是“abcdog”,那么A行代码与A1行代码的最长公共子序列为“abcd”。
那么最长公共子序列“abcd”的权重之和w1是:2+1+4+5=12,而代码案例的A行代码“abcde”的权重之和w2是:2+1+4+5+3=15,二者之比为12/15,假设阈值b为0.5,那么则认为代码块的A1行代码符合要求。
3)若待比较的代码案例包含被标记的关键符号,则计算关键符号在最长公共子序列中出现的个数n1,据此得到最长公共子序列中的关键符号数量n1与该行代码包含的全部关键符号的总数量n2之比,若n1/n2小于阈值c,则认为源代码该行缺失了待查询的关键信息。
例如,假设某代码案例的A行代码共有5个关键词被标记了,那么在第2)步计算A行代码与某备选代码的最长公共子序列时,同时计算A行代码中的5个关键词有多少个被匹配到最长公共子序列中了,假设有3个关键词被匹配到最长公共子序列中,假设阈值c为0.8,那么3/5显然小于阈值c,因此认为匹配不成功。
若以上三个比值都达到了一定阈值,则说明代码案例行与待检测的代码行长度相似,总权重相似且关键符号相似,则可以认为它们高度相似,可以被模糊匹配上,不仅保证了匹配的准确率,也降低了匹配的难度,解决了单行匹配时可能存在的回收率低的问题。
基于以上设定,对候选列表里的代码块,逐一与待搜索代码案例,以行为单位,采用最长公共子序列算法进行相似度计算,得到的最长公共子序列的长度,即为两段代码的相似行数。
将相似度大于一定阈值的代码块输出为相似代码搜索结果。
需要说明的是,最长公共子序列指的是使用最长公共子序列算法,求出两行代码具有相同符号的最长子序列,最长公共子序列算法为现有算法,在此不再赘述。
可以理解,在一些实施例中,可以包含如上述各实施方式中的部分或全部。
如图8所示,为本发明基于案例标记的相似代码搜索系统的实施例提供的结构框架示意图,该相似代码搜索系统包括:
获取单元1,用于获取待搜索的代码案例,代码案例中包括被标记的代码片段;
转换单元2,用于对代码案例进行词性分析,将代码案例中的关键词转换为预设符号,得到形式代码;
加权单元3,用于根据预设的加权规则对形式代码的符号进行加权;
查询单元4,用于计算加权后形式代码的每一行的哈希值,在预设的哈希索引中定位查找出具有相同行的代码块编号,将代码块编号对应的代码块加入备选代码块列表;
匹配单元5,用于根据预设相似度计算规则计算待搜索的代码案例与备选代码块列表中代码块的相似度,将相似度大于预设阈值的代码块作为搜索结果。
本实施例适用于相似代码的精确搜索,通过对代码进行词性分析和统一符号转换,能够使代码便于搜索,再对代码文本进行了不同权重的处理,保留了重要的信息,略去不重要的信息,使得搜索结果更加精准,再通过预设的哈希索引进行搜索,提高了搜索的效率。
可选地,在一些可能的实施方式中,还包括:
建模单元,用于建立哈希索引,哈希索引的键为单行代码关键词的符号的哈希值,哈希索引的值为单行代码对应的代码块编号。
可选地,在一些可能的实施方式中,建模单元具体用于获取预设代码库内的源代码,对源代码进行分析和切分得到函数代码块集合;
分别对函数代码块集合中的每个代码块进行词法分析,将全部代码块中的关键词映射为预设符号,得到形式代码集合;
以形式代码集合中的单行符号的哈希值为键,对应的代码块编号为值构建哈希索引。
可选地,在一些可能的实施方式中,加权单元3具体用于对被标记的代码片段转换得到的符号赋予最高权重,对未被标记的代码转换得到的符号,按照预先规定的符号类型赋予不同的权重。
可选地,在一些可能的实施方式中,匹配单元5具体用于根据最长公共子序列算法对备选代码块列表中的每个代码块与待搜索的代码案例的相似度进行计算,得到备选代码块列表中的每个代码块与待搜索的代码案例的相似度。
可选地,在一些可能的实施方式中,匹配单元5具体用于以行为单位,分别将待搜索的代码案例与备选代码块列表中的每个代码块逐一比较,将代码块中与待搜索的代码案例的相似代码行作为最长公共子序列算法中的等同元素,使用最长公共子序列算法进行相似度计算;
相似代码行由预设比较规则确定。
可选地,在一些可能的实施方式中,匹配单元5具体用于根据以下方式确定相似代码行:
条件一:计算两行代码的符号数目的比值,将符号数目相对较小的一方作为分子,另一方作为分母,要求比值大于或等于第一阈值;
条件二:计算两行代码的符号的最长公共子序列,并分别得到最长公共子序列的符号的权重之和w1,以及待搜索的代码案例的对应的代码行的符号的权重之和w2,要求w1/w2大于或等于第二阈值;
条件三:若待比较的代码案例包含被标记的关键词,则计算关键词在符号的最长公共子序列中出现的个数n1,得到符号的最长公共子序列中的关键词的数量n1与对应行代码包含的全部关键符号的总数量n2之比,要求n1/n2大于或等于第三阈值;
若代码块中的目标代码行与待搜索的代码案例中对应的代码行同时满足条件一、条件二和条件三,则目标代码行为相似代码行。
可以理解,在一些实施例中,可以包含如上述各实施方式中的部分或全部。
需要说明的是,上述各实施方式是与在先方法实施例对应的产品实施例,对于产品实施方式的说明可以参考上述各方法实施方式中的对应说明,在此不再赘述。
本发明还提供一种存储介质,存储介质中存储有指令,当计算机读取指令时,使计算机执行如上述任意实施方式公开的基于案例标记的相似代码搜索方法。
本发明还提供一种基于案例标记的相似代码搜索装置,包括:
存储器,用于存储计算机程序;
处理器,用于执行计算机程序,实现如上述任意实施方式公开的基于案例标记的相似代码搜索方法。
读者应理解,在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的方法实施例仅仅是示意性的,例如,步骤的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个步骤可以结合或者可以集成到另一个步骤,或一些特征可以忽略,或不执行。
上述方法如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (7)
1.一种基于案例标记的相似代码搜索方法,其特征在于,包括:
获取待搜索的代码案例,所述代码案例中包括被标记的代码片段;
对所述代码案例进行词性分析,将所述代码案例中的关键词转换为预设符号,得到形式代码;
根据预设的加权规则对所述形式代码的符号进行加权;
计算加权后所述形式代码的每一行的哈希值,在预设的哈希索引中定位查找出具有相同行的代码块编号,将所述代码块编号对应的代码块加入备选代码块列表;
根据预设相似度计算规则计算所述待搜索的代码案例与所述备选代码块列表中代码块的相似度,将相似度大于预设阈值的代码块作为搜索结果;
所述根据预设相似度计算规则计算所述待搜索的代码案例与所述备选代码块列表中代码块的相似度,具体包括:
根据最长公共子序列算法对所述备选代码块列表中的每个代码块与所述待搜索的代码案例的相似度进行计算,得到所述备选代码块列表中的每个代码块与所述待搜索的代码案例的相似度;
所述根据最长公共子序列算法对所述备选代码块列表中的每个代码块与所述待搜索的代码案例的相似度进行计算,具体包括:
以行为单位,分别将所述待搜索的代码案例与所述备选代码块列表中的每个代码块逐一比较,将所述代码块中与所述待搜索的代码案例的相似代码行作为最长公共子序列算法中的等同元素,使用最长公共子序列算法进行相似度计算;
所述相似代码行由预设比较规则确定;
根据以下方式确定所述相似代码行:
条件一:计算两行代码的符号数目的比值,将符号数目相对较小的一方作为分子,另一方作为分母,要求比值大于或等于第一阈值;
条件二:计算两行代码的符号的最长公共子序列,并分别得到所述最长公共子序列的符号的权重之和w1,以及所述待搜索的代码案例的对应的代码行的符号的权重之和w2,要求w1/w2大于或等于第二阈值;
条件三:若待比较的代码案例包含被标记的关键词,则计算关键词在所述符号的最长公共子序列中出现的个数n1,得到所述符号的最长公共子序列中的关键词的数量n1与对应行代码包含的全部关键符号的总数量n2之比,要求n1/n2大于或等于第三阈值;
若所述代码块中的目标代码行与所述待搜索的代码案例中对应的代码行同时满足所述条件一、所述条件二和所述条件三,则所述目标代码行为相似代码行。
2.根据权利要求1所述的基于案例标记的相似代码搜索方法,其特征在于,获取待搜索的代码案例之前,还包括:
建立哈希索引,所述哈希索引的键为单行代码关键词的符号的哈希值,所述哈希索引的值为所述单行代码对应的代码块编号。
3.根据权利要求2所述的基于案例标记的相似代码搜索方法,其特征在于,建立哈希索引,具体包括:
获取预设代码库内的源代码,对所述源代码进行分析和切分得到函数代码块集合;
分别对所述函数代码块集合中的每个代码块进行词法分析,将全部所述代码块中的关键词映射为预设符号,得到形式代码集合;
以所述形式代码集合中的单行符号的哈希值为键,对应的代码块编号为值构建哈希索引。
4.根据权利要求1所述的基于案例标记的相似代码搜索方法,其特征在于,根据预设的加权规则对所述形式代码的符号进行加权,具体包括:
对所述被标记的代码片段转换得到的符号赋予最高权重,对未被标记的代码转换得到的符号,按照预先规定的符号类型赋予不同的权重。
5.一种基于案例标记的相似代码搜索系统,其特征在于,包括:
获取单元,用于获取待搜索的代码案例,所述代码案例中包括被标记的代码片段;
转换单元,用于对所述代码案例进行词性分析,将所述代码案例中的关键词转换为预设符号,得到形式代码;
加权单元,用于根据预设的加权规则对所述形式代码的符号进行加权;
查询单元,用于计算加权后所述形式代码的每一行的哈希值,在预设的哈希索引中定位查找出具有相同行的代码块编号,将所述代码块编号对应的代码块加入备选代码块列表;
匹配单元,用于根据预设相似度计算规则计算所述待搜索的代码案例与所述备选代码块列表中代码块的相似度,将相似度大于预设阈值的代码块作为搜索结果;所述匹配单元具体用于:根据最长公共子序列算法对所述备选代码块列表中的每个代码块与待搜索的代码案例的相似度进行计算,得到所述备选代码块列表中的每个代码块与所述待搜索的代码案例的相似度;
所述匹配单元具体用于:以行为单位,分别将所述待搜索的代码案例与所述备选代码块列表中的每个代码块逐一比较,将所述代码块中与所述待搜索的代码案例的相似代码行作为最长公共子序列算法中的等同元素,使用最长公共子序列算法进行相似度计算;
所述相似代码行由预设比较规则确定;
所述匹配单元具体用于:根据以下方式确定所述相似代码行:
条件一:计算两行代码的符号数目的比值,将符号数目相对较小的一方作为分子,另一方作为分母,要求比值大于或等于第一阈值;
条件二:计算两行代码的符号的最长公共子序列,并分别得到所述最长公共子序列的符号的权重之和w1,以及所述待搜索的代码案例的对应的代码行的符号的权重之和w2,要求w1/w2大于或等于第二阈值;
条件三:若待比较的代码案例包含被标记的关键词,则计算关键词在所述符号的最长公共子序列中出现的个数n1,得到所述符号的最长公共子序列中的关键词的数量n1与对应行代码包含的全部关键符号的总数量n2之比,要求n1/n2大于或等于第三阈值;
若所述代码块中的目标代码行与所述待搜索的代码案例中对应的代码行同时满足所述条件一、所述条件二和所述条件三,则所述目标代码行为相似代码行。
6.一种存储介质,其特征在于,所述存储介质中存储有指令,当计算机读取所述指令时,使所述计算机执行如权利要求1至4中任一项所述的基于案例标记的相似代码搜索方法。
7.一种基于案例标记的相似代码搜索装置,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序,实现如权利要求1至4中任一项所述的基于案例标记的相似代码搜索方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110214970.1A CN112925874B (zh) | 2021-02-25 | 2021-02-25 | 基于案例标记的相似代码搜索方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110214970.1A CN112925874B (zh) | 2021-02-25 | 2021-02-25 | 基于案例标记的相似代码搜索方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112925874A CN112925874A (zh) | 2021-06-08 |
CN112925874B true CN112925874B (zh) | 2022-09-06 |
Family
ID=76172062
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110214970.1A Active CN112925874B (zh) | 2021-02-25 | 2021-02-25 | 基于案例标记的相似代码搜索方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112925874B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117940894A (zh) * | 2021-08-28 | 2024-04-26 | 华为技术有限公司 | 用于检测代码克隆的系统和方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109445834A (zh) * | 2018-10-30 | 2019-03-08 | 北京计算机技术及应用研究所 | 基于抽象语法树的程序代码相似性快速比较方法 |
CN110297891A (zh) * | 2019-04-24 | 2019-10-01 | 南京邮电大学 | 一种面向程序设计答疑系统的知识库检索方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030101182A1 (en) * | 2001-07-18 | 2003-05-29 | Omri Govrin | Method and system for smart search engine and other applications |
-
2021
- 2021-02-25 CN CN202110214970.1A patent/CN112925874B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109445834A (zh) * | 2018-10-30 | 2019-03-08 | 北京计算机技术及应用研究所 | 基于抽象语法树的程序代码相似性快速比较方法 |
CN110297891A (zh) * | 2019-04-24 | 2019-10-01 | 南京邮电大学 | 一种面向程序设计答疑系统的知识库检索方法 |
Non-Patent Citations (2)
Title |
---|
"Identifying Source Code Reuse across Repositories Using LCS-Based Source Code Similarity";Naohiro Kawamitsu等;《 2014 IEEE 14th International Working Conference on Source Code Analysis and Manipulation》;20141208;全文 * |
"基于LCS和GST算法的代码相似度分析";金恩海等;《电子技术与软件工程》;20160218;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN112925874A (zh) | 2021-06-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100356392C (zh) | 一种字符识别的后处理方法 | |
CN111488466B (zh) | 中文带标记错误语料生成方法、计算装置和存储介质 | |
US11551151B2 (en) | Automatically generating a pipeline of a new machine learning project from pipelines of existing machine learning projects stored in a corpus | |
US20110202545A1 (en) | Information extraction device and information extraction system | |
CN107862327B (zh) | 一种基于多特征的安全缺陷识别系统和方法 | |
CN109344355B (zh) | 针对网页变化的自动回归检测与块匹配自适应方法和装置 | |
CN111782892B (zh) | 基于前缀树的相似字符识别方法、设备、装置和存储介质 | |
US11403304B2 (en) | Automatically curating existing machine learning projects into a corpus adaptable for use in new machine learning projects | |
CN112579466A (zh) | 测试用例的生成方法、装置及计算机可读存储介质 | |
CN117873905B (zh) | 一种代码同源检测的方法、装置、设备及介质 | |
CN112199115A (zh) | 基于特征相似度匹配的跨Java字节码和源代码行关联方法 | |
CN114385491B (zh) | 一种基于深度学习的js转译器缺陷检测方法 | |
CN111539383A (zh) | 公式知识点识别方法及装置 | |
CN115454445A (zh) | 代码检查方法及装置、计算机可读存储介质、终端 | |
CN112925874B (zh) | 基于案例标记的相似代码搜索方法及系统 | |
EP3965024A1 (en) | Automatically labeling functional blocks in pipelines of existing machine learning projects in a corpus adaptable for use in new machine learning projects | |
CN111158973B (zh) | 一种web应用动态演化监测方法 | |
CN115544975B (zh) | 一种日志格式转换方法及设备 | |
CN116820996A (zh) | 基于人工智能的集成测试用例自动生成方法和装置 | |
CN116360794A (zh) | 数据库语言解析方法、装置、计算机设备及存储介质 | |
CN115438341A (zh) | 提取代码循环计数器的方法、装置、存储介质和电子设备 | |
CN114065762A (zh) | 一种文本信息的处理方法、装置、介质及设备 | |
Ufuktepe et al. | The relation between bug fix change patterns and change impact analysis | |
JP2009157458A (ja) | インデックス作成装置、その方法、プログラム及び記録媒体 | |
CN113722421A (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 |