1.一种基于迭代对比学习的代码重排方法,其特征在于,包括:获取自然语言问题描述对应的待排序的原始候选代码;
利用语义等价的程序转换程序技术扩增所述原始候选代码;
将原始候选代码和扩增后的代码同时输入至训练后的排序模型中,对每个代码进行排序;
取所得序列中,排序得分最高的原始候选代码作为所述自然语言问题描述的最后推荐的代码;
所述排序模型的训练步骤包括:
利用生成模型构建自然语言问题描述的原始代码集;
分别利用语义等价的程序转换程序技术和错误注入的程序转换技术扩增原始代码集;
利用错误注入的程序转换技术扩增原始代码集,包括:通过统计分析错误代码的常见异常类型,利用错误注入的程序转换技术为原始代码集中的正样本代码构建多个语义不同但表面形式相似的负样本代码;
利用原始代码集以及扩增后的代码集对排序模型进行迭代对比训练,得到训练后的排序模型;
所述利用原始代码集以及扩增后的代码集对排序模型进行迭代对比训练,包括:利用生成模型生成的正样本代码和负样本代码训练排序模型,计算鉴别损失L1:其中, 是从集合 中选择 的概率,它通过在排序得分上使用Softmax函数计算得到:
其中, 表示一条负样本, 表示正样本; 表示排序模型对于负样本的评分;
表示排序模型对于正样本的评分;
利用扩增后的正样本代码和负样本代码训练排序模型,计算对齐损失L2:其中, 分别代表锚点代码、正样本和负样本的语义表征向量;
表示余弦相似度函数;
迭代训练鉴别损失L1和对齐损失L2,更新排序模型参数,得到训练后的排序模型。
2.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述利用生成模型构建自然语言问题描述的原始代码集,包括:使用生成模型为数据集中的每一个自然语言问题描述产生N个候选代码,使用对应的单元测试执行采样得到的候选代码来生成对应的标签,完全通过单元测试的候选代码被视为正样本,未能通过任一单元测试的样本被视为负样本。
3.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述错误代码的常见异常类型包括:EOFError异常、Valueerror/TypeError异常、IndexError异常以及NameError异常。
4.如权利要求3所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述利用错误注入的程序转换技术为原始代码集中的正样本代码构建多个语义不同但表面形式相似的负样本代码,包括:针对EOFError异常:在正样本代码行中随机插入input输入语句,并保持转换后代码的可编译性来构建负样本代码;针对Valueerror/TypeError异常:随机更改正样本代码中函数调用时参数的顺序、随机更改操作符左右参数的顺序、增加或者减少函数调用时的参数以及增加或者减少赋值语句左侧变量的个数来构建负样本代码;针对IndexError异常:通过在正样本代码列表和字符串序列对象的下标索引上随机加或者减一个数来构建负样本代码;
针对NameError异常:通过随机变换正样本代码中的变量名来构建负样本代码。
5.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,利用语义等价的程序转换技术扩增原始代码集包括:利用死代码插入、循环转换、变量重命名以及操作符/操作数交换方法为代码集中的正样本代码构建多个语义不变但表面形式变化的代码。
6.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述利用生成模型生成的正样本代码和负样本代码训练排序模型,计算鉴别损失L1,包括:通过排序模型计算排序得分;
利用Softmax函数以及排序得分计算从正样本和负样本代码集中鉴别出正样本代码的概率;
利用计算出的正样本代码的概率构建鉴别损失L1。
7.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,利用语义等价的程序转换技术扩增后的正样本代码和错误注入的程序转换技术扩增后负样本代码训练排序模型,包括:获取扩增后的正样本代码和负样本代码的表征,并以对比学习的方式,拉近正样本代码的表征而拉远负样本代码的表征。
8.如权利要求1所述的一种基于迭代对比学习的代码重排方法,其特征在于,所述迭代训练鉴别损失L1和对齐损失L2包括:最小化鉴别损失L1和对齐损失L2。
9.一种基于迭代对比学习的代码重排系统,其特征在于,包括:代码获取模块,被配置为:获取自然语言问题描述对应的待排序的原始候选代码;
代码扩增模块,被配置为:利用语义等价的程序转换程序技术扩增所述原始候选代码;
排序模型训练模块,被配置为:所述排序模型的训练步骤包括:利用生成模型构建自然语言问题描述的原始代码集;
分别利用语义等价的程序转换程序技术和错误注入的程序转换技术扩增原始代码集;
利用错误注入的程序转换技术扩增原始代码集,包括:通过统计分析错误代码的常见异常类型,利用错误注入的程序转换技术为原始代码集中的正样本代码构建多个语义不同但表面形式相似的负样本代码;
利用原始代码集以及扩增后的代码集对排序模型进行迭代对比训练,得到训练后的排序模型;
所述利用原始代码集以及扩增后的代码集对排序模型进行迭代对比训练,包括:利用生成模型生成的正样本代码和负样本代码训练排序模型,计算鉴别损失L1:其中, 是从集合 中选择 的概率,它通过在排序得分上使用Softmax函数计算得到:
其中, 表示一条负样本, 表示正样本; 表示排序模型对于负样本的评分;
表示排序模型对于正样本的评分;
利用扩增后的正样本代码和负样本代码训练排序模型,计算对齐损失L2:其中, 分别代表锚点代码、正样本和负样本的语义表征向量;
表示余弦相似度函数;
迭代训练鉴别损失L1和对齐损失L2,更新排序模型参数,得到训练后的排序模型;
代码排序模块,被配置为:将原始候选代码和扩增后的代码同时输入至训练后的排序模型中,对每个代码进行排序;
代码推荐模块,被配置为:取所得序列中,排序得分最高的原始候选代码作为所述自然语言问题描述的最后推荐的代码。