基于深度学习的软件实体识别方法
摘要
随着软件开发进入网络化、大众化时代,各种社交编程网站和软件知识社区迅速发展。在这些网站中蕴含着和软件开发相关的大量有价值的信息,例如该类网站的功能之一是搜索特定软件实体(如库、工具、
API)的相关讨论,从而寻找在软件开发过程中出现的问题的解决方法、工具使用方法等。所以网站中积累了大量的关于软件工程的实体信息,对这些实体信息的挖掘和研究可以支持与软件工程相关的问答系统、机器翻译、文本分类等以实体为中心的相关应用的发展,同时为软件工程领域知识图谱的构建提供基础。而当前的分析软件工程文本的方法以与其他内容相同的方式对待软件实体,不利于以实体为中
心的相关应用的发展。所以本文主要目的是研究软件工程文本中软件实体的识别和分类方法。
实体识别(Named Entity Recognition, NER)是自然语言处理任务中比较基本的任务之一,传统实体识别的相关研究大多是识别出句子中的人名和地名等专有名称,或者是有意义的数量短语和时间等并进行分类标记,暂时还没有一个很好的实体识别模型应用在软件工程领域,并且传统的实体识别算法的词向量嵌入是静态固定的不能根据上下文语义对同一单词的不同用法进行表示。对于软件工程文本,现有实体识别方法仅限于基于代码或文字解析技术的字典查找和基于规则的方法,但是软件工程文本中存在大小写乱用、拼写错误等情况,基于字典和规则的方法不能很好的进行识别。所以本文构建了一种基于深度学习的软件实体识别方法。
本文在构建软件实体识别方法过程中主要做了以下几个工作:
(1)引入预训练语言模型 BERT(Bidirectional Encoder Representation from Transformers)解决传统词向量训练模型产生的词向量是静态的,没有考虑上下文语义,不能对一词多义进行表示的问题。首先通过
Stack Overflow 官方数据转储提取软件工程领域的文本内容并进行数据预处理;然后在 BERT 模型基础上通过软件工程领域的文本内容进一步预训练,从而获得更适合软件工程领域的预训练语言模型;最后在软件工程领域实体识别模型构建过程中通过预训练模型获取输入数据的特征表示。实验表明引入 BERT 预训练语言模型后模型的识别效果具有明显的提升。
(2)通过图卷积网络将句法信息融合到实体识别模型中,增加模型学习特征的能力,解决由于软件工程文本书写不规范造成的单纯的词特征不能很好的区分并分类软件实体的问题。先通过相关句法分析器分析标注数据的句法依存结构,得到的句法信息同词嵌入一起作为模型的输入;再通过添加图卷积网络把句法信息融入到模型中,从而提升模型的识别效果。实验表明,加入图卷积网络之后模型的识别准确率提高了 2%
(3)在已有小型标注数据集上进行扩充,解决软件工程领域标注数据少的问题。首先获取软件工程领域的问答数据并构建该领域的实体分类词典,然后通过词典对数据进行匹配标注,同时基于小型标注数据构建的实体识别模型进行数据集的预测标注,最后把两种方法的标注结果进行整合并进行人工检查。相比于完全人工标注可以大大减少工作量,提升标注效率。
关键词:软件工程;实体识别(NER);BERT;图卷积网络(GCN)
目录
第 1 章 绪论
1.1 研究背景及意义
1.1.1 研究背景
1.1.2 研究意义
1.2 研究现状
1.2.1 软件工程领域社交文本研究现状
1.2.2 实体识别研究现状
1.3 论文的研究内容
1.4 论文的组织结构
1.5 本章小结
第 2 章基于 Bi LSTM 的软件命名实体识别
2.1 实体识别概述
2.1.1实体识别概念
2.1.2 主要方法
2.2 LSTM 网络
2.2.1 LSTM 介绍
2.2.2 LSTM 网络的模型结构
2.2.3 LSTM 网络的模型训练
2.2.4 Bi LSTM-CRF 网络的模型结构
2.3 基于 Bi LSTM 的软件命名实体识别方法构建
2.3.1 数据集介绍
2.3.2 模型整体结构设计
2.3.3 实验模型构建
2.3.4网络参数设置
2.4 实验结果分析
2.4.1 评价指标
2.4.2 参数优化及实验结果分析
2.5 本章小结
第 3 章 基于 BERT 与 GCN 的软件实体识别方法研究
3.1 BERT 概述
3.1.1 BERT
3.1.2 主要结构及原理
3.2 GCN 概述
3.2.1 GCN 介绍
3.2.2 GCN 相关研究
3.3 基于 BERT 实体识别算法构建
3.3.1 软件工程领域数据提取及预处理
3.3.2 BERT 预训练
3.3.3 获取BERT 词向量
3.3.4 BERT-Bi LSTM-CRF 模型构建
3.3.5 实验结果分析
3.4 基于 GCN 实体识别算法构建
3.4.1 模型原理
3.4.2 输入数据处理
3.4.3 加入 GCN 的模型构建
3.4.4 参数调优和实验结果分析
3.5 实验综合对比分析
3.6 本章小结
第 4 章 针对软件工程领域标注数据不足的扩充方法
4.1 数据获取与词典构建
4.1.1 Stack Overflow 文本数据的获取与选择
4.1.2 实体词典的构建
4.2 数据集扩充
4.2.1 基于词典的方法进行标注
4.2.2 基于小型标注数据进行标注
4.2.3 不同标注结果的融合与修正
4.3 实验与分析
4.3.1 不同模型实验结果
4.3.2 实验结果分析
4.4 本章小结
第 5 章总结与展望
5.1 论文总结
5.2 展望
参考文献
第 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),该模型在双向长短期记忆网络加条件随机场(Bi LSTM-CRF)组成的模型基础上加入了音韵特征,并通过注意力机制来关注并学习更有效的字符信息。2017 年,Strubell 等人[6]使用 IDCNN-CRF 模型进行命名实体识别,通过空洞卷积网络提取序列信息,加快了训练速度。2018 年,王洁[7]把基于双向门控循环单元(GRU)的命名实体识别方法运用在了会议名称的识别任务上。李丽双[8]将卷积网络与双向长短期记忆网络相结合(CNN-Bi LSTM-CRF)并应第 1 章 绪论 2 用在了生物医学领域。2019 年,周晓磊[9]提出了 SVM-Bi LSTM-CRF 模型识别裁判文书中的实体信息,主要识别动产、不动产和知识财产三类实体。2020 年,Wang 等人[10]提出了一种对抗训练的 LSTM-CNN 系统提高了模型的泛化能力和鲁棒性,改善了神经网络的过拟合问题。
1.1.2 研究意义
实体识别任务是自然语言处理中最基础的任务之一,实体识别模型的好坏影响着自然语言处理的后续任务,例如问答系统,机器翻译,文本分类,信息抽取等任务都以实体识别为基础[11]。问答系统中的常见问题如:“是谁”、“在哪儿”、“什么时间”、“干了什么事”等,这些答案的抽取都需要比较好的实体识别模型的支持。机器翻译中人名、地名等专有名词会有一些专门的翻译规则,好的实体识别模型能提高机器翻译的翻译效果。在实体关系抽取任务中,如果识别的实体是错的,那也会导致关系的抽取错误从而出现连续性的错误影响。所以研究实体识别任务对自然语言处理的后续任务具有重要意义。
对于软件工程文本,现有实体识别方法仅限于基于代码或文字解析技术的字典查找和基于规则的方法,而这些方法针对软件工程领域的实体识别任务具有以下挑战,在软件工程领域的实体识别任务中研究并解决以下问题具有重大意义:
1)软件知识社区中讨论的特点是不遵循严格的语言规则,存在大量拼写错误,以及简写等情况。
2)许多特定于软件的实体名称是常用词。
3)有些实体词根据使用语境的不同可以归为不同的实体类别。
同时通过对国内外实体识别相关文献的整理研究发现,虽然有很多关于实体识别的相关模型,但是这些模型还存在如下问题,研究解决这些问题同样对实体识别领域的研究具有重要意义:
(1)不能很好的表征字的多义性,例如句子“这条裤子太长了,等你长大再穿。”中,虽然两个“长”字代表不同的意思,但是在传统的词向量模型中,这两个“长”字的词向量是一样的,不能根据意思的不同进行区分。
(2)如果句子中前后文内容较少并且存在长实体包含短实体、实体的缩写等情况,往往不能准确地识别,还需要继续研究。
(3)缺少大量的针对特定领域的标注数据。
第 1 章 绪论
在社交编程网站上每天都会产生海量的文本内容,这些文本内容包含丰富的软件开发信息,为软件开发人员提供各种问题解决方案以及工具使用方法对这些丰富的软件开发信息进行挖掘研究,提取有用信息对于软件工程领域的发展具有重大意义。比如构建软件工程领域的知识库,知识图谱,提高和改进软件工程领域知识社区检索系统的检索效果。要想实现这些目标,首先需要从大量软件工程非结构化文本内容中抽取有用的结构化数据,而命名实体识别的研究可以达到这一目的[11]。命名实体识别也是自然语言处理技术的重要子任务之一,软件工程领域非结构化信息中的软件实体,比如编程语言、软件工具、开发库、开发框架等实体都是对于文本理解不可缺少的内容,在做软件工程领域的智能问答系统、推荐系统、构建知识图谱等方面同样离不开软件工程领域实体的识别。所以研究软件工程领域实体识别具有如下作用和意义:
1. 方便软件开发人员查询特定实体的相关知识。
2. 为软件实体抽取、软件知识库的构建提供支持。
3. 为实体间关系的挖掘以及知识图谱的构建提供支持。
4. 改善软件知识社区的信息搜索形式,提高搜索效率。
5. 为软件工程领域的信息检索、问答系统等自然语言处理任务提供基础。
6. 为其他软件工程的智能化应用提供支持。
1.2 研究现状
1.2.1 软件工程领域社交文本研究现状
随着社交编程网站和软件知识社区的迅速发展,相关软件社交网站中积累了有关软件工程的大量信息。这些信息围绕特定于软件的实体及其使用模式或者问题解决方案等进行讨论。现在有一些针对软件工程文本的挖掘研究,例如 Zou等人[12]以用户的使用感受为基础,基于互联网的用户评论对软件质量进行评估,对网上海量的正面和负面的评论进行情感分析,并从稳定性、易用性等六个角度对软件的质量进行综合性评估。还有人利用软件代码或者软件介绍等数据对软件进行分类,例如文章[13][14]采用支持向量机的方法、文章[15]采用潜在语义索引的方法、文章[16]采用概率主题模型的方法对软件进行分类。在软件知识社区中如何准确地识别某一领域的专家对于软件生产活动以及软件问答社区的问题及时解决具有重要意义,Nguyen[17]和 Ma[18]等人分别从实现能力(解决缺陷第 1 章 绪论的时间)和使用经验(函数的使用频率)对开发者的技术水平进行度量。文章[19]通过分析问题回答者的问题类型以及得分,利用聚类以及非负矩阵分解的方法进行相关问题的专家推荐。以 Stack Overflow为代表的软件知识问答社区渐渐成为了软件开发人员获得知识的重要平台。文章[20]对 Stack Overflow 网站中的问题的概念、主题、类型进行过分析,发现该软件知识社区中包含了不同编程语言、不同开发平台的各种类型的问题,并且文章[21]发现,Stack Overflow 社区中有关 Android API 的讨论覆盖了 Android 中 87%的类,并且这些讨论被大量用户浏览超过 7000 次[2]。由于该类软件知识问答平台的快速发展,越来越多的研究者开始关注以软件知识分享社区为基础的与软件开发有关知识的提取和挖掘,并进行相关研究。例如文章[22]关于软件开发知识问答检索的研究,文章[23]中关于软件开发过程中常见问题解答的自动抽取的研究以及文章[24]中代码注释自动生成的研究。文章[25]中还提出了一种结构化的语义索引技术,通过不同项目中同一 API 的使用相似度构建源代码实体和不同表述词汇之间的关联,从而实现依据开发者需求迅速从代码库中查找 API 使用示例的功能。
总之,开源软件知识共享社区中拥有海量的与软件开发相关的资源和知识等着我们去挖掘、研究。从软件代码仓库挖掘技术出现开始,人们利用统计学以及机器学习等各种研究方法对软件工程领域的相关数据进行挖掘,发现了许多软件开发过程中蕴含的规律,最近几年,软件仓库挖掘技术扩展到了各类软件知识社区并且迅速发展[2]。
1.2.2 实体识别研究现状
命名实体识别任务的主要工作是识别出句子中的人名和地名等特殊名称,或者是有用的数量短语和时间等并进行分类标记[26]。国外最早提出对命名实体识别任务进行研究。1991 年,Rau 在第 7 届 IEEE 人工智能应用会议上首次提出了通过启发式算法与人工编写规则相结合的方法识别公司名称并发表文章“Extracting Company Names from Text” [27]。命名实体识别正式作为专业术语和研究领域是在第六届 MUC(Message Understanding Conference)会议上被Grishman 和 Sundheimt 提出的,随后该领域研究引起了越来越多人的关注。1999年,Bikel 等人[28]提出采用隐马尔可夫模型进行英文文本的命名实体识别,并且通过 MUC-6 测试集进行实验,实验结果显示:该模型的总体识别精度达到了 93%,第 1 章 绪论 5 召回率达到了96%;2009 年,Liao 等人[29]通过半监督的机器学习算法进行实体识别模型的构建,最早提出了采用条件随机场进行命名实体识别。
目前,经过多年的发展,实体识别技术已经有了很大发展,从早期到现在,主要有四类实体识别方法被提出,分别是基于规则、基于词典、基于统计和基于深度学习的方法。基于规则的方法一般需要通过对应文本语言的相关专家人工设计识别规则,并且通常和基于词典的方法进行结合使用。例如 Kim[31]用基于规则的方法对口语化的文本内容进行自动的命名实体识别,Hanisch[32]利用预先构建好的同义词典来识别生物医学领域相关文本中和蛋白质相关的术语。Quimbaya 等人[33]使用基于词典的方法提取电子医疗记录中的命名实体。但是由于基于规则和词典的方法移植性较差,并且在提高识别精确度以及召回率方面有很多局限性,所以研究者开始重视基于统计的方法。基于统计的方法需要一定的训练数据,通过有监督的机器学习算法学习训练语料中的特征和规律,从而根据学习到的特征和规律对新语料中的实体进行识别和标记。例如单词的形态和读音,句子的语法特征和单词出现次数等特征都可以被用来统计、学习,从而提高实体识别效果[34]。目前比较常用的基于统计的机器学习模型主要有:决策树、最大熵[35]、隐马尔可夫[36]、支持向量机[37]以及条件随机场[38]等模型。近几年,深度神经网络模型在一些语音识别以及图片处理等任务上取得了很大进展,许多研究者在其他自然语言处理任务中也都引入了神经网络模型[39]。例如,Collobert[40]最早在命名实体识别任务中引入神经网络模型进行特征抽取,从而减少特征工程的工作量。在此之后,神经网络模型越来越多应用到实体识别任务中,相关研究已经在本文研究背景中进行简要介绍。这些研究中主要用到卷积神经网络(CNN)、循环神经网络(RNN)、空洞卷积网络(IDCNN)、门控循环单元(GRU)以及循环神经网络的变体——长短期记忆网络(LSTM),相关研究者以这些模型为基础进行优化组合,加入其它算法及特征研究适用于不同领域、不同语言的效果更好的实体识别方法。其中应用最成功、最广泛的模型结构为双向长短期记忆网络加条件随机场(Bi LSTM-CRF)的模型组成结构。相比于其他类别的实体识别方法,基于深度学习的方法可以学到更多非线性联系,特征表示能力更强,但是基于深度学习的方法的识别效果比较依赖于输入的表示方法,因此可以在模型的输入表示方面进行更深入的研究,从而提升模型的实体识别效果。
第 1 章 绪论
1.3 论文的研究内容
本文主要研究目标为通过深度学习的方法构建软件工程领域的实体识别模型,模型构建过程中首先从Stack Overflow 官方数据转储中提取数据集,通过预处理提取对实验有用的数据,去除不相关数据,然后构造训练数据集。实验过程中将研究基于 BERT(由 Google 提出的一种基于双向 Transformers 编码器的预训练语言表征模型)的软件实体识别技术,探讨基于 BERT 的文本特征提取方法,从而在软件问答社区中进行文本挖掘、模型训练,达到软件社区中软件实体自动识别的目的。在问答社区的相关讨论中,内容的前后是有联系的,传统的前向神经网络不能很好的对这种数据进行建模,因此,本实验拟采用 LSTM网络进行语义编码并结合条件随机场 CRF 的转移特征对结果加以限制,从而预测最终的标签序列。由于图卷积网络 GCN 可以考虑句子的句法结构,所以实验中尝试在模型中加入图卷积网络,进行句子中句法结构特征的提取与表示,从而进一步提取实体特征,提高实体识别准确率。论文具体研究内容主要分为以下几个方面:
(1)Bi LSTM-CRF 基础模型构建。利用长短期记忆神经网络LSTM 构建经典的实体识别模型,在LSTM 网络的基础上增加一层反向LSTM 可以形成双向长短期记忆神经网络(Bi LSTM),其中正向的 LSTM 网络可以获取并记忆上文的信息,反向 LSTM 网络可以获取并记忆下文信息,所以利用双向 LSTM 可以更加充分提取输入语句的上下文语义信息。Bi LSTM 网络基于上下文特征对单个词进行独立的分类,但是分类结果没有考虑句子中单词与单词之间的约束关系。条件随机场 CRF 能够考虑输出标记之间的特殊性,因此需要在 Bi LSTM 网络之后接入 CRF 层确定最终的标注序列。该模型用于后续改进实验的参照基础。
(2)引入 BERT预训练语言模型。
BERT 采用的是双向 Transformer 作为编码器,和其他词嵌入模型相比BERT 可以获取句子级别语义特征以及上下文的语境。本文在基础的 Bi LSTM-CRF实体识别模型上添加BERT 预训练语言模型,通过预训练与微调两步获取软件工程文本的词嵌入向量,与传统词嵌入相比,更好的表征词的特征,有利于实体识别模型的特征提取与学习。
(3)引入图卷积网络 GCN,将句法信息融合到实体识别模型中。通过相关句法分析器分析标注数据的句法依存结构,得到的句法信息同词嵌入一起作为模型的输入,然后在编码层 Bi LSTM 之后添加图卷积层,通过图卷积网络把句第 1 章 绪论 法信息融入到模型中。
(4)针对深度学习方法需要大量标注数据的问题,提出数据集扩充方法。通过相关软件问答网站、数据库获取软件知识相关数据集。在获取软件资源数据集后,分析数据结构对其进行数据集解析、提取正文、去标记等文本预处理操作,然后通过词典以及实体识别模型对数据进行标注。文章[3]中提供了软件工程领域实体识别的小型标注数据集,但是大部分深度学习模型都需要数据量比较大的训练语料,本文实验从Stack Overflow 社交编程网站中获取问答转储信息,并根据问答信息的关注程度,问题及答案质量等因素选取问答信息,并对文本信息进行预处理,然后根据从小型标注数据训练的实体识别模型以及预先构建的实体词典对预处理后的数据进行标注,从而对小型标注数据集进行补充。
1.4 论文的组织结构
本文首先介绍了选题的背景意义以及相关技术的研究现状,为后续工作打下基础,然后介绍了怎样基于经典的 Bi LSTM-CRF 网络构建基础的软件工程领域的实体识别模型,之后又介绍了通过 BERT 预训练语言模型和图卷积网络 GCN分别从词向量表示以及句法特征的融合等方面对模型进行改进,其次还介绍了本文扩充小型数据集的方法,最后总结本文所能得到成果和不足之处,提出未来的改进方向。文章具体组织结构如下:
第一章, 绪论。主要介绍了软件问答社区与实体识别方法的研究背景以及发展现状,分析软件工程文本的挖掘和应用方向,总结现存实体识别方法存在的不足,以及构建软件工程领域实体识别的意义。同时介绍了软件工程文本的挖掘、实体识别以及本文所用其他技术的国内外研究现状。
第二章, 基于 Bi LSTM 的软件命名实体识别方法。通过经典的实体识别模型构建软件工程领域的实体识别方法。首先介绍LSTM 以及Bi LSTM-CRF 的模型结构以及训练方法,然后以 Bi LSTM 为基础从输入层、编码层、输出层的详细设计介绍软件工程领域实体识别模型构建过程,最后对模型进行参数调优以及实验验证。
第三章, 加入BERT预训练语言模型与GCN图卷积网络的软件实体识别方法研究。在上一章构建的软件工程领域实体识别模型基础上分别第 1 章 绪论 入 BERT 预训练语言模型与图卷积神经网络(GCN)进行词的上下文表征与句法特征的嵌入。详细介绍通过 BERT 预训练软件工程领域词向量模型的过程,以及通过图卷积网络融合句法依存特征的原理。
第四章, 针对深度学习模型需要大量标注语料的问题,尝试使用模型预测结合词典匹配的方法进行小型标注数据的扩充。该章从扩充数据的获取、预处理,以及词典的构建、模型结合词典的标注过程到最后的人工检查进行详细介绍。
第五章, 总结与展望。总结本文的主要工作和不足之处,提出未来更进一步的研究方向。
1.5 本章小结
本章首先介绍了本文研究的背景和意义,分析了在软件开发进入网络化大众化的今天,编程网站积累了大量的软件工程领域的相关信息,对这些信息进行挖掘研究是有意义的事情。同时提出基于这些软件工程领域的文本信息进行软件工程领域实体识别模型的构建,不仅为软件实体抽取、软件知识库的构建和知识图谱的构建提供支持而且可以支持软件工程领域的信息检索、机器翻译、问答系统等以软件实体为中心的相关应用的发展。然后对软件工程领域社交文本、实体识别技术等本文涉及到的相关技术的研究现状进行介绍。再然后重点介绍了本文的主要研究内容为构建软件工程领域的实体识别模型,并从词嵌入、模型结构、数据集的标注扩充等方面对模型进行改进。最后对本文的整体组织结构进行了介绍。