一种代码自动生成质量评估方法技术

技术编号:28209531 阅读:31 留言:0更新日期:2021-04-24 14:43
本发明专利技术公开了一种代码自动生成质量评估方法,本发明专利技术首先定义了代码自动生成质量属性,并基于代码自动生成数据和程序员行为数据抽取与代码质量属性相关的特征项及通用项,有助于从大量的代码生成数据中挖掘出体现代码生成质量的数据;通过代码上下文建立多维语法树,使用特征检测器在多维语法树中进行特征提取,将提取到的特征通过全连接神经网络映射到代码自动生成质量属性,从而通过全连接神经网络得到代码质量属性。综上,本发明专利技术有助于从代码自动生成与程序员行为数据中挖掘出体现代码生成质量的特征,可以对代码自动生成质量进行有效评估。行有效评估。行有效评估。

【技术实现步骤摘要】
一种代码自动生成质量评估方法


[0001]本专利技术涉及一种代码自动生成质量评估方法,属于代码自动生成质量评估领域。

技术介绍

[0002]在基于机器学习的代码自动生成的研究过程中,HindleA等人将传统的N

Gram模型应用到代码自动生成的研究中,使用语言模型N

Gram进行代码预测,实验通过MRR评估代码自动生成的质量。Hellendoorn VJ等人在语言模型的基础上加入“缓存”机制来维护程序的局部信息,通过对比循环神经网络与带有“缓存”机制的N

Gram,发现代码的局部性特征对于token的预测有极大的帮助,使用循环神经网络进行代码预测时使用MRR对生成代码质量进行评估。Nguyen TT等人使用一种统计语言模型SLAMC(A Novel Statistical Semantic Language Model For Source Code),在语言模型的基础上加入“缓存”机制来维护程序的局部信息。实验结果表明,加入“缓存”机制的模型捕获了源代码中的局部规律,实验使用Top

K的Precision对模型生成代码准确性进行评估。RaychevV等人使用N

gram模型与循环神经网络结合,在JavaAPI调用级别进行代码补全,利用N

Gram模型对程序中的API调用序列建模,从而对API的调用序列进行预测。该研究通过分析Top

K个推荐代码的Precision来评估模型的效果。Raychev V等人基于循环神经网络,将程序代码的抽象语法树的序列化结果作为训练数据集,并将网络输出结果区分为终结符的预测和非终结符的预测,该方法在一定程度上运用了存在于抽象语法树中的结构化信息,进一步提升了与生成代码相关的非终结符预测的准确性,该研究使用Top

K个推荐代码的Precision来对模型生成代码质量进行评估。
[0003]Allamanis M等人提出了专门为方法命名问题设计的神经概率语言模型的源代码,该模型通过在一个高维连续空间中将名称分配到称为嵌入的位置,以一种具有相似嵌入的名称倾向于在相似的上下文中使用的方式来了解哪些名称在语义上是相似的,并通过F1

Measure评估模型的质量。
[0004]在现有研究中,用来评估代码自动生成质量的方法主要包括Precision(精确率)、Recall(召回率)、MRR(Mean Reciprocal Rank)、F1

Measure。如果代码自动生成工具推荐的是排序后的K个结果,可以使用Top

K的Precision、Recall、MRR、F

Measure对代码自动生成性能进行评估。Precision又称查准率,指代码自动生成工具正确推荐的代码数目占代码自动生成工具推荐代码总数的比例。Recall又称查全率,定义为代码自动生成工具正确推荐代码数目与程序员真实需要的推荐代码总数之间的比例。MRR主要体现代码自动生成工具推荐代码结果的优劣情况,靠前的结果较优,评分越高。第一个推荐代码成功推荐,则分数为1;第二个推荐代码成功推荐则分数为0.5;第n个推荐成功分数为1/n;若没有推荐成功分数为0。F1

Measure是Precision和Recall的加权调和平均。现有研究中,缺乏针对代码自动生成质量的统一评估方法。多数研究使用Precision、Recall、MRR、F1

