基于开源知识的代码搜索推荐装置及方法转让专利
申请号 : CN202010872148.X
文献号 : CN112051986B
文献日 : 2021-07-27
发明人 : 王璐 , 李青山 , 曹壮 , 罗文龙 , 吕文琪 , 李昊 , 张河
申请人 : 西安电子科技大学
摘要 :
权利要求 :
1.一种基于开源社区特征的代码搜索推荐装置,包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块四个模块,其中,所述代码片段生成模块,用于将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库;
所述代码特征提取模块,用于利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库;将文本特征集、主题特征集、结构特征集、开发特征集组成特征集合;
所述文本预处理模块,用于利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;利用大小写分词算法,去除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词组、词干组和动作词组组成查询语句的词项;
所述代码搜索模块,用于计算特征集合中每个代码片段的特征与查询语句的相似度;
加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
2.根据权利要求1所述装置的一种基于开源社区特征的代码搜索推荐方法,其特征在于,针对开源代码原有的文本、主题、结构特征提取以外,增添开发特征来更加全面度量代码片段,并通过计算查询文本与代码特征文本间的相似度对候选代码片段排序,用于完成代码搜索;该方法的具体步骤包括如下:(1)生成代码片段库:
代码片段生成模块将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库;
(2)提取每个代码片段的文本特征:代码特征提取模块利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;
(3)利用非监督学习的方式生成每个代码片段的主题特征:(3a)代码特征提取模块对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;
(3b)代码特征提取模块利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;
(3c)代码特征提取模块将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;
(3d)代码特征提取模块遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码片段的主题属性的最小概率值;
(3e)代码特征提取模块将所有代码片段的所有主题特征组成主题特征集;
(4)生成每个代码片段的结构特征:代码特征提取模块利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段集;
(5)生成每个代码片段的开发特征:(5a)代码特征提取模块利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;
(5b)代码特征提取模块遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
(5d)代码特征提取模块将每个代码片段的使用率和活跃度组成该代码片段的开发特征;
(5e)代码特征提取模块将所有代码片段的开发特征组成开发特征集;
(6)建立搜索索引:
(6a)代码特征提取模块建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库;
(6b)代码特征提取模块将步骤(2)、(3)(4)、(5)中得到的文本特征集、主题特征集、结构特征集、开发特征集组成特征集合;
(7)对查询语句文本进行预处理:
(7a)文本预处理模块利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;
(7b)文本预处理模块利用大小写分词算法,去除单词组中的停用词,生成短单词组;
(7c)文本预处理模块利用Porter Stemmer算法,提取单词组中的词干,生成词干组;
(7d)文本预处理模块利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;
(7e)文本预处理模块将短单词组、词干组和动作词组组成查询语句的词项;
(8)计算代码特征与查询语句的相似度、代码片段的综合得分完成推荐:(8a)代码搜索模块利用基于BM25的文本相似度计算方法计算特征集合中每个代码片段的特征与查询语句的相似度;
(8b)代码搜索模块加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;
(8c)代码搜索模块根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
3.根据权利要求2所述的基于开源社区特征的代码搜索推荐方法,其特征在于,步骤(1)中所述的代码本身的属性包括结构、方法、功能。
4.根据权利要求2所述的基于开源社区特征的代码搜索推荐方法,其特征在于,步骤(8a)中所述计算特征集合中每个代码片段的特征与查询语句的相似度是由下式得到的:其中,sim(·)表示相似度操作,Dn表示特征集合D中第n个代码片段的特征,q表示查询语句,ti表示查询语句中第i个词项,i=1,2,3,...,m,m表示查询语句的词项总数,∈表示属于符号,∩表示交集符号,IDF(·)表示计算逆文档频率操作,*表示相乘操作,tf(·)表示计算词项频率操作,Dn′表示特征集合D中第n个代码片段的特征词项的总数,avgdl表示特征集合中代码片段的特征词项的平均值,参数k1和b分别用于控制词项频率的范围和特征集合词项数。
5.根据权利要求2所述的基于开源社区特征的代码搜索推荐方法,其特征在于,步骤(8b)中所述加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分是由下式得到的:
sj=e1×smj+e2×lj+e3×aj+e4×sej其中,sj表示第j个代码片段的综合得分,e1表示取值为0.6权重,e2表示取值为0.1权重,e3表示取值为0.15权重,e4表示取值为0.15权重,smj表示第j个代码片段的特征相似度,lj表示第j个代码片段的代码长度,aj表示第j个代码片段的活跃度,sej表示第j个代码片段的使用率。
说明书 :
基于开源知识的代码搜索推荐装置及方法
技术领域
高质量软件的工程开发任务中,完成对海量开源社区中知识的分析、运用,实现对代码片段
的准确度量,精确搜索,提升代码搜索推荐结果的准确性。
背景技术
应对不断变化的新需求。而通过代码搜索实现代码重用是提高软件开发效率的一种重要方
式。通常代码搜索技术是通过挖掘代码特征信息,建立索引与查询文本匹配从而获得满足
特定约束的代码。基于开源知识代码搜索推荐一方面通过挖掘开源代码的社区特点与软件
开发人员的代码重用需求,提取开源代码的社区知识,实现代码特征的扩充和提取,并建立
索引并形成候选代码资源库,另一方面通过权衡查询文本与代码特征文本间的相似度对候
选代码片段排序,将排名靠前的片段推荐给软件开发人员。
一种代码搜索方法和系统。该专利申请所公开方法的步骤包括:基于用户输入的搜索词对
代码进行一次搜索;对通过一次搜索得到的结果集根据相关性、代码质量、查询意图、用户
反馈中的一个或多个进行二次排序;将经过二次排序的所述结果集作为搜索结果返回给所
述用户。根据本发明的实施例,可以有效的提高代码搜索的效果,为开发者提供最符合需
要、最优质的代码搜索结果。但是,该方法存在的不足之处是:虽然考虑了用户的查询意图、
代码质量等方面的因素,但是通过利用传统的“单纯地将软件代码视为纯文本”的思想而进
行单一的相似匹配来实现代码搜索,没有充分考虑代码本身的特征与特性,从而造成代码
度量深度的欠缺而引发搜索结果的不准确。该专利申请所公开的系统包括:用于基于用户
输入的搜索词对代码进行一次搜索的搜索模块;用于对通过一次搜索得到的结果集根据相
关性、代码质量、查询意图、用户反馈中的一个或多个进行二次排序的排序模块;用于将经
过二次排序的所述结果集作为搜索结果返回给所述用户的返回模块。
束求解的代码搜索方法,该方法具体步骤为:步骤一、从开源社区中获取开源项目;步骤二、
使用JPF和JDT分析源代码,将其转化为SSA格式;步骤三、使用JDT分析SSA格式的代码,将其
转化为约束;步骤四、将源代码与生成的约束一一对应,构建代码#约束库;步骤五、构建代
码搜索系统,帮助用户搜索代码。该方法的主要特点是基于约束求解的方法解决代码搜索
问题,并对循环语句和类成员变量进行了处理,弥补了现有方法中源代码分析的不足,并且
大大提高了代码搜索的准确率,使得程序员在软件开发过程中可以搜索需要的代码,加以
借鉴或复用,提高软件开发效率和质量。但是,该方法仍然存在的不足之处是:该方法虽然
从开源社区中获取开源项目作为输入,但舍弃了开源社区中海量的代码知识,从而造成生
成的约束不够全面的问题出现,进而导致查询词的不完全匹配以及搜索结果的不准确。
于功能相似度匹配的代码搜索方法,针对输入是自然语言查询的情况,对代码库中的代码
进行功能信息的挖掘,挖掘代码片段的功能注释与功能API这两个特征来度量代码片段和
查询语句的功能相似度,结合代码片段的方法名和方法体两个特征,根据不同特征的重要
性分配不同的权重,计算查询和与代码片段的总的相似度得分,按照得分高低排序,把搜索
结果返回给用户。充分考虑并挖掘了源代码中包含的功能信息,并根据重要性分配权重,使
得匹配精度更高。但是,该方法仍然存在的不足之处是:代码度量角度单一,即对代码的功
能信息进行挖掘,只考虑代码片段的注释与功能API两个特征。同时在搜索过程中没有充分
利用用户的查询意图等知识,导致代码搜索结果与查询词的不匹配。
询意图以及众多开源社区知识,难以达到辅助快速开发、精准搜索的目标。
发明内容
量深度的欠缺、舍弃了开源社区中海量的代码知识,从而造成生成的约束不够全面的问题、
代码度量角度单一且在搜索过程中没有充分利用用户的查询意图等知识的问题。
行特征提取,并建立每个代码片段与其特征间的映射关系,生成代码片段‑特征索引库,同
时采用文本预处理方法对查询语句处理后作为代码搜索推荐的输入,通过计算代码片段的
综合得分,完成代码片段的搜索排序及向查询用户推荐。
片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码
片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符
出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将
分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每
个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主
题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成
该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码
片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特
征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码
片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的
结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段
在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志
进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特
征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特
征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库;将文本特征集、主题特
征集、结构特征集、开发特征集组成特征集合。
除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生
成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词
组、词干组和动作词组组成查询语句的词项。
得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名
靠前的代码片段。
有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;
述该代码片段的主题属性的最小概率值;
片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段
集;
代码,并采集了源代码在开源社区中活跃度、使用率、修改日志信息,克服了现有技术对于
代码所在开源社区知识利用较少的问题。使得本发明在完成代码搜索的过程中更加符合用
户的意图,提升了代码搜索推荐的准确性。
码度量的维度,同时采用了基于BM25的文本相似度计算方法计算代码片段的特征与查询语
句的相似度,克服了现有技术代码特征度量不完全导致搜索不准确的问题。使得本发明对
代码的度量更加完备、搜索结果更加准确。
附图说明
具体实施方式
片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码
片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符
出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将
分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每
个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主
题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成
该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码
片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特
征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码
片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的
结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段
在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志
进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特
征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特
征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库;将文本特征集、主题特
征集、结构特征集、开发特征集组成特征集合。
除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生
成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词
组、词干组和动作词组组成查询语句的词项。
得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名
靠前的代码片段。
构、方法、功能。
有文本特征,将所有代码片段的所有文本特征组成一个文本特征集。
代码片段的主题属性的最小概率值。
片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段
集。
表示属于符号, 表示交集符号,IDF(·)表示计算逆文档频率操作,*表示相乘操作,tf
(·)表示计算词项频率操作,Dn′表示特征集合D中第n个代码片段的特征词项的总数,
avgdl表示特征集合中代码片段的特征词项的平均值,参数k1和b分别用于控制词项频率的
范围和特征集合词项数。
度,lj表示第j个代码片段的代码长度,aj表示第j个代码片段的活跃度,sej表示第j个代码
片段的使用率。