基于开源知识的代码搜索推荐装置及方法转让专利

申请号 : CN202010872148.X

文献号 : CN112051986B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王璐李青山曹壮罗文龙吕文琪李昊张河

申请人 : 西安电子科技大学

摘要 :

本发明公开一种基于开源知识的代码搜索推荐装置及方法。本发明的装置包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块。本发明的方法的步骤为:生成代码片段库;提取代码片段文本特征;生成代码片段主题特征;生成代码片段结构特征;生成代码片段开发特征;建立搜索索引;查询语句文本预处理;代码特征与查询语句相似度计算;根据综合得分完成推荐。本发明利用开源知识构建代码特征度量体系,多角度提取代码片段特征,并利用相似度计算、加权计算方式获取代码片段的综合评分并完成代码搜索推荐,完善了代码度量角度,提高了代码搜索推荐的准确性。

权利要求 :

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个代码片段的使用率。

说明书 :

基于开源知识的代码搜索推荐装置及方法

技术领域

[0001] 本发明属于软件工程技术领域,更进一步涉及智能化软件研发和人工智能、数据挖掘等技术领域的一种基于开源知识的代码搜索推荐装置及方法。本发明适用于高效开发
高质量软件的工程开发任务中,完成对海量开源社区中知识的分析、运用,实现对代码片段
的准确度量,精确搜索,提升代码搜索推荐结果的准确性。

背景技术

[0002] 随着软件规模日益庞大、功能日趋复杂,软件代码本身更加庞大、复杂且充斥着可变性。同时,当代软件的持续构造、可成长性等特征,也亟需开发者高效地完成优质代码以
应对不断变化的新需求。而通过代码搜索实现代码重用是提高软件开发效率的一种重要方
式。通常代码搜索技术是通过挖掘代码特征信息,建立索引与查询文本匹配从而获得满足
特定约束的代码。基于开源知识代码搜索推荐一方面通过挖掘开源代码的社区特点与软件
开发人员的代码重用需求,提取开源代码的社区知识,实现代码特征的扩充和提取,并建立
索引并形成候选代码资源库,另一方面通过权衡查询文本与代码特征文本间的相似度对候
选代码片段排序,将排名靠前的片段推荐给软件开发人员。
[0003] 北京创新乐知信息技术有限公司在其申请的专利文献“一种代码搜索方法和系统”(公开号:CN106294786A,申请号:CN201610665959.6,申请日:2016年08月12日)中提供
一种代码搜索方法和系统。该专利申请所公开方法的步骤包括:基于用户输入的搜索词对
代码进行一次搜索;对通过一次搜索得到的结果集根据相关性、代码质量、查询意图、用户
反馈中的一个或多个进行二次排序;将经过二次排序的所述结果集作为搜索结果返回给所
述用户。根据本发明的实施例,可以有效的提高代码搜索的效果,为开发者提供最符合需
要、最优质的代码搜索结果。但是,该方法存在的不足之处是:虽然考虑了用户的查询意图、
代码质量等方面的因素,但是通过利用传统的“单纯地将软件代码视为纯文本”的思想而进
行单一的相似匹配来实现代码搜索,没有充分考虑代码本身的特征与特性,从而造成代码
度量深度的欠缺而引发搜索结果的不准确。该专利申请所公开的系统包括:用于基于用户
输入的搜索词对代码进行一次搜索的搜索模块;用于对通过一次搜索得到的结果集根据相
关性、代码质量、查询意图、用户反馈中的一个或多个进行二次排序的排序模块;用于将经
过二次排序的所述结果集作为搜索结果返回给所述用户的返回模块。
[0004] 南京大学在其申请的专利文献“一种基于约束求解的代码搜索方法”(公开号:CN107992324A,申请号:CN201711405834.0,申请日:2017年12月22日)中公开了一种基于约
束求解的代码搜索方法,该方法具体步骤为:步骤一、从开源社区中获取开源项目;步骤二、
使用JPF和JDT分析源代码,将其转化为SSA格式;步骤三、使用JDT分析SSA格式的代码,将其
转化为约束;步骤四、将源代码与生成的约束一一对应,构建代码#约束库;步骤五、构建代
码搜索系统,帮助用户搜索代码。该方法的主要特点是基于约束求解的方法解决代码搜索
问题,并对循环语句和类成员变量进行了处理,弥补了现有方法中源代码分析的不足,并且
大大提高了代码搜索的准确率,使得程序员在软件开发过程中可以搜索需要的代码,加以
借鉴或复用,提高软件开发效率和质量。但是,该方法仍然存在的不足之处是:该方法虽然
从开源社区中获取开源项目作为输入,但舍弃了开源社区中海量的代码知识,从而造成生
成的约束不够全面的问题出现,进而导致查询词的不完全匹配以及搜索结果的不准确。
[0005] 东南大学在其申请的专利文献“一种基于功能相似度匹配的代码搜索方法”(公开号:CN110716749A,申请号:CN201910828507.9,申请日:2019年09月03日)中公开了一种基
于功能相似度匹配的代码搜索方法,针对输入是自然语言查询的情况,对代码库中的代码
进行功能信息的挖掘,挖掘代码片段的功能注释与功能API这两个特征来度量代码片段和
查询语句的功能相似度,结合代码片段的方法名和方法体两个特征,根据不同特征的重要
性分配不同的权重,计算查询和与代码片段的总的相似度得分,按照得分高低排序,把搜索
结果返回给用户。充分考虑并挖掘了源代码中包含的功能信息,并根据重要性分配权重,使
得匹配精度更高。但是,该方法仍然存在的不足之处是:代码度量角度单一,即对代码的功
能信息进行挖掘,只考虑代码片段的注释与功能API两个特征。同时在搜索过程中没有充分
利用用户的查询意图等知识,导致代码搜索结果与查询词的不匹配。
[0006] 综上所述,现有的代码搜索推荐方法尚且停留在“单纯地将软件代码视为纯文本”的思想层面,在进行代码特征的度量方面存在较多缺陷,并且在代码搜索过程中忽略了查
询意图以及众多开源社区知识,难以达到辅助快速开发、精准搜索的目标。

