CN115390806A - 基于双模态联合建模的软件设计模式推荐方法 - Google Patents
基于双模态联合建模的软件设计模式推荐方法 Download PDFInfo
- Publication number
- CN115390806A CN115390806A CN202211083423.5A CN202211083423A CN115390806A CN 115390806 A CN115390806 A CN 115390806A CN 202211083423 A CN202211083423 A CN 202211083423A CN 115390806 A CN115390806 A CN 115390806A
- Authority
- CN
- China
- Prior art keywords
- software
- software design
- source code
- design
- design mode
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/22—Procedural
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/279—Recognition of textual entities
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/30—Semantic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
- G06N3/084—Backpropagation, e.g. using gradient descent
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Computing Systems (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Biomedical Technology (AREA)
- Molecular Biology (AREA)
- Evolutionary Computation (AREA)
- Mathematical Physics (AREA)
- Data Mining & Analysis (AREA)
- Biophysics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了基于双模态联合建模的软件设计模式推荐方法,充分利用深度语言模型对自然语言和程序语言联合建模来解决向用户推荐软件设计模式的任务。首先构建用于软件设计模式推荐的语料库,其次将用户需求文本和软件源代码转化为实数特征向量,然后构建双模态联合建模的软件设计模式推荐模型并将两种不同模态的特征向量输入进行交互匹配,最后面向用户需求实现软件设计模式推荐。本发明能够向用户提供符合其需求的软件设计模式候选列表,且相较于其他模型具有更加精准的推荐效果,证明了基于双模态联合建模的软件设计模式推荐方法的实用性。
Description
技术领域
本发明属于信息检索和标签推荐领域,特别涉及一种基于深度语言模型对自然语言和程序语言联合建模,并面向目标标签实现分类的技术。
背景技术
软件设计模式是一种程序书写风格和设计风格。软件工程师在软件项目编码过程中面临着设计模式选用问题。在长期的软件开发设计过程中,面向不同的软件设计需求,优秀的软件开发者提出了多种成熟的设计模式。优秀的设计模式能够匹配当前的软件设计需求,在更好覆盖软件各类使用场景的同时,提高软件构建过程中开发人员的编码效率。
软件开发过程中软件设计需求多种多样,如何使用合适的设计模式覆盖对应的软件设计需求,一直依赖软件开发工程师的个人经验,因此很多向开发人员进行软件设计模式推荐的方法应运而生。软件设计模式推荐的一般流程为:首先根据用户需求进行理解,之后找到对应的代码实例以及相关的设计模式标签进行软件设计模式推荐。
现有设计模式推荐存在词匹配检索方法难以进行需求理解以及代码功能理解的问题,经过调研当前市面上并无相关产品和技术能够解决这一不足,因此本发明提出一种自动化方法,面向软件开发工程师提供满足其设计需求的设计模式以及相关的样例代码。
发明内容
为了克服现有技术中存在的缺陷,本发明首次针对软件源代码设计模式推荐问题提出完整的解决方案,提供了基于双模态联合建模的软件设计模式推荐方法。通过提供一种向软件开发人员推荐符合其需求的设计模式的方法,克服现有软件设计模式方法过于依赖软件开发工程师个人经验、自动化程度不高的缺陷,相比于机器学习方法以及信息检索方法具有更高的准确度优势。
本发明通过一种双模态联合建模的软件设计模式推荐模型,充分利用软件设计需求文本和软件源代码来构建基于双模态联合建模的软件设计模式推荐方法,解决自动向软件开发工程师提供满足其设计需求的设计模式以及相关的样例代码的任务。该方法首先构建了用于向用户推荐软件设计模式的语料库,在此基础上提出一种双模态联合建模的软件设计模式推荐模型,最后基于该模型以及语料库,在对用户输入的以自然语言形式描述的需求文本理解基础上向用户提供合适的设计模式标签以及相关样例软件源代码。
本发明的技术方案为:
基于双模态联合建模的软件设计模式推荐方法,总体流程图如图1所示,包括步骤如下:
步骤1,构建用于软件设计模式推荐的语料库,所述语料库包括不同设计模式的软件源代码、软件设计需求文本以及所述软件源代码、软件设计需求文本共享的设计模式标签;
步骤2,应用双模态联合建模的软件设计模式推荐模型,以步骤1构建的语料库为基础,实现面向用户需求的软件设计模式推荐,向用户提供满足用户需求的推荐候选列表,具体步骤如下:
步骤2.1,对用户需求文本进行软件设计需求特征抽取,再输入到软件设计需求理解模块中,转化为用户需求特征向量,实现用户需求理解;
步骤2.2,将语料库中的软件源代码进行软件源代码多源特征抽取,再输入到软件设计模式理解模块中,最终转化为软件设计模式实数特征向量;
步骤2.3,将步骤2.1输出的用户需求特征向量与步骤2.2中输出的软件设计模式实数特征向量输入所述双模态联合建模的软件设计模式推荐模型中依次进行向量交互,实现软件设计模式匹配,得到二者的相关性分数,并以此为依据,将语料库中的软件源代码按照相关性分数进行降序排列,得到设计模式推荐语料的候选列表,并面向用户输出设计模式推荐结果。
进一步地,所述步骤1构建用于软件设计模式推荐的语料库的过程包括两类数据的采集、清洗、存储、标注与合并对齐:
软件源代码以及软件设计需求文本共享相同的数据采集、清洗和存储流程:首先通过网络爬虫实现软件源代码以及软件设计需求文本的采集,其次通过数据清洗管线,将无用的数据清除,仅保留所需数据,最后将数据保存在服务器中,便于后续使用;
所述数据标注具体包括:针对软件源代码所使用的设计模式进行标注,软件源代码标注时仅保留三个设计模式作为其标注标签;针对软件设计需求文本涉及到的设计模式进行标注,根据软件设计需求文本所描述的具体设计问题、设计功能以及相关指标,选择合适的设计模式作为标签进行标注,每个软件设计需求文本最多对应三个设计模式标签;
数据合并对齐具体包括:当软件源代码和软件设计需求文本共享至少一个设计模式标签时,将二者配对作为一个数据对,每个共享的设计模式标签和数据对作为一条语料;其中语料库的基本数据形式为软件源代码对应方法级别或者文件级别的代码文本,软件设计需求文本为纯自然语言文本描述内容,设计模式标签对应标注的设计模式的标准名称,具体数据格式如表1所示。该语料库之后被用于设计模式推荐模型的训练以及面向用户的设计模式标签推荐。
表1语料库
进一步地,构建所述步骤2中的双模态联合建模的软件设计模式推荐模型具体包括:首先对步骤1语料库中的软件设计需求文本进行软件设计需求文本特征抽取,再利用软件设计需求理解模块转化为软件设计需求实数特征向量;对步骤1语料库中的软件源代码进行软件源代码多源特征抽取,再利用软件设计模式理解模块转化为软件设计模式实数特征向量,其次将所述两个实数特征向量输入双模态联合建模的软件设计模式推荐模型中进行模型训练,最终完成推荐模型的构建;
具体而言,所述软件设计需求文本特征抽取具体为:首先在建成的语料库基础上,进一步对自然语言描述的软件设计需求文本进行清洗处理,针对其中包含的非自然语言部分(如软件源代码、标识符名称)进行正规化处理(normalization),例如对其中的标识符部分进行分词,得到满足自然语言表述规范的软件设计需求文本,然后抽取软件设计需求文本中提及的当前软件设计所涉及的编程语言特征(如Java、Python、Php、Javascript),该特征与清洗后的软件设计需求文本构成软件设计需求文本特征数据。
具体而言,所述软件设计需求理解模块包括第一自然语言预训练子模块、项目开发编程语言特征嵌入子模块和第一特征融合子模块,如图3所示,在软件设计需求文本特征抽取的基础上,将软件设计需求文本特征数据通过第一自然语言预训练子模块转换为需求文本视角的特征向量,此处根据预训练语言模型的类型不同限制输入的需求文本最大长度为512单词;编程语言类型特征数据通过项目开发编程语言特征嵌入子模块转换为编程语言视角特征向量,此处如果嵌入子模块中缺失对应的编程语言类型记录,则使用表示“未知”的特殊符号<UNK>对应的表示向量进行替代,两种特征向量同时输入到第一特征融合模块中融合构成软件设计需求实数特征向量;
具体而言,所述软件源代码多源特征抽取包括:首先针对收集得到的原始数据进行抽取划分,将配置文件和资源文件与软件源代码无关的文件去除,其次针对不同编程语言的软件源代码或文件结合编译器对代码片段进行编译验证,确保代码正确性,并转换为对应的抽象语法树形式,之后从中抽取软件源代码中的三项关键特征,包括软件源代码方法名、软件源代码API名以及软件源代码抽象语法树(abstract syntax tree),其中软件源代码中方法名称以及API名相应以字符串序列形式进行保存,软件源代码对应的抽象语法树数据结合随机游走算法,对语法树的各条路径进行采样,得到相应的字符串序列作为软件源代码节点之间结构的表示,即抽样语法树采样路径,最后三种关键特征与软件源代码构成多源软件源代码特征数据。
具体而言,所述软件设计模式理解模块包括软件源代码预训练子模块、第二自然语言预训练子模块、软件源代码结构特征抽取子模块和第二特征融合子模块,如图4所示,首先在多源软件源代码特征数据基础上,将软件源代码输入到软件源代码预训练子模块中获得软件源代码的表示特征向量,此处根据预训练模型的类型不同,限制输入的软件源代码文本为最大512单词,其次将软件源代码方法名与API名按照其在软件源代码中的原始顺序依次进行拼接,并输入到第二自然语言预训练子模块中,以获得软件源代码中的自然语言组成成分的深度语义特征向量,然后将抽象语法树采样路径输入软件源代码结构特征抽取子模块中构建软件源代码的结构特征向量,最终将三种特征向量同时输入第二特征融合子模块中融合构成软件设计模式实数特征向量;
具体而言,将所述双模态联合建模的软件设计模式推荐模型训练过程如下:
所述模型基于Bert的Siamese网络,模型训练过程如图5所示,首先将通过所述理解模块输出的自然语言模态的软件设计需求实数特征向量与编程语言模态的软件设计模式实数特征向量输入特征交互融合模块的特征融合神经网络中进行交互融合,得到双模态设计模式表示向量,并构建软件设计模式推荐深度模型,其次将语料库中的设计模式标签作为训练目标,并设计一个用于多标签分类的输出结构,即设计模式预测分类头,然后使用文本分类损失函数作为模型训练的损失函数,将设计模式预测分类头预测得到的设计模式标签与正确标签以及负例样本标签之间组成三元组,使用文本分类损失函数对正例与负例之间的样本差距进行学习,模型训练过程中使用梯度反向传播算法,最后使用神经网络常用的优化方法寻找双模态联合建模的软件设计模式推荐模型收敛状态。
进一步地,所述步骤2.3中设计模式推荐语料的候选列表数据格式如表2所示,包括:软件源代码、设计模式标签,代码中包含的方法名列表、API列表以及作为排序依据的相关性分数。
表2设计模式推荐候选数据列表
进一步地,所述步骤2.3中面向用户输出设计模式推荐结果,在按照相关性分数降序排列的候选列表基础上,对候选列表中的代码片段根据编程语言的不同进行格式化表示,方便用户阅读,具体代码片段的格式化方法包括:自动缩进、代码自动布局以及代码高亮。
本发明的有益效果在于,首先提出一个用于软件设计模式推荐的语料库构建方法,在此基础上,基于预训练语言模型提出一种双模态联合建模的软件设计模式推荐方法,实现了软件设计需求文本自然语义的深度理解与软件源代码设计模式深度理解并重。最后基于语料库与双模态联合建模的软件设计模式推荐模型,本发明提出一种面向用户需求的软件设计模式推荐方法,能够更好服务于软件开发。
附图说明
图1是本发明技术方案的总体流程图。
图2是本发明技术方案的数据采集、清洗和存储流程图。
图3是本发明技术方案的软件设计需求理解模块结构示意图。
图4是本发明技术方案的软件设计模式理解模块结构示意图。
图5是本发明技术方案的软件设计模式推荐模型训练流程图。
图6是本发明技术方案的面向用户开发需求的软件设计模式推荐模型框图。
图7是本发明技术方案的实施例中StackOverFlow数据下载与清洗过程。
图8是本发明技术方案的实施例的一种双模态联合建模的软件设计模式推荐模型图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
实施例1
本发明基于开源问答社区StackOverFlow构建语料库,并基于自然语言预训练模型Roberta与软件源代码预训练模型CodeBert,采用如图1所示,构建双模态联合建模的软件设计模式推荐方法,具体实施步骤如下:
S1:以StackOverFlow开源软件知识问答平台作为数据源,使用网络爬虫自动抓取StackOverFlow平台中的帖子数据。StackOverFlow帖子数据格式如下,帖子至少包含发帖人针对某项软件开发问题的提问(标题)、问题描述(问题帖子正文)、其他用户对于提问者问题回答的软件源代码结果以及区分提问人问题所处的领域的帖子标签。采集得到的数据在进行清洗处理之后,保留与软件设计模式推荐任务相关的文本内容,包括但不限于:帖子标题、帖子正文、帖子内软件源代码、其他回帖人回复文本内容以及软件源代码、帖子标签(tag)。StackOverFlow帖子中包含了软件设计需求文本以及软件源代码样例,同时帖子中的标签包含帖子所涉及到的设计模式标签,因此在数据标注部分可以通过自动化方法实现。具体的数据采集和清洗过程如图7所示。
首先本发明结合维基百科以及相关教材,整理常用的设计模式标签数据。较有权威的设计模式书籍会根据问题定义和设计规范对设计模式列表进行分类,由书籍中的一章或一节来描述。描述语料库共包含来自13本设计模式书籍和125个维基百科页面的431个文档,共涉及372种唯一的设计模式,构建设计模式标签名称字典VDP。
StackOverFlow站点的全部数据采用公开访问形式定期更新数据格式为SQL数据库形式,在下载之后使用Mysql数据库进行原始数据的存储。在进行清洗之前,根据所需设计模式相关帖子ID,编写SQL语句提取对应帖子的关键数据项(ID、Title、Body、Tag),得到包括18万条问帖和30万条答帖的数据集,针对回答帖子中存在的源代码块(block)进行抽取,得到与帖子问题相关的软件源代码。最后,针对数据标注部分,为了获取与设计模式语义相关度更高的数据,此处根据得到的VDP中的372种设计模式名称及别名,筛选包含设计模式标签(DP_Tag)的帖子,与同步筛选的标签部分结合。
数据清洗部分本发明使用自然语言常用的文本分析库NLTK对原始文本进行清洗,对每个文档的文本部分进行预处理,通过过滤掉无关紧要和冗余的信息来构建紧凑的词汇表:首先,自然语言句子中类似代码的标记,例如函数名,根据驼峰命名法进行分割,以确保句子的语义完整性;然后对每个文档进行分词和小写,并去除在反映自然语言和设计模式之间的语义关系中没有价值的英文停用词、HTML标签、非字母字符、以及出现次数不超过5次的词。
最后,在完成数据采集、清洗步骤后,将数据按照表1形式进行对齐归纳,数据以csv格式文件的形式保存在服务器上,完成语料库的构建。
S2:基于语料库数据和自然语言预训练模型Roberta和软件源代码预训练语言模型CodeBert,本文给出一种双模态联合建模的软件设计模式推荐模型的具体结构。模型结构如图8所示,包含编程语言词嵌入矩阵、源代码节点嵌入矩阵、两个Roebrta预训练模型、一个CodeBert预训练模型以及一个Transformer编码器结构。
具体而言,软件设计需求文本记为SN,并有其中wi为自然语言词组。遵照自然语言预训练模型Robeta的输入格式,需要对输入的软件设计需求文本使用模板进行格式化处理。记处理之后的软件设计需求文本为则软件设计需求文本的有效输入格式如公式(1)所示:
其中`<CLS>`符号用来识别当前句子的起始位置,而`<SEP>`则作为终止符号被应用。使用上述模板包装的软件设计需求文本输入到模型Roberta中,得到其对应的软件设计需求文本表示特征向量具体过程如公式(2)所示:
从软件设计需求文本中抽取得到的编程语言平台词语对应为WP,其描述了用户在解决当前软件开发问题时候所面对的编程语言平台。本发明整理了当前主流的编程语言,整理为词表并构建了用于描述软件设计需求中编程语言特征的编程语言词嵌入矩阵EP,矩阵每一行代表一个编程语言名称的单词(例如Java、Python等)对应的词向量维度与上述公式(1)中描述的Roberta获取软件设计需求文本的表示特征向量维度相同,以便于进行特征融合。则编程语言视角特征向量则如公式(3)所示:
而软件源代码部分输入分为三种类型,软件源代码文本内容SP,软件源代码方法名与API名序列以及软件源代码对应的抽象语法树序列与软件需求文本部分处理类似,CodeBert模型在获取软件源代码文本的表示向量时同样需要对文本进行包装,记则使用模板包装之后的输入文本如公式(5)所示:
最后,针对软件源代码抽象语法树序列,首先通过一个抽象语法树节点嵌入矩阵EAST获取节点的表示向量,之后通过一个4层的Transformer编码器,得到语法树序列的特征表示。其中,语法树序列记为通过词嵌入矩阵可以得到嵌入向量如公式(9)所示:
最终,通过公式(11),将三者相加融合,表示软件设计模式实数特征向量:
由上述过程,可以得到软件设计需求实数特征向量VN以及软件设计模式实数特征向量VP,二者向量维度相同,在此基础上通过向量相乘的方式进行特征交互融合,得到用于预测设计模式标签的向量Vpred,如公式(12)所示:
Vpred=matmul(VN,VP) (12)
最终一个全连接层搭配Softmax激活函数,对输入内容进行分类得到ypred,如公式(13)所示,其分类空间维度与上述过程中整理得到的设计模式标签维度一致:
ypred=Softmax(MLP(Vpred)) (13)
其中Softmax函数形式如公式(14)所示:
对于一个长度为K的任意实数矢量,Softmax可以把它压缩为一个长度为K、取值在(0,1)区间的实数矢量,且矢量中各元素之和为1。它在多元分类和神经网络中也有很多应用。Softmax不同于普通的max函数:max函数只输出最大的那个值,而Softmax则确保较小的值也有较小的概率,不会被直接舍弃掉。
在实际训练过程中,对于包含N个样本的统一批次(batch),每个样本有M个标签,loss计算如下公式(15)所示:
其中,ln为第n个样本对应的loss,ln的计算如公式(16)所示:
其中,wi是超参数,用于处理标签间的样本不均衡问题:对于一批训练集,若其中某个标签的出现次数较少,计算loss时应该给予更高的权重,L的最终表现形式如公式(18)所示:
最终,在训练过程中本发明采用早停(early stop)策略,确保模型收敛的同时避免落入过拟合情况,训练优化器使用Adam优化器,学习率参数设定为5e-4。
S3:最后在语料库和双模态联合建模的软件设计模式推荐模型基础上,实现面向用户的软件设计模式推荐功能。具体流程图如图6所示:首先在S2步骤得到的模型基础上,针对用户输入的用户需求文本,进行软件设计需求特征抽取后,使用软件设计需求理解模块获得用户需求特征向量作为查询向量;而针对语料库中的软件源代码数据,进行软件源代码多源特征抽取后,通过软件设计模式理解模块获取软件设计模式实数特征向量,之后使用facebook公司推出的faiss向量检索库进行存储管理,形成软件设计模式实数特征向量集合,便于快速向量检索,然后本发明设定一个检索结果阈值K=100,使用需求特征向量作为查询(query)向量进行相关性检索,最后输出时使用语法树分析工具treesitter以及beautify库进行软件源代码结果美化,向用户提供更好的浏览体验。
S4:选择准确率(Accuracy)、精确率(Accuracy),召回率(Recall)、F1分数(F1Score)以及汉明分数(Hamming Score)作为评价指标对模型进行评估。计算上述指标时,通常将数据中包含的标准标签记为真实标签(true label),将模型给出的预测标签为预测标签(predicted label),则预测结果与标准标签之间存在以下约定:
真阳性(TP):数据标签为正,预测结果也为正;
真阴性(TN):数据标签为负,预测结果也为负;
假阳性(FP):数据标签为负,预测结果为正;
假阴性(FN):数据标签为证,预测结果为负。
准确率作为最常见的评价指标,代表了预测正确的比例,以正确预测的样本除以全部样本表示。通常来说,正确率越高,分类器越好;但在正负样本不平衡的情况下,单纯依靠准确率来评价一个算法模型是不够科学全面的。以二分类混淆矩阵计算准确率的过程如公式(19)所示,以本发明应用的多标签分类模型计算准确率的过程如公式(20)所示:
其中,|D|表示样本总数,H表示多标签分类器,Zi=H(xi)表示H基于xi的预测结果集。
精确率表示被分为正类的样本中实际为正类的比例,以二分类混淆矩阵计算精确率的过程如公式(21)所示,以本发明应用的多标签分类模型计算精确率的过程如公式(22)所示:
精确率和召回率指标有时候会出现矛盾的情况,因此通常使用F-score计算精确率和召回率的加权调和平均值,以此来考虑上述两个指标,具体计算如公式(23)所示,当参数α=1时,即为最常见的F1值,具体计算如公式(24)所示,以本发明使用的多标签分类模型计算表示为公式(25):
汉明分数相较于准确率,能够更好地对多标签分类模型进行评估。汉明损失(Hamming Loss)是专属于多标签分类的评价指标,表示所有预测结果中错误样本的比例,该值越小代表分类能力越强,具体计算如公式(26)所示:
其中,|D|表示样本总数,|L|表示标签总数,xi和yi分别表示预测结果和真实标签,xor表示异或运算。
本发明依据汉明损失设置汉明分数,为统一评估过程,设置汉明分数与模型效果之间呈正相关,在对预测结果矩阵二值化后,具体计算过程如公式(27)所示:
S5:对比实验部分本实施例选择常见的机器学习分类模型以及神经网络分类模型作为对比对象。本实施例选择逻辑回归(logistic regression)、梯度提升决策树(GBDT/本文使用lightgbm算法作为实现)以及支持向量机(SVM)模型作为目标机器学习模型;选择多层感知机模型(MLP),神经词袋模型(NBOW)以及卷积神经网络模型(CNN)作为目标神经网络模型。
首先,将基于本发明模型的主模型与逻辑回归、LightGBM、支持向量机三种传统机器学习基线模型进行纵向对比,分别得到指标如表3所示。本发明构建的模型各项指标均很大程度的优于三种基线模型,比表现最好的SVM模型提升了准确率、降低了约82%的分类误差,从多标签分类任务的评价来看,也比最优秀的LightGBM提高了约74%的汉明得分,充分证明了相比于传统机器学习模型,深度语义理解模型对于构建文本语义上的有效性和先进性。
表3主模型对比机器学习基线模型
本发明对于机器学习模型进行特征选择和文本编码时,使用的都是基于统计学的固定方法,如TF-IDF,这相对于深度学习模型自己从数据中学习特征,不仅耗时耗力,更很大程度上限制了机器学习模型的理想效果,因此得出较低机器学习模型指标。
其次,将本发明模型的主模型与基于NBOW、CNN、MLP三种深度学习基线模型进行横向对比,并保证所有模型除编码器外的数据集、模型框架、线性分类器等要素一致,分别得到指标对比如表4所示。
表4主模型对比深度学习基线模型
对于在深度学习基线模型上的指标表现可以看到,本发明构建的基于本文模型的主模型仍然具有不同程度的显著优势。对于数据集中正负类样本的轻微失衡问题,本发明模型也在表示被分为正类样本中实际为正类比例的精确度上达到了高达95.46%的结果;从多标签分类任务的评价来看,本文模型达到了93.43%的汉明得分。
对比基于NBOW的深度学习模型42.21%的分类准确率,本发明模型取得了91.55%的准确率,准确率提升了49.34%,降低了约85%的分类误差。分析NBOW模型的本质,这种文本表示方法是基于传统词频统计的词袋模型,统计单词间相互独立,在句子表示时没有考虑彼此的顺序和联系,丢失了大量的语义信息,所以与本发明模型融合左右上下文信息的深层双向语言表征,在分类任务效果上有较大差距。
对比基于MLP的深度学习模型60.87%的分类准确率,本发明模型提升了30.68%的准确率,降低了约78%的分类误差。因为MLP网络由很多隐层组成,且在层与层之间使用全连接,涉及参数量大,不仅导致训练难度大,而且存在过拟合问题,这是阻碍MLP取得最佳性能的主要原因。
对比基于CNN的深度学习模型74.39%的分类准确率,本发明模型提升了17.16%的准确率,降低了约67%的分类误差。CNN模型得益于层间局部感知和参数共享机制,对于本发明采用的大数据集、高维数据处理能力很强,取得了基线模型中最高的指标水平;但其在NLP领域短文本抽取局部特征的优势,在本发明中长文本的情境下中没能充分发挥,一定程度上限制了其性能表现。
整体来看,本发明模型与三种深度学习基线模型的分类效果的排序大致为:本文模型>CNN>MLP>NBOW,也侧面印证了神经网络模型不断发展和改进的历程,而本发明模型作为一种基于注意力机制建模的混合方法,得到了当前最全面的局部和全局特征表示,很好的应对了本研究的任务情景。
最后,为了验证自然语言和编程语言拼接对于实现更好的进行深度语义理解的必要性,在模型训练阶段试验仅输入用户需求文本、仅输入软件源代码文本两种训练方法对于推荐结果的影响。
表5在主模型仅使用自然语言或编程语言
由表5可以看到,仅使用自然语言作为特征的本发明模型取得84.73%的准确率,仅使用编程语言作为特征的本发明模型取得77.45%的准确率,对于原始的本发明模型分别降低了6.82%和14.1%,证明了相对于仅使用一种语言建模的情况,基于本文模型的双模态编码更有优势,并且其中自然语言对语义的理解更加重要。
综合上述结果来看,本发明提出的软件设计模式推荐方法具有较高的先进性。
本文中采用了具体个例对本发明的原理及实施方案进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.基于双模态联合建模的软件设计模式推荐方法,其特征在于,包括步骤如下:
步骤1,构建用于软件设计模式推荐的语料库,所述语料库包括不同设计模式的软件源代码、软件设计需求文本以及所述软件源代码、软件设计需求文本共享的设计模式标签;
步骤2,应用双模态联合建模的软件设计模式推荐模型,以步骤1构建的语料库为基础,实现面向用户需求的软件设计模式推荐,向用户提供满足用户需求的推荐候选列表,具体步骤如下:
步骤2.1,对用户需求文本进行软件设计需求特征抽取,再输入到软件设计需求理解模块中,转化为用户需求特征向量,实现用户需求理解;
步骤2.2,对语料库中的软件源代码进行软件源代码多源特征抽取,再输入到软件设计模式理解模块中,最终转化为软件设计模式实数特征向量;
步骤2.3,将步骤2.1输出的用户需求特征向量与步骤2.2中输出的软件设计模式实数特征向量输入所述双模态联合建模的软件设计模式推荐模型中进行向量交互,实现软件设计模式匹配,得到二者的相关性分数,并以此为依据,将语料库中的软件源代码按照相关性分数进行降序排列,得到设计模式推荐语料的候选列表,并面向用户输出设计模式推荐结果。
2.根据权利要求1所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述步骤1中构建用于软件设计模式推荐的语料库的过程包括所述软件源代码、软件设计需求文本的采集、清洗、存储、标注与合并对齐:
软件源代码以及软件设计需求文本共享相同的数据采集、清洗和存储流程:首先通过网络爬虫实现软件源代码以及软件设计需求文本的采集,其次通过数据清洗管线,将无用的数据清除,仅保留所需数据,最后将数据保存在服务器中,便于后续使用;
所述数据标注具体包括:针对软件源代码所使用的设计模式进行标注,软件源代码标注时仅保留三个设计模式作为其标注标签;针对软件设计需求文本涉及到的设计模式进行标注,根据软件设计需求文本所描述的具体设计问题、设计功能以及相关指标,选择合适的设计模式作为标签进行标注,每个软件设计需求文本最多对应三个设计模式标签;
数据合并对齐具体包括:当软件源代码和软件设计需求文本共享至少一个设计模式标签时,将二者配对作为一个数据对,每个共享的设计模式标签和数据对作为一条语料;其中语料库的基本数据形式为软件源代码对应方法级别或者文件级别的代码文本,软件设计需求文本为纯自然语言文本描述内容,设计模式标签对应标注的设计模式的标准名称。
3.根据权利要求1所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,构建所述步骤2中的双模态联合建模的软件设计模式推荐模型具体包括:首先对步骤1语料库中的软件设计需求文本进行软件设计需求文本特征抽取,再利用软件设计需求理解模块转化为软件设计需求实数特征向量;对步骤1语料库中的软件源代码进行软件源代码多源特征抽取,再利用软件设计模式理解模块转化为软件设计模式实数特征向量,其次将所述两个实数特征向量输入双模态联合建模的软件设计模式推荐模型中进行模型训练,最终完成推荐模型的构建。
4.根据权利要求3所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述软件设计需求文本特征抽取具体为:首先在建成的语料库基础上,进一步对自然语言描述的软件设计需求文本进行清洗处理,针对其中包含的非自然语言部分进行正规化处理,得到满足自然语言表述规范的软件设计需求文本,然后抽取软件设计需求文本中提及的当前软件设计所涉及的编程语言特征,该特征与清洗后的软件设计需求文本构成软件设计需求文本特征数据。
5.根据权利要求3所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述软件设计需求理解模块包括第一自然语言预训练子模块、项目开发编程语言特征嵌入子模块和第一特征融合子模块;在软件设计需求文本特征抽取的基础上,将软件设计需求文本特征数据通过第一自然语言预训练子模块转换为软件设计需求文本的表示特征向量;编程语言类型特征数据通过项目开发编程语言特征嵌入子模块转换为编程语言视角特征向量,两种特征向量同时输入到第一特征融合子模块中融合构成软件设计需求实数特征向量。
6.根据权利要求3所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述软件源代码多源特征抽取具体为:首先针对收集得到的原始数据进行抽取划分,将与软件源代码无关的文件去除,其次针对不同编程语言的软件源代码或文件结合编译器对代码片段进行编译验证,确保代码正确性,并转换为对应的抽象语法树形式,之后从中抽取软件源代码中的三项关键特征,包括软件源代码方法名、软件源代码API名以及软件源代码抽象语法树,其中软件源代码中方法名称以及API名相应以字符串序列形式进行保存,软件源代码对应的抽象语法树数据结合随机游走算法,对语法树的各条路径进行采样,得到相应的字符串序列作为抽样语法树采样路径,最后三种关键特征与软件源代码构成多源软件源代码特征数据。
7.根据权利要求3所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述软件设计模式理解模块包括软件源代码预训练子模块、第二自然语言预训练子模块、软件源代码结构特征抽取子模块和第二特征融合子模块;首先在多源软件源代码特征数据基础上,将软件源代码输入到软件源代码预训练子模块中获得软件源代码的表示特征向量,其次将软件源代码方法名与API名按照其在软件源代码中的原始顺序依次进行拼接,并输入到第二自然语言预训练子模块中,以获得软件源代码的深度语义特征向量,然后将抽象语法树采样路径输入软件源代码结构特征抽取子模块中构建软件源代码的结构特征向量,最终将三种特征向量同时输入第二特征融合模块中融合构成软件设计模式实数特征向量。
8.根据权利要求3所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述双模态联合建模的软件设计模式推荐模型训练的过程如下:
所述模型基于Bert的Siamese网络,首先将通过所述理解模块输出的自然语言模态的软件设计需求实数特征向量与编程语言模态的软件设计模式实数特征向量输入特征交互融合模块的特征融合神经网络中进行交互融合,得到双模态设计模式表示向量,并构建软件设计模式推荐深度模型,其次将语料库中的设计模式标签作为训练目标,并设计用于多标签分类的设计模式预测分类头,然后使用文本分类损失函数作为模型训练的损失函数,将设计模式预测分类头预测得到的设计模式标签与正确标签以及负例样本标签之间组成三元组,使用文本分类损失函数对正例与负例之间的样本差距进行学习,模型训练过程中使用梯度反向传播算法,最后使用神经网络常用的优化方法寻找双模态联合建模的软件设计模式推荐模型收敛状态。
9.根据权利要求1所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述步骤2.3中设计模式推荐语料的候选列表包括:软件源代码、设计模式标签、代码中包含的方法名列表、API列表以及作为排序依据的相关性分数。
10.根据权利要求1所述基于双模态联合建模的软件设计模式推荐方法,其特征在于,所述步骤2.3中面向用户输出设计模式推荐结果,在按照相关性分数降序排列的候选列表基础上,对候选列表中的软件源代码根据编程语言的不同进行格式化表示,具体软件源代码的格式化方法包括:自动缩进、代码自动布局以及代码高亮。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211083423.5A CN115390806A (zh) | 2022-09-06 | 2022-09-06 | 基于双模态联合建模的软件设计模式推荐方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211083423.5A CN115390806A (zh) | 2022-09-06 | 2022-09-06 | 基于双模态联合建模的软件设计模式推荐方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115390806A true CN115390806A (zh) | 2022-11-25 |
Family
ID=84125512
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211083423.5A Pending CN115390806A (zh) | 2022-09-06 | 2022-09-06 | 基于双模态联合建模的软件设计模式推荐方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115390806A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116501306A (zh) * | 2023-06-29 | 2023-07-28 | 深圳市银云信息技术有限公司 | 一种基于自然语言描述生成接口文档代码的方法 |
CN116862401A (zh) * | 2023-06-07 | 2023-10-10 | 北京智德广迅科技有限公司 | 一种基于大数据平台的软件开发系统 |
CN117556263A (zh) * | 2024-01-10 | 2024-02-13 | 阿里云计算有限公司 | 样本构建方法、代码生成方法、电子设备及存储介质 |
-
2022
- 2022-09-06 CN CN202211083423.5A patent/CN115390806A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116862401A (zh) * | 2023-06-07 | 2023-10-10 | 北京智德广迅科技有限公司 | 一种基于大数据平台的软件开发系统 |
CN116501306A (zh) * | 2023-06-29 | 2023-07-28 | 深圳市银云信息技术有限公司 | 一种基于自然语言描述生成接口文档代码的方法 |
CN116501306B (zh) * | 2023-06-29 | 2024-03-26 | 深圳市银云信息技术有限公司 | 一种基于自然语言描述生成接口文档代码的方法 |
CN117556263A (zh) * | 2024-01-10 | 2024-02-13 | 阿里云计算有限公司 | 样本构建方法、代码生成方法、电子设备及存储介质 |
CN117556263B (zh) * | 2024-01-10 | 2024-04-23 | 阿里云计算有限公司 | 样本构建方法、代码生成方法、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110968700B (zh) | 融合多类事理与实体知识的领域事件图谱构建方法和装置 | |
CN108573411B (zh) | 基于用户评论的深度情感分析和多源推荐视图融合的混合推荐方法 | |
CN111324728B (zh) | 文本事件摘要的生成方法、装置、电子设备及存储介质 | |
CN110427623A (zh) | 半结构化文档知识抽取方法、装置、电子设备及存储介质 | |
CN111475623A (zh) | 基于知识图谱的案件信息语义检索方法及装置 | |
CN115390806A (zh) | 基于双模态联合建模的软件设计模式推荐方法 | |
CN117076653B (zh) | 基于思维链及可视化提升上下文学习知识库问答方法 | |
CN113032568A (zh) | 一种基于bert+bilstm+crf并融合句型分析的查询意图识别方法 | |
CN113196277A (zh) | 用于检索自然语言文档的系统 | |
CN113742493A (zh) | 一种病理知识图谱的构建方法及装置 | |
CN114818717A (zh) | 融合词汇和句法信息的中文命名实体识别方法及系统 | |
CN116127090A (zh) | 基于融合和半监督信息抽取的航空系统知识图谱构建方法 | |
Zhang et al. | A data processing method based on sequence labeling and syntactic analysis for extracting new sentiment words from product reviews | |
CN114661872A (zh) | 一种面向初学者的api自适应推荐方法与系统 | |
CN114238653A (zh) | 一种编程教育知识图谱构建、补全与智能问答的方法 | |
CN116108191A (zh) | 一种基于知识图谱的深度学习模型推荐方法 | |
CN114611520A (zh) | 一种文本摘要生成方法 | |
Kelkar et al. | Resume analyzer using text processing | |
Umair et al. | N-GPETS: Neural Attention Graph-Based Pretrained Statistical Model for Extractive Text Summarization | |
CN114997167A (zh) | 简历内容提取方法及装置 | |
CN115017404A (zh) | 基于压缩空间句子选择的目标新闻话题摘要方法 | |
CN114942981A (zh) | 问答查询方法、装置、电子设备及计算机可读存储介质 | |
Algosaibi et al. | Using the semantics inherent in sitemaps to learn ontologies | |
Dubey | Towards Complex Question Answering over Knowledge Graphs. | |
CN117453851B (zh) | 基于知识图谱的文本索引增强问答方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |