1.一种面向代码重用的源代码推荐方法,其特征在于,包括如下步骤:S1、源代码预处理和验证:对上传的源代码进行预处理,再通过构造抽象语法树从源代码中提取包括函数名和变量名的重要属性,如果在构造AST时出现错误,则将这段代码视为无效并放弃对该代码的上传;完成AST构造后对函数源代码进行验证,判断是否是库内已有函数源代码的功能延展,或者是库内某函数源代码的简版;
S2、生成函数摘要:结合步骤S1针对每个函数源代码构造的抽象语法树,通过AST提取函数源代码的包括函数名和变量的信息,与函数源代码的注释部分结合生成函数源代码的函数摘要;
S3、获取函数标签词:结合步骤S2针对函数源代码生成的函数摘要,识别函数摘要里的函数名、重要变量名以及部分重要注释,将这三部分内容结合在一起得到函数标签词;
S4、构造键值对:将步骤S1中经过预处理后的函数源代码与根据该函数源代码由步骤S2生成的函数摘要以及步骤S3生成的函数标签词生成具有相同“键”的键值对,即构造{Fun_id,Source_code}、{Fun_id,Fun_describe}、{Fun_id,Fun_label}键值对,分成存入数据库;其中,Fun_id表示为函数编号,Source_code表示为函数源代码,Fun_describe表示为函数摘要,Fun_label表示为函数标签词;
S5、生成问题词条:根据用户输入的已知问题项为用户推荐查询,分析用户输入的问题句,通过对比无效词库将自然语言的问题句进行剔除得到问题有效句,再对问题有效句进行分析转换成有效词条;
S6、查询匹配度计算:计算由步骤S5通过分析问题句得到的有效词条与库内各个函数源代码的函数标签词的相关系数,以及问题有效句在函数摘要的存在系数;查询匹配度来源于两个数值:相关系数以及存在系数;
步骤S6中,问题有效句在函数摘要的存在系数,定义如下:,
其中, 为问题有效句的总字数, 为函数摘要内存在最多问题有效句字数前提下最短的描述句总字数, 为问题有效句出现在函数摘要内选定描述语句的字数;
有效词条与函数标签词的相关系数,定义如下:,
其中, 为问题有效句, 为问题有效句对应的一个有效词条的字数, 为在函数标签词内带该有效词条的描述句句数, 为问题有效句的总字数, 为函数标签词的总句数;
S7、搜索结果输出:根据步骤S6计算得到的相关系数、存在系数两个数值,在函数源代码内搜索后输出搜索结果。
2.根据权利要求1所述的面向代码重用的源代码推荐方法,其特征在于,步骤S1包括如下步骤:
S1.1、使用pycodestyle包进行编程规范检查,快速验证代码块是否符合PEP8书写规范,确定代码哪些部分需要被格式化;
S1.2、使用autopep8模块规范代码格式;
S1.3、将上传代码与库内已有源代码进行重复度比较,对于重复读过高甚至完全重复的代码取消上传;
S1.4、使用python的ast模块将源代码转换为AST。
3.根据权利要求1所述的面向代码重用的源代码推荐方法,其特征在于,步骤S2中生成的函数摘要是一个由自然词汇、句子以及短语组成的描述性文本;就单个函数摘要而言,首先从该函数的AST中提取函数名和变量,然后通过简单的文本处理遍历函数的源代码,识别注释符号,获取源代码的注释内容,在提取函数名、变量名和注释之后,将这些信息结合起来生成函数摘要;其中,对于函数名和变量的处理规定如下:S2.1、对于由几个首字母为大写的英文单词连在一次的函数名或者变量名,读取每个英文单词进行翻译,生成中文注释;
S2.2、针对步骤S2.1,如果部分字母无法翻译,选择忽视该部分字母;
S2.3、在处理带有下划线或其他特殊符号的变量名时,只读取英文单词,而忽视特殊符号。
4.根据权利要求1所述的面向代码重用的源代码推荐方法,其特征在于,步骤S3中,函数标签词将是系统为用户推荐查询的依据,在单个函数标签词内不会出现同一描述词,函数标签词来源于该函数源代码的函数摘要,函数标签词根据函数摘要对重要变量以及注释的选取规定如下:
S3.1、注释习惯“前短后长”,默认后面文字是对前面的解释,选择前面句子短且不超过
5个字符的描述语加入标签词;
S3.2、注释习惯“前长后长”,默认该段注释都是对代码逻辑的解释,不选择操作;
S3.3、针对同一实体多个操作变量的命名,仅选择相同部分的实体名加入函数标签词;
S3.4、针对字符数小于2的字符,认为其不具有标签属性,不足以作为函数标签词。
5.根据权利要求1所述的面向代码重用的源代码推荐方法,其特征在于,步骤S7中,搜索结果输出,在讨论问题语句与某个函数源代码的匹配度时,该函数源代码所求得的相关系数在一定程度上受存在系数的取值影响,所以对存在系数设定一个阈值;对于问题查询所有结果存在系数都低于该阈值的情况,选择放弃对结果的输出,并认为目前系统数据库不具备用户搜索的目的函数;由于函数源代码注释描述的不确定性,每个项目库的阈值设定不一致;低于15%的存在系数所对应的函数源代码跟查询问题是不具备匹配特征的。