基于双模态联合建模的软件设计模式推荐方法
1.本发明属于信息检索和标签推荐领域,特别涉及一种基于深度语言模型对自然语言和程序语言联合建模,并面向目标标签实现分类的技术。
背景技术:
2.软件设计模式是一种程序书写风格和设计风格。软件工程师在软件项目编码过程中面临着设计模式选用问题。在长期的软件开发设计过程中,面向不同的软件设计需求,优秀的软件开发者提出了多种成熟的设计模式。优秀的设计模式能够匹配当前的软件设计需求,在更好覆盖软件各类使用场景的同时,提高软件构建过程中开发人员的编码效率。
3.软件开发过程中软件设计需求多种多样,如何使用合适的设计模式覆盖对应的软件设计需求,一直依赖软件开发工程师的个人经验,因此很多向开发人员进行软件设计模式推荐的方法应运而生。软件设计模式推荐的一般流程为:首先根据用户需求进行理解,之后到对应的代码实例以及相关的设计模式标签进行软件设计模式推荐。
4.现有设计模式推荐存在词匹配检索方法难以进行需求理解以及代码功能理解的问题,经过调研当前市面上并无相关产品和技术能够解决这一不足,因此本发明提出一种自动化方法,面向软件开发工程师提供满足其设计需求的设计模式以及相关的样例代码。
技术实现要素:
5.为了克服现有技术中存在的缺陷,本发明首次针对软件源代码设计模式推荐问题提出完整的解决方案,提供了基于双模态联合建模的软件设计模式推荐方法。通过提供一种向软件开发人员推荐符合其需求的设计模式的方法,克服现有软件设计模式方法过于依赖软件开发工程师个人经验、自动化程度不高的缺陷,相比于机器学习方法以及信息检索方法具有更高的准确度优势。
6.本发明通过一种双模态联合建模的软件设计模式推荐模型,充分利用软件设计需求文本和软件源代码来构建基于双模态联合建模的软件设计模式推荐方法,解决自动向软件开发工程师提供满足其设计需求的设计模式以及相关的样例代码的任务。该方法首先构建了用于向用户推荐软件设计模式的语料库,在此基础上提出一种双模态联合建模的软件设计模式推荐模型,最后基于该模型以及语料库,在对用户输入的以自然语言形式描述的需求文本理解基础上向用户提供合适的设计模式标签以及相关样例软件源代码。
7.本发明的技术方案为:
8.基于双模态联合建模的软件设计模式推荐方法,总体流程图如图1所示,包括步骤如下:
9.步骤1,构建用于软件设计模式推荐的语料库,所述语料库包括不同设计模式的软件源代码、软件设计需求文本以及所述软件源代码、软件设计需求文本共享的设计模式标签;
10.步骤2,应用双模态联合建模的软件设计模式推荐模型,以步骤1构建的语料库为
基础,实现面向用户需求的软件设计模式推荐,向用户提供满足用户需求的推荐候选列表,具体步骤如下:
11.步骤2.1,对用户需求文本进行软件设计需求特征抽取,再输入到软件设计需求理解模块中,转化为用户需求特征向量,实现用户需求理解;
12.步骤2.2,将语料库中的软件源代码进行软件源代码多源特征抽取,再输入到软件设计模式理解模块中,最终转化为软件设计模式实数特征向量;
13.步骤2.3,将步骤2.1输出的用户需求特征向量与步骤2.2中输出的软件设计模式实数特征向量输入所述双模态联合建模的软件设计模式推荐模型中依次进行向量交互,实现软件设计模式匹配,得到二者的相关性分数,并以此为依据,将语料库中的软件源代码按照相关性分数进行降序排列,得到设计模式推荐语料的候选列表,并面向用户输出设计模式推荐结果。
14.进一步地,所述步骤1构建用于软件设计模式推荐的语料库的过程包括两类数据的采集、清洗、存储、标注与合并对齐:
15.软件源代码以及软件设计需求文本共享相同的数据采集、清洗和存储流程:首先通过网络爬虫实现软件源代码以及软件设计需求文本的采集,其次通过数据清洗管线,将无用的数据清除,仅保留所需数据,最后将数据保存在服务器中,便于后续使用;
16.所述数据标注具体包括:针对软件源代码所使用的设计模式进行标注,软件源代码标注时仅保留三个设计模式作为其标注标签;针对软件设计需求文本涉及到的设计模式进行标注,根据软件设计需求文本所描述的具体设计问题、设计功能以及相关指标,选择合适的设计模式作为标签进行标注,每个软件设计需求文本最多对应三个设计模式标签;
17.数据合并对齐具体包括:当软件源代码和软件设计需求文本共享至少一个设计模式标签时,将二者配对作为一个数据对,每个共享的设计模式标签和数据对作为一条语料;其中语料库的基本数据形式为软件源代码对应方法级别或者文件级别的代码文本,软件设计需求文本为纯自然语言文本描述内容,设计模式标签对应标注的设计模式的标准名称,具体数据格式如表1所示。该语料库之后被用于设计模式推荐模型的训练以及面向用户的设计模式标签推荐。
18.表1语料库
19.[0020][0021]
进一步地,构建所述步骤2中的双模态联合建模的软件设计模式推荐模型具体包括:首先对步骤1语料库中的软件设计需求文本进行软件设计需求文本特征抽取,再利用软件设计需求理解模块转化为软件设计需求实数特征向量;对步骤1语料库中的软件源代码进行软件源代码多源特征抽取,再利用软件设计模式理解模块转化为软件设计模式实数特征向量,其次将所述两个实数特征向量输入双模态联合建模的软件设计模式推荐模型中进行模型训练,最终完成推荐模型的构建;
[0022]
具体而言,所述软件设计需求文本特征抽取具体为:首先在建成的语料库基础上,进一步对自然语言描述的软件设计需求文本进行清洗处理,针对其中包含的非自然语言部分(如软件源代码、标识符名称)进行正规化处理(normalization),例如对其中的标识符部分进行分词,得到满足自然语言表述规范的软件设计需求文本,然后抽取软件设计需求文本中提及的当前软件设计所涉及的编程语言特征(如java、python、php、javascript),该特征与清洗后的软件设计需求文本构成软件设计需求文本特征数据。
[0023]
具体而言,所述软件设计需求理解模块包括第一自然语言预训练子模块、项目开发编程语言特征嵌入子模块和第一特征融合子模块,如图3所示,在软件设计需求文本特征抽取的基础上,将软件设计需求文本特征数据通过第一自然语言预训练子模块转换为需求文本视角的特征向量,此处根据预训练语言模型的类型不同限制输入的需求文本最大长度为512单词;编程语言类型特征数据通过项目开发编程语言特征嵌入子模块转换为编程语言视角特征向量,此处如果嵌入子模块中缺失对应的编程语言类型记录,则使用表示“未知”的特殊符号《unk》对应的表示向量进行替代,两种特征向量同时输入到第一特征融合模块中融合构成软件设计需求实数特征向量;
[0024]
具体而言,所述软件源代码多源特征抽取包括:首先针对收集得到的原始数据进行抽取划分,将配置文件和资源文件与软件源代码无关的文件去除,其次针对不同编程语言的软件源代码或文件结合编译器对代码片段进行编译验证,确保代码正确性,并转换为对应的抽象语法树形式,之后从中抽取软件源代码中的三项关键特征,包括软件源代码方法名、软件源代码api名以及软件源代码抽象语法树(abstract syntax tree),其中软件源代码中方法名称以及api名相应以字符串序列形式进行保存,软件源代码对应的抽象语法树数据结合随机游走算法,对语法树的各条路径进行采样,得到相应的字符串序列作为软件源代码节点之间结构的表示,即抽样语法树采样路径,最后三种关键特征与软件源代码构成多源软件源代码特征数据。
[0025]
具体而言,所述软件设计模式理解模块包括软件源代码预训练子模块、第二自然语言预训练子模块、软件源代码结构特征抽取子模块和第二特征融合子模块,如图4所示,
首先在多源软件源代码特征数据基础上,将软件源代码输入到软件源代码预训练子模块中获得软件源代码的表示特征向量,此处根据预训练模型的类型不同,限制输入的软件源代码文本为最大512单词,其次将软件源代码方法名与api名按照其在软件源代码中的原始顺序依次进行拼接,并输入到第二自然语言预训练子模块中,以获得软件源代码中的自然语言组成成分的深度语义特征向量,然后将抽象语法树采样路径输入软件源代码结构特征抽取子模块中构建软件源代码的结构特征向量,最终将三种特征向量同时输入第二特征融合子模块中融合构成软件设计模式实数特征向量;
[0026]
具体而言,将所述双模态联合建模的软件设计模式推荐模型训练过程如下:
[0027]
所述模型基于bert的siame络,模型训练过程如图5所示,首先将通过所述理解模块输出的自然语言模态的软件设计需求实数特征向量与编程语言模态的软件设计模式实数特征向量输入特征交互融合模块的特征融合神经网络中进行交互融合,得到双模态设计模式表示向量,并构建软件设计模式推荐深度模型,其次将语料库中的设计模式标签作为训练目标,并设计一个用于多标签分类的输出结构,即设计模式预测分类头,然后使用文本分类损失函数作为模型训练的损失函数,将设计模式预测分类头预测得到的设计模式标签与正确标签以及负例样本标签之间组成三元组,使用文本分类损失函数对正例与负例之间的样本差距进行学习,模型训练过程中使用梯度反向传播算法,最后使用神经网络常用的优化方法寻双模态联合建模的软件设计模式推荐模型收敛状态。
[0028]
进一步地,所述步骤2.3中设计模式推荐语料的候选列表数据格式如表2所示,包括:软件源代码、设计模式标签,代码中包含的方法名列表、api列表以及作为排序依据的相关性分数。
[0029]
表2设计模式推荐候选数据列表
[0030][0031]
进一步地,所述步骤2.3中面向用户输出设计模式推荐结果,在按照相关性分数降序排列的候选列表基础上,对候选列表中的代码片段根据编程语言的不同进行格式化表示,方便用户阅读,具体代码片段的格式化方法包括:自动缩进、代码自动布局以及代码高亮。
[0032]
本发明的有益效果在于,首先提出一个用于软件设计模式推荐的语料库构建方法,在此基础上,基于预训练语言模型提出一种双模态联合建模的软件设计模式推荐方法,实现了软件设计需求文本自然语义的深度理解与软件源代码设计模式深度理解并重。最后基于语料库与双模态联合建模的软件设计模式推荐模型,本发明提出一种面向用户需求的软件设计模式推荐方法,能够更好服务于软件开发。
附图说明
[0033]
图1是本发明技术方案的总体流程图。
[0034]
图2是本发明技术方案的数据采集、清洗和存储流程图。
[0035]
图3是本发明技术方案的软件设计需求理解模块结构示意图。
[0036]
图4是本发明技术方案的软件设计模式理解模块结构示意图。
[0037]
图5是本发明技术方案的软件设计模式推荐模型训练流程图。
[0038]
图6是本发明技术方案的面向用户开发需求的软件设计模式推荐模型框图。
[0039]
图7是本发明技术方案的实施例中stackoverflow数据下载与清洗过程。
[0040]
图8是本发明技术方案的实施例的一种双模态联合建模的软件设计模式推荐模型图。
具体实施方式
[0041]
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
[0042]
实施例1
[0043]
本发明基于开源问答社区stackoverflow构建语料库,并基于自然语言预训练模型roberta与软件源代码预训练模型codebert,采用如图1所示,构建双模态联合建模的软件设计模式推荐方法,具体实施步骤如下:
[0044]
s1:以stackoverflow开源软件知识问答平台作为数据源,使用网络爬虫自动抓取stackoverflow平台中的帖子数据。stackoverflow帖子数据格式如下,帖子至少包含发帖人针对某项软件开发问题的提问(标题)、问题描述(问题帖子正文)、其他用户对于提问者问题回答的软件源代码结果以及区分提问人问题所处的领域的帖子标签。采集得到的数据在进行清洗处理之后,保留与软件设计模式推荐任务相关的文本内容,包括但不限于:帖子标题、帖子正文、帖子内软件源代码、其他回帖人回复文本内容以及软件源代码、帖子标签(tag)。stackoverflow帖子中包含了软件设计需求文本以及软件源代码样例,同时帖子中的标签包含帖子所涉及到的设计模式标签,因此在数据标注部分可以通过自动化方法实现。具体的数据采集和清洗过程如图7所示。
[0045]
首先本发明结合以及相关教材,整理常用的设计模式标签数据。较有权威的设计模式书籍会根据问题定义和设计规范对设计模式列表进行分类,由书籍中的一章或一节来描述。描述语料库共包含来自13本设计模式书籍和125个页面的431个文档,共涉及372种唯一的设计模式,构建设计模式标签名称字典v
dp
。
[0046]
stackoverflow站点的全部数据采用公开访问形式定期更新数据格式为sql数据库形式,在下载之后使用mysql数据库进行原始数据的存储。在进行清洗之前,根据所需设计模式相关帖子id,编写sql语句提取对应帖子的关键数据项(id、title、body、tag),得到包括18万条问帖和30万条答帖的数据集,针对回答帖子中存在的源代码块(block)进行抽取,得到与帖子问题相关的软件源代码。最后,针对数据标注部分,为了获取与设计模式语义相关度更高的数据,此处根据得到的v
dp
中的372种设计模式名称及别名,筛选包含设计模式标签(dp_tag)的帖子,与同步筛选的标签部分结合。
[0047]
数据清洗部分本发明使用自然语言常用的文本分析库nltk对原始文本进行清洗,
对每个文档的文本部分进行预处理,通过过滤掉无关紧要和冗余的信息来构建紧凑的词汇表:首先,自然语言句子中类似代码的标记,例如函数名,根据驼峰命名法进行分割,以确保句子的语义完整性;然后对每个文档进行分词和小写,并去除在反映自然语言和设计模式之间的语义关系中没有价值的英文停用词、html标签、非字母字符、以及出现次数不超过5次的词。
[0048]
最后,在完成数据采集、清洗步骤后,将数据按照表1形式进行对齐归纳,数据以csv格式文件的形式保存在服务器上,完成语料库的构建。
[0049]
s2:基于语料库数据和自然语言预训练模型roberta和软件源代码预训练语言模型codebert,本文给出一种双模态联合建模的软件设计模式推荐模型的具体结构。模型结构如图8所示,包含编程语言词嵌入矩阵、源代码节点嵌入矩阵、两个roebrta预训练模型、一个codebert预训练模型以及一个transformer编码器结构。
[0050]
具体而言,软件设计需求文本记为sn,并有其中wi为自然语言词组。遵照自然语言预训练模型robeta的输入格式,需要对输入的软件设计需求文本使用模板进行格式化处理。记处理之后的软件设计需求文本为则软件设计需求文本的有效输入格式如公式(1)所示:
[0051][0052]
其中`《cls》`符号用来识别当前句子的起始位置,而`《sep》`则作为终止符号被应用。使用上述模板包装的软件设计需求文本输入到模型roberta中,得到其对应的软件设计需求文本表示特征向量具体过程如公式(2)所示:
[0053]
从软件设计需求文本中抽取得到的编程语言平台词语对应为w
p
,其描述了用户在解决当前软件开发问题时候所面对的编程语言平台。本发明整理了当前主流的编程语言,整理为词表并构建了用于描述软件设计需求中编程语言特征的编程语言词嵌入矩阵e
p
,矩阵每一行代表一个编程语言名称的单词(例如java、python等)对应的词向量维度与上述公式(1)中描述的roberta获取软件设计需求文本的表示特征向量维度相同,以便于进行特征融合。则编程语言视角特征向量则如公式(3)所示:
[0054][0055]
最后,通过将和特征向量加和方式融合得到软件设计需求实数特征向量vn,如公式(4)所示:
[0056][0057]
而软件源代码部分输入分为三种类型,软件源代码文本内容s
p
,软件源代码方法名与api名序列以及软件源代码对应的抽象语法树序列与软件需求文本部分处理类似,codebert模型在获取软件源代码文本的表示向量时同样需要对文本进行包装,记则使用模板包装之后的输入文本如公式(5)所示:
[0058]
[0059]
则软件源代码的表示特征向量可通过公式(6)得到:
[0060][0061]
类似的,输入roberta模型中的软件源代码方法名和api名构成的序列记对应包装之后的输入文本如公式(7)所示:
[0062][0063]
则软件源代码的深度语义特征向量可通过公式(8)得到:
[0064][0065]
此处与有所区别,软件源代码中的方法名和api名作为代码的组成部分,具体而言与其他软件源代码组成成分相比,其自然语言可读性更强,因此使用自然语言模型对其特征进行抽取。
[0066]
最后,针对软件源代码抽象语法树序列,首先通过一个抽象语法树节点嵌入矩阵e
ast
获取节点的表示向量,之后通过一个4层的transformer编码器,得到语法树序列的特征表示。其中,语法树序列记为通过词嵌入矩阵可以得到嵌入向量如公式(9)所示:
[0067][0068]
表示软件源代码的结构特征向量可由公式(10)得到:
[0069][0070]
最终,通过公式(11),将三者相加融合,表示软件设计模式实数特征向量:
[0071][0072]
由上述过程,可以得到软件设计需求实数特征向量vn以及软件设计模式实数特征向量v
p
,二者向量维度相同,在此基础上通过向量相乘的方式进行特征交互融合,得到用于预测设计模式标签的向量v
pred
,如公式(12)所示:
[0073]vpred
=matmul(vn,v
p
)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(12)
[0074]
最终一个全连接层搭配softmax激活函数,对输入内容进行分类得到y
pred
,如公式(13)所示,其分类空间维度与上述过程中整理得到的设计模式标签维度一致:
[0075]ypred
=softmax(mlp(v
pred
))
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(13)
[0076]
其中softmax函数形式如公式(14)所示:
[0077][0078]
对于一个长度为k的任意实数矢量,softmax可以把它压缩为一个长度为k、取值在(0,1)区间的实数矢量,且矢量中各元素之和为1。它在多元分类和神经网络中也有很多应用。softmax不同于普通的max函数:max函数只输出最大的那个值,而softmax则确保较小的值也有较小的概率,不会被直接舍弃掉。
[0079]
在实际训练过程中,对于包含n个样本的统一批次(batch),每个样本有m个标签,
loss计算如下公式(15)所示:
[0080][0081]
其中,ln为第n个样本对应的loss,ln的计算如公式(16)所示:
[0082][0083]
的计算过程如公式(17)所示:
[0084][0085]
其中,wi是超参数,用于处理标签间的样本不均衡问题:对于一批训练集,若其中某个标签的出现次数较少,计算loss时应该给予更高的权重,l的最终表现形式如公式(18)所示:
[0086][0087]
最终,在训练过程中本发明采用早停(early stop)策略,确保模型收敛的同时避免落入过拟合情况,训练优化器使用adam优化器,学习率参数设定为5e-4
。
[0088]
s3:最后在语料库和双模态联合建模的软件设计模式推荐模型基础上,实现面向用户的软件设计模式推荐功能。具体流程图如图6所示:首先在s2步骤得到的模型基础上,针对用户输入的用户需求文本,进行软件设计需求特征抽取后,使用软件设计需求理解模块获得用户需求特征向量作为查询向量;而针对语料库中的软件源代码数据,进行软件源代码多源特征抽取后,通过软件设计模式理解模块获取软件设计模式实数特征向量,之后使用facebook公司推出的faiss向量检索库进行存储管理,形成软件设计模式实数特征向量集合,便于快速向量检索,然后本发明设定一个检索结果阈值k=100,使用需求特征向量作为查询(query)向量进行相关性检索,最后输出时使用语法树分析工具treesitter以及beautify库进行软件源代码结果美化,向用户提供更好的浏览体验。
[0089]
s4:选择准确率(accuracy)、精确率(accuracy),召回率(recall)、f1分数(f1 score)以及汉明分数(hamming score)作为评价指标对模型进行评估。计算上述指标时,通常将数据中包含的标准标签记为真实标签(true label),将模型给出的预测标签为预测标签(predicted label),则预测结果与标准标签之间存在以下约定:
[0090]
真阳性(tp):数据标签为正,预测结果也为正;
[0091]
真阴性(tn):数据标签为负,预测结果也为负;
[0092]
假阳性(fp):数据标签为负,预测结果为正;
[0093]
假阴性(fn):数据标签为证,预测结果为负。
[0094]
准确率作为最常见的评价指标,代表了预测正确的比例,以正确预测的样本除以全部样本表示。通常来说,正确率越高,分类器越好;但在正负样本不平衡的情况下,单纯依靠准确率来评价一个算法模型是不够科学全面的。以二分类混淆矩阵计算准确率的过程如公式(19)所示,以本发明应用的多标签分类模型计算准确率的过程如公式(20)所示:
[0095][0096][0097]
其中,|d|表示样本总数,h表示多标签分类器,zi=h(xi)表示h基于xi的预测结果集。
[0098]
精确率表示被分为正类的样本中实际为正类的比例,以二分类混淆矩阵计算精确率的过程如公式(21)所示,以本发明应用的多标签分类模型计算精确率的过程如公式(22)所示:
[0099][0100][0101]
精确率和召回率指标有时候会出现矛盾的情况,因此通常使用f-score计算精确率和召回率的加权调和平均值,以此来考虑上述两个指标,具体计算如公式(23)所示,当参数α=1时,即为最常见的f1值,具体计算如公式(24)所示,以本发明使用的多标签分类模型计算表示为公式(25):
[0102][0103][0104][0105]
汉明分数相较于准确率,能够更好地对多标签分类模型进行评估。汉明损失(hamming loss)是专属于多标签分类的评价指标,表示所有预测结果中错误样本的比例,该值越小代表分类能力越强,具体计算如公式(26)所示:
[0106][0107]
其中,|d|表示样本总数,|l|表示标签总数,xi和yi分别表示预测结果和真实标签,xor表示异或运算。
[0108]
本发明依据汉明损失设置汉明分数,为统一评估过程,设置汉明分数与模型效果之间呈正相关,在对预测结果矩阵二值化后,具体计算过程如公式(27)所示:
[0109][0110]
s5:对比实验部分本实施例选择常见的机器学习分类模型以及神经网络分类模型作为对比对象。本实施例选择逻辑回归(logistic regression)、梯度提升决策树(gbdt/本文使用lightgbm算法作为实现)以及支持向量机(svm)模型作为目标机器学习模型;选择多
层感知机模型(mlp),神经词袋模型(nbow)以及卷积神经网络模型(cnn)作为目标神经网络模型。
[0111]
首先,将基于本发明模型的主模型与逻辑回归、lightgbm、支持向量机三种传统机器学习基线模型进行纵向对比,分别得到指标如表3所示。本发明构建的模型各项指标均很大程度的优于三种基线模型,比表现最好的svm模型提升了准确率、降低了约82%的分类误差,从多标签分类任务的评价来看,也比最优秀的lightgbm提高了约74%的汉明得分,充分证明了相比于传统机器学习模型,深度语义理解模型对于构建文本语义上的有效性和先进性。
[0112]
表3主模型对比机器学习基线模型
[0113][0114]
本发明对于机器学习模型进行特征选择和文本编码时,使用的都是基于统计学的固定方法,如tf-idf,这相对于深度学习模型自己从数据中学习特征,不仅耗时耗力,更很大程度上限制了机器学习模型的理想效果,因此得出较低机器学习模型指标。
[0115]
其次,将本发明模型的主模型与基于nbow、cnn、mlp三种深度学习基线模型进行横向对比,并保证所有模型除编码器外的数据集、模型框架、线性分类器等要素一致,分别得到指标对比如表4所示。
[0116]
表4主模型对比深度学习基线模型
[0117][0118]
对于在深度学习基线模型上的指标表现可以看到,本发明构建的基于本文模型的主模型仍然具有不同程度的显著优势。对于数据集中正负类样本的轻微失衡问题,本发明模型也在表示被分为正类样本中实际为正类比例的精确度上达到了高达95.46%的结果;从多标签分类任务的评价来看,本文模型达到了93.43%的汉明得分。
[0119]
对比基于nbow的深度学习模型42.21%的分类准确率,本发明模型取得了91.55%的准确率,准确率提升了49.34%,降低了约85%的分类误差。分析nbow模型的本质,这种文本表示方法是基于传统词频统计的词袋模型,统计单词间相互独立,在句子表示时没有考虑彼此的顺序和联系,丢失了大量的语义信息,所以与本发明模型融合左右上下文信息的深层双向语言表征,在分类任务效果上有较大差距。
[0120]
对比基于mlp的深度学习模型60.87%的分类准确率,本发明模型提升了30.68%的准确率,降低了约78%的分类误差。因为mlp网络由很多隐层组成,且在层与层之间使用全连接,涉及参数量大,不仅导致训练难度大,而且存在过拟合问题,这是阻碍mlp取得最佳性能的主要原因。
[0121]
对比基于cnn的深度学习模型74.39%的分类准确率,本发明模型提升了17.16%的准确率,降低了约67%的分类误差。cnn模型得益于层间局部感知和参数共享机制,对于本发明采用的大数据集、高维数据处理能力很强,取得了基线模型中最高的指标水平;但其在nlp领域短文本抽取局部特征的优势,在本发明中长文本的情境下中没能充分发挥,一定程度上限制了其性能表现。
[0122]
整体来看,本发明模型与三种深度学习基线模型的分类效果的排序大致为:本文模型》cnn》mlp》nbow,也侧面印证了神经网络模型不断发展和改进的历程,而本发明模型作为一种基于注意力机制建模的混合方法,得到了当前最全面的局部和全局特征表示,很好的应对了本研究的任务情景。
[0123]
最后,为了验证自然语言和编程语言拼接对于实现更好的进行深度语义理解的必要性,在模型训练阶段试验仅输入用户需求文本、仅输入软件源代码文本两种训练方法对于推荐结果的影响。
[0124]
表5在主模型仅使用自然语言或编程语言
[0125][0126]
由表5可以看到,仅使用自然语言作为特征的本发明模型取得84.73%的准确率,仅使用编程语言作为特征的本发明模型取得77.45%的准确率,对于原始的本发明模型分别降低了6.82%和14.1%,证明了相对于仅使用一种语言建模的情况,基于本文模型的双模态编码更有优势,并且其中自然语言对语义的理解更加重要。
[0127]
综合上述结果来看,本发明提出的软件设计模式推荐方法具有较高的先进性。
[0128]
本文中采用了具体个例对本发明的原理及实施方案进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。