基于深度学习的软件实体识别方法

论文价格:150元/篇 论文用途:硕士毕业论文 Master Thesis 编辑:vicky 点击次数:
论文字数:38855 论文编号:sb2021092808500138392 日期:2021-10-07 来源:硕博论文网
本文首先基于双向 LSTM 网络构建了基础的软件工程领域的实体识别模型。并引入了通过 word2vec 训练的软件工程领域词向量,在模型训练过程中获取输入数据对应的单词的词向量和字符向量进行拼接,然后输入到 BiLSTM 编码层进行编码,最后通过输出层的条件随机场 CRF 确定最终的标注序列。

第 1 章  绪论

1.1  研究背景及意义
1.1.1  研究背景
近年来,随着社交编程网站和软件知识社区的迅速发展,软件开发进入网络化、大众化时代[1]。例如,知名软件知识社区 Stack  Overflow 为 5000 万余名软件开发人员提供开发技术、配置管理、项目组织等软件开发相关的问答交流平台,在软件开发人员之间的知识共享和获取等方面发挥重要作用[2]。这些网站的基本功能是搜索特定软件实体(如库、工具、API)相关的讨论,从而寻找问题解决方法,工具使用方法等。目前,网站中的搜索方法多是使用主题模型、向量空间模型或神经网络语言模型来索引内容,把软件实体与其他常规文本内容以相同的方式处理,这样可能会导致对内容的索引不是很理想,因为传统的信息检索不太适用于识别关键领域的特定实体。在软件知识库中实现信息提取和搜索的最理想形式是以知识图谱的形式实现知识库中实体和实体之间的关联,系统不仅可以利用知识图谱查找关于特定软件实体的讨论内容,还可以查询显示有关中心实体的一些其他信息[3]。为了实现这样的功能,首先需要识别出软件工程领域中特定的软件实体。但是现存实体识别的相关研究大多是识别出句子中的人名和地名等专有词汇,或者是有意义的数量短语、时间等进行分类标记,暂时还没有一个很好的实体识别模型应用在软件工程领域。
近几年国内外实体识别的相关研究比较多,应用场景比较广泛,2015 年Santos 等人[4]通过使用卷积神经网络提取字符特征从而增强 CNN-CRF 模型的识别效果。2016 年,Akash Bharadwaj 等人[5]提出了一种注意力神经模型(Attentional Neural Model),该模型在双向长短期记忆网络加条件随机场(BiLSTM-CRF)组成的模型基础上加入了音韵特征,并通过注意力机制来关注并学习更有效的字符信息。2017 年,Strubell 等人[6]使用 IDCNN-CRF 模型进行命名实体识别,通过空洞卷积网络提取序列信息,加快了训练速度。2018 年,王洁[7]把基于双向门控循环单元(GRU)的命名实体识别方法运用在了会议名称的识别任务上。李丽双[8]将卷积网络与双向长短期记忆网络相结合(CNN-BiLSTM-CRF)并应用在了生物医学领域。2019 年,周晓磊[9]提出了 SVM-BiLSTM-CRF 模型识别裁判文书中的实体信息,主要识别动产、不动产和知识财产三类实体。2020 年,Wang 等人[10]提出了一种对抗训练的 LSTM-CNN 系统提高了模型的泛化能力和鲁棒性,改善了神经网络的过拟合问题。
................................

1.2  研究现状
1.2.1  软件工程领域社交文本研究现状
随着社交编程网站和软件知识社区的迅速发展,相关软件社交网站中积累了有关软件工程的大量信息。这些信息围绕特定于软件的实体及其使用模式或者问题解决方案等进行讨论。现在有一些针对软件工程文本的挖掘研究,例如 Zou等人[12]以用户的使用感受为基础,基于互联网的用户评论对软件质量进行评估,对网上海量的正面和负面的评论进行情感分析,并从稳定性、易用性等六个角度对软件的质量进行综合性评估。还有人利用软件代码或者软件介绍等数据对软件进行分类,例如文章[13][14]采用支持向量机的方法、文章[15]采用潜在语义索引的方法、文章[16]采用概率主题模型的方法对软件进行分类。在软件知识社区中如何准确地识别某一领域的专家对于软件生产活动以及软件问答社区的问题及时解决具有重要意义,Nguyen[17]和 Ma[18]等人分别从实现能力(解决缺陷的时间)和使用经验(函数的使用频率)对开发者的技术水平进行度量。文章[19]通过分析问题回答者的问题类型以及得分,利用聚类以及非负矩阵分解的方法进行相关问题的专家推荐。
以 Stack Overflow 为代表的软件知识问答社区渐渐成为了软件开发人员获得知识的重要平台。文章[20]对 Stack Overflow 网站中的问题的概念、主题、类型进行过分析,发现该软件知识社区中包含了不同编程语言、不同开发平台的各种类型的问题,并且文章[21]发现,Stack Overflow 社区中有关 Android API 的讨论覆盖了 Android 中 87%的类,并且这些讨论被大量用户浏览超过 7000 万次[2]。由于该类软件知识问答平台的快速发展,越来越多的研究者开始关注以软件知识分享社区为基础的与软件开发有关知识的提取和挖掘,并进行相关研究。例如文章[22]关于软件开发知识问答检索的研究,文章[23]中关于软件开发过程中常见问题解答的自动抽取的研究以及文章[24]中代码注释自动生成的研究。文章[25]中还提出了一种结构化的语义索引技术,通过不同项目中同一 API 的使用相似度构建源代码实体和不同表述词汇之间的关联,从而实现依据开发者需求迅速从代码库中查找 API 使用示例的功能。
.......................

第 2 章  基于 BiLSTM 的软件命名实体识别

2.1  实体识别概述
2.1.1  实体识别概念
命名实体识别(Named  Entity  Recognition,  NER)是一项识别出句子中的人名和地名等特殊名称,或者是有意义的数量短语、时间等并进行分类标记的任务。该任务是信息检索、问答系统和机器翻译等多种自然语言处理技术的基础任务之一。也为相关领域知识图谱的构建以及其他以实体为中心的相关应用的发展提供支持。该技术的应用领域和场景也比较多,例如有人在生物领域、医学领域、法律领域进行研究,也有人在实际应用中运用实体识别技术识别产品的名称、型号、价格等。
2.1.2  主要方法
目前,实体识别的实现方法主要有四种,分别是基于规则、基于词典、基于统计以及基于深度学习的方法。每种方法各自的特点介绍如下:
(1)基于规则:基于规则的识别方法一般通过人来总结并制定识别规则,然后根据指定的规则匹配文本中的实体。规则一般根据词法、语法等语言知识进行设计,比如根据实体的构词结构(指示词、中心词、英文的首字母)、标点符号的运用、句式的结构等。所以要想制定一套通用的符合一般语句的规则,制定规则的人必须要具有丰富的语言知识。基于规则的方法优点是原理简单容易操作,但是也存在费时费力,适应性差等缺点。规则的编写太过于依赖经验丰富的专家并且针对不同的语言、不同的领域需要有不同的规则。
(2)基于词典:基于词典的识别方法类似于基于规则的方法,可以理解为基于规则方法的一种特殊形式,该方法需要预先制定并收集实体词构建实体词词典,比如地名词典、人名词典。在实体识别的过程中通过不断的查找匹配词典内的词从而实现实体的识别。因为针对不同的领域或者语言需要构建不同的词典,并且一般情况下实体数量巨大,词典构造过程中不能保证所有实体都被收集在词典中。所以该方法和基于规则的方法一样,同样具有移植性较差、费时费力等缺点。
......................

2.2 LSTM 网络
2.2.1 LSTM 介绍
LSTM 网络的全称为 Long Short Term Memory Network,中文名为长短期记忆网络,是循环神经网络(Recurrent  Neural  Networks,RNN)的一种变体。循环神经网络是一种专门处理序列数据的网络,它的最大特点是具有记忆功能,可以根据之前的记忆和当前的输入决定输出信息。所以循环神经网络比较擅长处理当前的输出和先前的输入有关联的问题。例如在处理一段文字信息的时候会根据已经输入的上文信息来对下文信息进行理解,而不是单独理解每个词或者每个字的意思。理论上循环神经网络对要处理的序列数据没有长度限制,可以实现任意长度序列数据的长距离依赖,然而在真实的实验应用中,循环神经网络在处理较长序列数据的反向求导过程中会出现梯度消失的问题,从而使模型难以训练并失去记忆之前信息的能力。
为了解决循环神经网络不能处理长距离序列数据的问题,有人对循环神经网络进行了改进,从而提出了长短期记忆网络(LSTM)。LSTM 网络相对于普通的循环神经网络添加了一个可以保存之前输入信息的细胞状态,并且设计了门控机制对每一个时间步的单元状态进行控制。门控机制里的门本质上是一个全连接层,输入是一个向量,输出是 0-1 范围内的向量。门控机制中一共设置了三个门,分别为遗忘门、输入门和输出门。遗忘门决定信息是否保留,输入门输入将要保存的新的信息,输出门决定下一个隐藏状态。门结构中设有激活函数,在数据处理过程中激活层输出 0-1 之间的数值,其中 1 表示允许所有信息通过,0 表示所有信息不允许通过。下一节关于 LSTM 的结构介绍将会详细介绍其工作原理。门控机制如图所示:
图 2.1 LSTM 门控结构
图 2.1 LSTM 门控结构
....................................

第 3 章  基于 BERT 与 GCN 的软件实体识别方法研究 .................... 25
3.1 BERT 概述 ........................................... 25
3.1.1 BERT 介绍 ................................. 25
3.1.2  主要结构及原理 ........................... 26
第 4 章  针对软件工程领域标注数据不足的扩充方法 ....................... 48
4.1  数据获取与词典构建 ............................ 48
4.1.1 Stack Overflow 文本数据的获取与选择 ......................................... 48
4.1.2  实体词典的构建 .............................. 49
第 5 章  总结与展望 .................................. 57
5.1  论文总结 ....................................... 57
5.2  展望 ............................ 58

第 4 章  针对软件工程领域标注数据不足的扩充方法

4.1  数据获取与词典构建
近年来,社交编程网站和软件知识社区迅速发展,这类网站在软件开发人员之间的知识共享和获取等方面发挥重要作用,同时包含着软件工程领域的的丰富信息。文章[3]中提供了软件工程领域实体识别的小型标注数据集,但是大部分深度学习模型都需要数据量比较大的训练语料,本章从特定社交编程网站中获取网站中的问答转储信息,并根据问答信息的关注程度,问题及答案质量等因素选取问答信息,并对文本信息进行预处理,然后根据本章数据扩充方法进行语料集标注,从而对小型标注数据集进行补充。实体分类依然根据文章[3]的分类原则,把实体分为 API(类、包、公共方法、内置模块等)、PL(面向对象、脚本、web 开发等编程语言)、Plat(cpu 指令集、硬件架构、操作系统等)、Fram(开发工具、开发库、开发框架等)、Stan(数据格式、协议、软件设计模式、技术标准等)五个类别。
4.1.1 Stack Overflow 文本数据的获取与选择
标注数据集的获取和预训练数据的获取流程相似,从 Stack Overflow 官方网站下载官方数据转储,并用 SQL SEVER 数据库软件可视化数据从而进行编程信息的选择与获取,Stack Overflow 的数据讨论存储信息包括问题 Id、被接受的答案 Id、回答数量(AnswerCount)、帖子内容(Body)、被标星次数(FavoriteCount)、帖子创建日期(CreationDate)、帖子得分(Score)、帖子标签(Tags)、浏览次数(ViewCount)等信息,关于帖子标签的存储信息包括标签 Id、标签名、相关标签的帖子数量等信息。本文根据相关标签的帖子数量确定该标签标记帖子的使用频率,并选取使用频率靠前的标签标记帖子,根据问题是否有被接受答案,问题得分、答案得分以及帖子浏览次数确定帖子的质量,从而选取质量较好的帖子。由于帖子内容是以 html 的格式存储并且包含部分代码片段,所以本文选取完适当数量的帖子之后要对帖子进行去标签化以及删除代码片段等预处理操作。具体流程如下:
图 4.1  标注数据集抽取流程
图 4.1  标注数据集抽取流程 
首先从标签存储信息排序并确定使用最多的前 n 个标签,然后从存储的问题讨论信息中筛选被标记为前 n 个标签的帖子,同时帖子应该存在被接受的答案,获得的分数应该大于 k,最后对帖子进行解析、提取文本内容、去除代码片段等相关预处理操作并保存到数据集,为了叙述方便,该数据集用符号 T 表示。
............................