Measure作为评估代码自动生成质量的指标,但这些指标仅基于代码自动生成个数以及生成代码的正确性来进行计算。在实际开发中,代码自动生成的质量不仅仅由代码自动生成工具决定,程序员的
行为在其中也起到了较大的作用。现有评估方法忽略了程序员行为在代码自动生成过程中的重要性,只是针对代码自动生成结果进行了评估。此外,由于大部分研究采用不同的评估指标,且各指标之间无法直接转化,难以对各种代码自动生成模型和方法进行对比。因此,针对代码自动生成过程进行质量评估是亟待解决的问题。

技术实现思路

[0005]本专利技术提供了一种代码自动生成质量评估方法,以用于基于代码自动生成与程序员行为数据对代码自动生成过程进行质量评估。
[0006]本专利技术的技术方案是:一种代码自动生成质量评估方法,所述方法步骤如下:
[0007]Step1、基于代码自动生成数据和程序员行为数据抽取特征项并进行标注,作为数据集D;
[0008]Step2、使用数据集D中代码上下文进行预训练,生成代码符号向量;
[0009]Step3、根据代码上下文建立多维语法树;
[0010]Step4、通过特征检测器在多维语法树中进行特征提取,将提取到的特征通过全连接神经网络映射到代码自动生成质量属性;
[0011]Step5、使用全连接神经网络输出的代码质量属性对代码自动生成质量进行评估。
[0012]所述Step1具体如下:
[0013]Step1.1、定义代码自动生成质量属性集合A,初始化代码自动生成数据和程序员行为数据,执行Step1.2;
[0014]Step1.2、基于代码自动生成数据和程序员行为数据抽取与代码质量属性相关的特征项、抽取通用特征项并进行标注,作为数据集D,执行Step2。
[0015]所述Step2具体如下:
[0016]Step2.1、将数据集D中所有代码上下文Codecontext存入代码code,执行Step2.2;
[0017]Step2.2、将code转换为语法树tree,初始化节点队列sample_queue=[tree],初始化节点类型集合node_type=[],节点代码集合node_code=[],执行Step2.3;
[0018]Step2.3、判断sample_queue是否为空,若sample_queue为空,执行Step2.9,否则执行Step2.4;
[0019]Step2.4、将sample_queue队首元素出队,并将队首元素表示为node,执行Step2.5;
[0020]Step2.5、将node节点类型存入node_type,执行Step2.6;
[0021]Step2.6、判断node节点是否含有子节点,是则执行Step2.7,否则执行Step2.8;
[0022]Step2.7、将node节点的子节点加入队列sample_queue中,执行Step2.3;
[0023]Step2.8、将node节点所表示的代码存入node_code中,执行Step2.3;
[0024]Step2.9、对node_code中的元素进行去重,执行Step2.10;
[0025]Step2.10、以node_code作为词典,将code进行分词,并以空格进行分隔,执行Step2.11;
本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种代码自动生成质量评估方法,其特征在于:所述方法步骤如下:Step1、基于代码自动生成数据和程序员行为数据抽取特征项并进行标注,作为数据集D;Step2、使用数据集D中代码上下文进行预训练,生成代码符号向量;Step3、根据代码上下文建立多维语法树;Step4、通过特征检测器在多维语法树中进行特征提取,将提取到的特征通过全连接神经网络映射到代码自动生成质量属性;Step5、使用全连接神经网络输出的代码质量属性对代码自动生成质量进行评估。2.根据权利要求1所述的代码自动生成质量评估方法,其特征在于:所述Step1具体如下:Step1.1、定义代码自动生成质量属性集合A,初始化代码自动生成数据和程序员行为数据,执行Step1.2;Step1.2、基于代码自动生成数据和程序员行为数据抽取与代码质量属性相关的特征项、抽取通用特征项并进行标注,作为数据集D,执行Step2。3.根据权利要求1所述的代码自动生成质量评估方法,其特征在于:所述Step2具体如下:Step2.1、将数据集D中所有代码上下文Codecontext存入代码code,执行Step2.2;Step2.2、将code转换为语法树tree,初始化节点队列sample_queue=[tree],初始化节点类型集合node_type=[],节点代码集合node_code=[],执行Step2.3;Step2.3、判断sample_queue是否为空,若sample_queue为空,执行Step2.9,否则执行Step2.4;Step2.4、将sample_queue队首元素出队,并将队首元素表示为node,执行Step2.5;Step2.5、将node节点类型存入node_type,执行Step2.6;Step2.6、判断node节点是否含有子节点,是则执行Step2.7,否则执行Step2.8;Step2.7、将node节点的子节点加入队列sample_queue中,执行Step2.3;Step2.8、将node节点所表示的代码存入node_code中,执行Step2.3;Step2.9、对node_code中的元素进行去重,执行Step2.10;Step2.10、以node_code作为词典,将code进行分词,并以空格进行分隔,执行Step2.11;Step2.11、初始化窗口windows=8,start=0,训练样本集合vec_train=[],训练样本标签集合vec_label=[],执行Step2.12;Step2.12、以node_code为词典,将分词后的code转换为one