发明内容

[0007] 本发明的目的在于针对上述现有技术的不足,提供一种基于开源知识的代码搜索推荐装置及方法,以解决现有技术没有充分考虑代码本身的特征与特性,从而造成代码度
量深度的欠缺、舍弃了开源社区中海量的代码知识,从而造成生成的约束不够全面的问题、
代码度量角度单一且在搜索过程中没有充分利用用户的查询意图等知识的问题。
[0008] 实现本发明目的的思路是:采集开源社区中开源代码及信息,进行处理后生成代码片段库,从文本特征、结构特征、主题特征、开发特征的四个维度分别对每个代码片段进
行特征提取,并建立每个代码片段与其特征间的映射关系,生成代码片段‑特征索引库,同
时采用文本预处理方法对查询语句处理后作为代码搜索推荐的输入,通过计算代码片段的
综合得分,完成代码片段的搜索排序及向查询用户推荐。
[0009] 本发明的代码搜索推荐装置包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块四个模块,其中,
[0010] 所述代码片段生成模块,用于将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库。
[0011] 所述代码特征提取模块,用于利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码
片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码
片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符
出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将
分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每
个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主
题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成
该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码
片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特
征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码
片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的
结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段
在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志
进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特
征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特
征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库;将文本特征集、主题特
征集、结构特征集、开发特征集组成特征集合。
[0012] 所述文本预处理模块,用于利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;利用大小写分词算法,去
除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生
成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词
组、词干组和动作词组组成查询语句的词项。
[0013] 所述代码搜索模块,用于计算特征集合中每个代码片段的特征与查询语句的相似度;加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合
得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名
靠前的代码片段。
[0014] 本发明的代码搜索推荐方法的具体步骤包括如下:
[0015] (1)生成代码片段库:
[0016] 代码片段生成模块将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库;
[0017] (2)提取每个代码片段的文本特征:
[0018] 代码特征提取模块利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所
有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;
[0019] (3)利用非监督学习的方式生成每个代码片段的主题特征:
[0020] (3a)代码特征提取模块对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率;
[0021] (3b)代码特征提取模块利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集;
[0022] (3c)代码特征提取模块将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布;
[0023] (3d)代码特征提取模块遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描
述该代码片段的主题属性的最小概率值;
[0024] (3e)代码特征提取模块将所有代码片段的所有主题特征组成主题特征集;
[0025] (4)生成每个代码片段的结构特征:
[0026] 代码特征提取模块利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码
片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段
集;
[0027] (5)生成每个代码片段的开发特征:
[0028] (5a)代码特征提取模块利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志;
[0029] (5b)代码特征提取模块遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
[0030] (5d)代码特征提取模块将每个代码片段的使用率和活跃度组成该代码片段的开发特征;
[0031] (5e)代码特征提取模块将所有代码片段的开发特征组成开发特征集;
[0032] (6)建立搜索索引:
[0033] (6a)代码特征提取模块建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库;
[0034] (6b)代码特征提取模块将步骤(2)、(3)(4)、(5)中得到的文本特征集、主题特征集、结构特征集、开发特征集组成特征集合;
[0035] (7)对查询语句文本进行预处理:
[0036] (7a)文本预处理模块利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;
[0037] (7b)文本预处理模块利用大小写分词算法,去除单词组中的停用词,生成短单词组;
[0038] (7c)文本预处理模块利用Porter Stemmer算法,提取单词组中的词干,生成词干组;
[0039] (7d)文本预处理模块利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;
[0040] (7e)文本预处理模块将短单词组、词干组和动作词组组成查询语句的词项;
[0041] (8)计算代码特征与查询语句的相似度、代码片段的综合得分完成推荐:
[0042] (8a)代码搜索模块利用基于BM25的文本相似度计算方法计算特征集合中每个代码片段的特征与查询语句的相似度;
[0043] (8b)代码搜索模块加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分;
[0044] (8c)代码搜索模块根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。
[0045] 本发明与现有技术相比具有如下优点:
[0046] 第一,由于本发明的装置中的代码片段生成模块可以采集10万个开源社区中的开源项目源代码作为输入,能够将每个项目按照代码本身的结构、方法、功能属性为粒度切分
代码,并采集了源代码在开源社区中活跃度、使用率、修改日志信息,克服了现有技术对于
代码所在开源社区知识利用较少的问题。使得本发明在完成代码搜索的过程中更加符合用
户的意图,提升了代码搜索推荐的准确性。
[0047] 第二,由于本发明的方法中采用多种代码片段处理方法及查询语句预处理方法,从文本特征、主题特征、结构特征、开发特征四个方面对代码片段进行特征提取,扩充了代
码度量的维度,同时采用了基于BM25的文本相似度计算方法计算代码片段的特征与查询语
句的相似度,克服了现有技术代码特征度量不完全导致搜索不准确的问题。使得本发明对
代码的度量更加完备、搜索结果更加准确。