第 5 章  总结与展望

5.1  论文总结
由于软件社交编程网站和软件知识社区迅速发展,相关软件知识社区中积累了有关软件工程的大量信息,但是现有分析软件工程文本的方法以与其他内容相同的方式对待特定软件实体,不利于以实体为中心的相关应用的发展,所以本文对软件工程领域的实体识别方法进行了研究。该领域的实体识别研究可以为软件实体抽取、实体间关系的挖掘、以及知识图谱的构建提供基础,同时实体识别也是信息检索、信息抽取、机器翻译、问答系统等多种自然语言处理技术的基础之一。
本文首先基于双向 LSTM 网络构建了基础的软件工程领域的实体识别模型。并引入了通过 word2vec 训练的软件工程领域词向量,在模型训练过程中获取输入数据对应的单词的词向量和字符向量进行拼接,然后输入到 BiLSTM 编码层进行编码,最后通过输出层的条件随机场 CRF 确定最终的标注序列。针对当前传统的词嵌入不能表示词的多义性、软件工程文本中单词拼写不规范、单纯的词特征不能很好的区分并分类软件实体、软件工程领域缺乏大量的标注数据等问题主要做了如下工作。
(1)在上述模型的基础上,针对词向量表示的问题进行了优化,本文首先通过 Stack Overflow 官方数据转储获取了大量问答文本,其次对这些文本进行筛选、去标签、删除代码片段和数据整理等步骤,然后通过 BERT 预训练代码对这些数据进行词向量表示的预训练,最终获得了适用于软件工程领域的词向量预训练语言模型。获得模型之后首先根据训练数据和测试数据获取对应的词向量表示,然后和通过 word2vec 训练的词向量以及字符向量进行拼接得到表示当前单词的总的特征向量。最后把单词总的特征向量替换基础模型的输入层输入到编码层进行模型训练。
(2)针对软件工程文本中拼写错误较多的情况,本文通过图卷积网络(GCN)融合句子的句法信息,首先通过自然语言处理工具包 StanfordNLP 进行句法依存的分析,得到输入数据中单词间的依存关系。然后在模型的编码层和输出层之间添加 GCN 层对有依存关系的词进行特征的融合,最后输入到输出层进行标签的预测。
(3)针对软件工程领域缺乏大量的标注数据的问题,本文通过词典匹配以及模型预测的方法对小型标注数据进行适当扩充。首先通过 Wikipedia,Stack Overflow 等工具按分类标签进行实体词的挖掘和软件工程领域分类词典的构建,然后对词典进行了完善,删除常用词同时根据软件工程领域的同义词词典进行实体词的常用缩写以及同义词的扩充,其次从 Stack Overflow 数据转储中获取扩充数据集并通过词典进行匹配标注,同时用之前构建的实体识别模型学习小型标注数据的数据特征从而对该扩充数据集的标签进行预测。最后对两种方法的标注结果进行融合,人工修改标注不同的结果并进行细致的检查。
参考文献(略)