hot序列,并将其表示为code_one_hot,执行Step2.13;Step2.13、判断start是否小于code序列长度,是执行Stpe2.14,否则执行Step2.17;Step2.14、序列line=code_one_hot中起始点为start,长度为windows的序列,执行Step2.15;Step2.15、将line中start处的元素存入vec_train,将line中除start处以外的元素存入vec_label,执行Step2.16;Step2.16、start=start+1,执行Step2.13;
Step2.17、初始化全连接神经网络,使用vec_train与vec_label训练代码符号向量,执行Step3。4.根据权利要求3所述的代码自动生成质量评估方法,其特征在于:所述Step3具体如下:Step3.1、输入数据集D,执行Step3.2;Step3.2、将数据集D中所有文件路径存入file中并去重,初始化文件路径个数f=0,样本samples=[],执行Step3.3;Step3.3、判断f是否小于file中文件路径个数,是则执行Step3.4,否则执行Step4;其中,一条代码自动生成数据和程序员行为数据对应一个文件路径;Step3.4、将第f个文件路径file[f]中代码上下文解析为语法树root,将数据集D中文件路径为file[f]与代码质量属性相关的特征项存入records,代码自动生成质量标注存入label,执行Step3.5;Step3.5、初始化节点队列queue=[root];根节点字段root_josn={'node':root节点类型,'code':root节点表示的代码,'children':[],'record':None};节点队列字段queue_json=[root_json];f+=1,执行Step3.6;Step3.6、判断queue是否不为空,是则执行Step3.7,否则执行Step3.3;Step3.7、当前节点current_node=queue队首元素,并将queue队首元素出队;当前节点字段current_node_json=queue_json=[root_json],执行Step3.8;Step3.8、孩子节点children=current_node子节点列表,将children存入queue,c=0,执行Step3.9;Step3.9、判断c是否小于children节点个数,是则执行Step3.10,否则执行Step3.3;Step3.10、初始化记录re=None,num=0,rc=0,执行Step3.11;Step3.11、判断rc是否小于records个数,是则执行Step3.12,否则执行Step3.15;其中,一条代码自动生成数据和程序员行为数据对应的records个数取值为1;Step3.12、判断children[c]代码是否等于数据集D中生成代码内容,是则执行Step3.13,否则执行Step3.14;Step3.13、re=数据集D中生成代码内容为children[c]的与代码质量属性相关的特征项,子树datum={'tree':root_json,'label':label[num]},num+=1,将datum添加到samples中,执行Step3.15;Step3.14、rc=rc+1,执行Step3.11;Step3.15、孩子节点字段child_json={'node':children[c]节点类型,'code':children[c]中生成代码内容,'children':[],'record':re},执行Step3.16;Step3.16、将child_json添加到current_node_json['children']中,rc+=1,c+=1,执行S...

【专利技术属性】
技术研发人员:姜瑛张晓江汤守国李凌宇丁家满汪海涛
申请(专利权)人:昆明理工大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1