附图说明

[0048] 图1为本发明装置的方框图;
[0049] 图2为本发明方法的流程图。

具体实施方式

[0050] 下面结合附图对本发明做进一步的描述。
[0051] 参照附图1,对本发明装置的结构做进一步的描述。
[0052] 本发明的装置包括代码片段生成模块、代码特征提取模块、文本预处理模块和代码搜索模块四个模块。
[0053] 所述代码片段生成模块,用于将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库。
[0054] 所述代码特征提取模块,用于利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码
片段的所有文本特征,将所有代码片段的所有文本特征组成一个文本特征集;对每个代码
片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符
出现的频率;利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将
分类后得到的主题属性和降维后得到的主题属性组成主题属性集;将与主题属性集中的每
个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主
题属性集的概率分布;遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成
该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该代码
片段的主题属性的最小概率值;将所有代码片段的所有主题特征组成主题特征集;利用特
征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码
片段的框架特征词,将每个代码片段的特征词和该代码片段对应的行数组成该代码片段的
结构特征;将所有代码片段的结构特征组成代码片段集;利用爬虫技术,爬取每个代码片段
在开源社区中的使用率和维护日志;遍历维护日志中的每条日志,对含有修改操作的日志
进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
将每个代码片段的使用率和活跃度组成该代码片段的开发特征;将所有代码片段的开发特
征组成开发特征集;建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特
征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库;将文本特征集、主题特
征集、结构特征集、开发特征集组成特征集合。
[0055] 所述文本预处理模块,用于利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组;利用大小写分词算法,去
除单词组中的停用词,生成短单词组;利用Porter Stemmer算法,提取单词组中的词干,生
成词干组;利用Stanford Parser工具提取单词组中的动作单词,生成动作词组;将短单词
组、词干组和动作词组组成查询语句的词项。
[0056] 所述代码搜索模块,用于计算特征集合中每个代码片段的特征与查询语句的相似度;加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合
得分;根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名
靠前的代码片段。
[0057] 参照附图2,对本发明方法的实现步骤做进一步的描述。
[0058] 步骤1,生成代码片段库。
[0059] 代码片段生成模块将至少10万个开源项目按照每个项目中代码本身的属性为粒度切分代码,得到至少150万个代码片段组成代码片段库。所述的代码本身的属性包括结
构、方法、功能。
[0060] 步骤2,提取每个代码片段的文本特征。
[0061] 代码特征提取模块利用抽象语法树AST,将每个代码片段中所有的文本信息以树状的形式表示,树上的每个节点表示代码片段中的一种特征类型,得到每个代码片段的所
有文本特征,将所有代码片段的所有文本特征组成一个文本特征集。
[0062] 步骤3,利用非监督学习的方式生成每个代码片段的主题特征。
[0063] 代码特征提取模块对每个代码片段的说明文档进行分析,得到该说明文档中的隐含语义结构,统计每个说明文档内字符出现的频率。
[0064] 代码特征提取模块利用基于划分的聚类方法,对每个隐含语义结构依次进行分类和降维处理,将分类后得到的主题属性和降维后得到的主题属性组成主题属性集。
[0065] 代码特征提取模块将与主题属性集中的每个主题关联性高的字符在该代码片段的说明文档中出现的频率作为该主题的概率,得到主题属性集的概率分布。
[0066] 代码特征提取模块遍历主题属性集中所有主题,将概率大于给定阈值的所有主题组成该代码片段的所有主题特征;所述给定阈值指的是使得到的所有主题能够准确描述该
代码片段的主题属性的最小概率值。
[0067] 代码特征提取模块将所有代码片段的所有主题特征组成主题特征集。
[0068] 步骤4,生成每个代码片段的结构特征。
[0069] 代码特征提取模块利用特征词选择算法,从每个代码片段的说明文档中挑选所有表征代码框架的词汇,组成该代码片段的框架特征词,将每个代码片段的特征词和该代码
片段对应的行数组成该代码片段的结构特征;将所有代码片段的结构特征组成代码片段
集。
[0070] 步骤5,生成每个代码片段的开发特征。
[0071] 代码特征提取模块利用爬虫技术,爬取每个代码片段在开源社区中的使用率和维护日志。
[0072] 代码特征提取模块遍历维护日志中的每条日志,对含有修改操作的日志进行标注,计算被标注的日志条数占维护日志的比例,将该比例作为该代码片段的活跃度;
[0073] 代码特征提取模块将每个代码片段的使用率和活跃度组成该代码片段的开发特征。
[0074] 代码特征提取模块将所有代码片段的开发特征组成开发特征集。
[0075] 步骤6,建立搜索索引:
[0076] 代码特征提取模块建立代码片段库中的每个代码片段与该代码片段的文本特征、主题特征、结构特征、开发特征间的映射关系,构建代码片段‑特征索引库。
[0077] 代码特征提取模块将步骤2、3、4、5中得到的文本特征集、主题特征集、结构特征集、开发特征集组成特征集合。
[0078] 步骤7,对查询语句文本进行预处理。
[0079] 文本预处理模块利用驼峰分词法,根据长词串的语义内容对用户输入的查询语句文本中的语义分词进行长词串进行分割,生成单词组。
[0080] 文本预处理模块利用大小写分词算法,去除单词组中的停用词,生成短单词组。
[0081] 文本预处理模块利用Porter Stemmer算法,提取单词组中的词干,生成词干组。
[0082] 文本预处理模块利用Stanford Parser工具提取单词组中的动作单词,生成动作词组。
[0083] 文本预处理模块将短单词组、词干组和动作词组组成查询语句的词项。
[0084] 步骤8,计算代码特征与查询语句的相似度、代码片段的综合得分完成推荐。
[0085] 利用下式,代码搜索模块利用基于BM25的文本相似度计算方法计算特征集合中每个代码片段的特征与查询语句的相似度:
[0086]
[0087] 其中,sim(·)表示相似度操作,Dn表示特征集合D中第n个代码片段的特征,q表示查询语句,ti表示查询语句中第i个词项,i=1,2,3,...,m,m表示查询语句的词项总数,∈
表示属于符号, 表示交集符号,IDF(·)表示计算逆文档频率操作,*表示相乘操作,tf
(·)表示计算词项频率操作,Dn′表示特征集合D中第n个代码片段的特征词项的总数,
avgdl表示特征集合中代码片段的特征词项的平均值,参数k1和b分别用于控制词项频率的
范围和特征集合词项数。
[0088] 利用下式,代码搜索模块加权计算每个特征相似度、代码长度、代码活跃度、代码使用率得到每个代码片段综合得分:
[0089] sj=e1×smj+e2×lj+e3×aj+e4×sej
[0090] 其中,sj表示第j个代码片段的综合得分,e1表示取值为0.6权重,e2表示取值为0.1权重,e3表示取值为0.15权重,e4表示取值为0.15权重,smj表示第j个代码片段的特征相似
度,lj表示第j个代码片段的代码长度,aj表示第j个代码片段的活跃度,sej表示第j个代码
片段的使用率。
[0091] 代码搜索模块根据代码片段的综合评分将查询结果按照得分从高到低排序,向查询用户推荐排名靠前的代码片段。