hadoop官方文档_一种由源代码和文档自动化构建领域术语库的学习方法

20d74da838f4e9f8932b0b83421e790d.png

5142b1069d83200304305e919b6144f8.png

Abstract

一个用来组织特定领域概念,及其别称和关系的领域术语库,对于知识获取和软件开发是必要的。现有的方法采用语言启发法 & 基于词频的统计方法从软件文档中识别特定领域的词汇,但准确率通常很低。本论文中,我们提出一种由源代码和软件文档自动化构建领域术语库的学习方法。该方法使用一组从代码标识符和自然语言概念定义中识别出来的高质量种子词汇,来训练一个特定领域预测模型,根据提及特定领域概念的句子的词汇和语义上下文,来识别领域术语。然后,将相同概念的别称进行合并,为每一个概念选择一组解释性语句,并在这些概念间建立“is a”,“has a”和“related to”的关系。我们将此方法应用到深度学习领域和Hadoop领域,分别获得了5,382个概念和2,069个概念,16,962个关系和6,815个关系。我们的评估验证了所抽取领域术语库的准确性,以及它对从不同项目的不同文档中获取、融合知识的有用性。

1 Introduction

软件项目通常属于特定领域,例如,TensorFlow和PyTorch是深度学习库,Hadoop和HBase是分布式数据库系统。每个领域都有一组业务或技术概念,这些概念在领域的软件项目源代码和文档中经常被提到。它们会以全称或者别称(缩写和其他形态的变体)的形式被提及。许多概念是相互关联的,如hypernym-hyponym、whole-part等。组织特定领域的概念,以及它们在领域术语库中的别称和关系,对知识获取和软件开发是至关重要的。此外,基于领域术语库,我们可以从语义上来链接来自不同工件的元素(例如,类/方法、API、问答帖子、文档片段等)。这些链接可以帮助许多软件工程任务,如开发人员问题回答、可追溯性恢复和维护、特征定位、API推荐和代码搜索。由于领域的复杂性和快速发展,手工构建一个综合领域术语库往往是费力而昂贵的,因此从不同种类的软件工件中自动提取词汇术语或领域概念的研究被提倡。一些研究从需求文档中提取词汇术语。这些方法使用语言启发法或基于词频的统计方法,从名词短语中识别领域特定词汇,通常准确性很低。并且,这些方法只能聚类相关术语,并不能识别别称,及其与特定概念之间的关系。一些研究从Stack Overflow这类问答网站上提取领域概念,但对领域相关性的估计依赖于Stack Overflow上的标签和人工标记。本文中,我们的目标是从同一领域软件项目的源代码和文档中,以一种无监督的方式提取特定领域的概念,以及它们的别称和关系。这项任务的挑战体现在几个方面:首先,领域概念和它们之间关系的知识通常被分散在不同的文档,甚至是不同的项目中;其次,相同的概念通常在不同的地方,以不同的别称被提及;最后,概念和特定领域的相关性不能由词汇启发法或术语频率被可靠确定。在这项工作中,我们提出一种由源代码和软件文档自动化构造领域术语表的学习方法。我们方法的基本思想是双重的:首先,文档中特定领域的概念经常作为源代码中的标识符使用,概念之间的关系可以从对应代码元素间的结构关系中推断出来。其次,使用提及从代码标识符和自然语言概念定义中识别出的高质量种子术语的句子作为训练数据,我们可以得到一个特定领域的预测模型,从而根据提到特定领域概念的句子的词汇和语义上下文,去识别更多的领域术语。基于这两种思想,我们的方法首先从目标领域不同项目的源代码和文档中提取一组候选术语,然后将相同概念的别名合并为它们的规范名称。在此之后,我们的方法为每个概念选择一组解释性句子,进一步识别概念之间的“is a”(hypernym-hyponym)、“has a”(whole-part) 和 “related to”关系。我们在两个技术领域(deep learning 和 Hadoop)实现了该方法并开展了实证研究。研究得出了以下结论:一、我们的方法在基于文档的领域术语库提取方面要优于最新方法;二、领域术语库提取为从不同项目的不同文档中领域知识的融合提供了一种有效的方法。三、提取的领域术语库能够对WikiPedia等通用知识库进行补充。四、提取的领域术语表可以帮助开发人员更有效地从文档中获取所需知识。

本文的主要贡献如下:

1. 我们提出一种由源代码和文档自动化构建领域术语库的学习方法

2. 我们将此方法应用于 deep learning 领域和 Hadoop 领域,分别获得了5,382个概念和2,069个概念,16,962个关系和6,815个关系。

3. 我们评估了领域术语提取方法的有效性,以及所提取的领域词汇在知识融合和软件知识获取方面的有用性。

3 Approach

图1给出了方法的概述,它包括预处理、概念提取和关系/解释识别这三个阶段。

30c0a6914aff82450848df6b335ee5f2.png

预处理的目的是从输入语料库中提取有用的信息,并为后续阶段准备所需的数据。它包括两个步骤,即代码分析和文档分析。代码分析是对源代码进行分析并从代码中提取代码元素(eg. 包和类)及其关系( eg. 包含、继承和聚合)。文档分析是对文档进行解析,并从中提取句子。概念提取的目的是从源代码和文档中提取领域概念。它包括种子术语提取、扩展术语提取、别称合并这三个步骤。 种子术语提 取采用启发式方法在代码元素的帮助下从句子中识别出一组初始种子术语。 将种子术语作为 初始标记数据,扩 展术语提取使用 半 监 督 学 习方法迭代地 从句子中 识别出更多的候选术语。 请注意,这些候选术语 可能是相同概念的别称。 因此,别称合并用于标识和合并从不同句子中提取的概念别称(eg.  形态同义词和缩写) 。关系/解释识别的目的是为所提取的领域概念提供关系和解释。它包括两个步骤,即关系识别和解释提取。关系标识借助代码元素来标识概念之间的“is  a”、“has a”和“related to”关系。解释抽取为每个概念选择一组解释性句子。
3.1 预处理
我们的实现包括Java和Python的代码分析器,它们分别基于javalang和Python的内建模块ast来实现。代码分析器从源代码中提取包、模块、类以及它们之间的各种关系。许多项目的技术文档都是可在线获取的网页,我们为此实现了一个基于Scrapy的爬虫来获取文档。我们使用BeautifulSoup来解析所获得的web页面,然后通过处理不同类型的特殊HTML元素来清理所获得的网页内容,复原被“p ”、“li ”等标签破坏的句子。 最后,我们从内容中提取出纯文本,并根据标点符号将文本分割成句子。
3.2 种子术语提取
种子术语提取使用启发式方法自动识别一小组具有高置信度的术语。为了找到一组最优的启发式,我们尝试不同的启发式组合( eg.  提取文本中的全大写单词、代码中的局部变量/参数名作为种子术语),并根据结果进行调整。最后,我们选择了以下两个启发式规则,用于从源代码和文档中提取高质量术语。
  • 首字母缩略词在文档中以全称出现

如果一个首字母缩略词与其全称一并出现在文档中,那么该首字母缩略词就很可能是一个术语。这一规则体现在以下三个句型中。 A. [full name] ([acronym]) eg.  “By design, the output of a recurrent neural network(RNN) depends on arbitrarily distant inputs.”

B. [acronym] ([full name])

eg. “Feed forward neural networks are comprised of dense layers, while recurrent neural networks can include Graves LSTM (long short-term memory) layers.”

C. [acronym]:[full name]

eg. “Enumeration used to select the type of regression statistics to optimize on, with the various regression score functions - MSE: mean squared error -MAE: mean absolute error - RMSE: root mean squared error - RSE: relative squared error - CorrCoeff: correlation coefficient.”。

为了实现这一规则,首先我们将句子与上述三个模式相匹配,然后根据缩略词确定全称。例如,根据首字母缩写“RNN”,我们可以识别出括号前的由三个单词构成的短语“recurrent neural network”,作为其全称。对于每一个匹配的首字母缩略词,其本身和全称都被视作种子术语。
  • 包/类名出现在文档中

如果包/类的名称在文档中以普通文本的形式出现,该名称很有可能是术语。例如,在句子“During NN training, each X iterations, executors will send encoded dense updates with lower threshold”中,“NN”是包 “org.deeplearning4j.nn”的名称。这里的“NN”是指神经网络,可以看作种子术语。考虑到更细粒度的代码元素(参数&局部变量)会产生大量的术语,而绝大多数都是错误的。为了确保种子术语的质量,我们在提取种子术语时只考虑粗粒度代码元素( eg. 包和类)。为了实现这一规则,我们获取代码元素中所有包和类的名称,并按照驼峰大小写进行分割。然后,我们在所有句子中搜素被分割的单词或短语(不区分大小写),并将所有匹配的单词或短语作为种子术语。由上述两条规则抽取的种子术语也有可能是碰巧用作包/类名称的普通短语,或者不是特定目标领域的通用技术术语。例如,在句子“Computes the aggregate score as a sum of all of the individual scores of each of the labels against each of the outputs of the network”中,“a sum”碰巧是类“org.nd4j.linalg.api.ops.impl.accum.ASum”的名称,但显而易见这一短语并不是一个术语。通用技术术语包括那些与文件或者字符串操作相关的术语。这些普通短语和通用技术术语需要被消除,来确保所提取种子术语的质量。为此,我们还使用以下三种规则来进一步消除不相关的术语,满足任一条件的种子术语将被消除。
3.3 扩展术语提取
扩展术语抽取使用机器学习方法从句子中识别出更多的术语。它将术语识别看作一个序列标记任务,即预测一个观察序列对应的标签序列。有许多NLP问题可以通过序列标记来解决,例如词性标记(POS)、分块和命名实体识别(NER)等。针对这个任务,我们采用的标记方法是IOBES,它被广泛应用于序列标记任务中。 在IOBES模式中,“B”、“I”和“E”分别表示当前标记是一个术语的开始、中间 和结束; “S”(“Single”)表示当前标记本身构成一个术语; “O”(“Outside”)则表示普通标记。 例如,一个包含两个术语(即“recurrent neural network”和“RNN”)的句子的标记如下所示。

e63b622789cdc4a00adeb426f8408f16.png

用于术语识别的机器学习方法是被广泛使用的 LSTM-CRF模型,它结合了LSTM神经网络和CRF层,是一个端到端的学习模型,不需要人工标记的特征。我们使用Guillaume提供的LSTM-CRF模型来实现。为了训练模型,我们为标记数据的每个句子生成一个序列对(输入标记序列 + 对应标签序列),并将这些序列对作为模型的训练数据。当用于术语识别时,该模型将“由输入语句生成的标记序列”作为输入,输出一个标签序列。输出标签序列中标记为“S”的单词,以及标记为“B”,“I”和“E”的短语将被标识为领域术语。在训练和预测阶段,我们使用预训练的词向量来表示输入标记序列中的标记,由微调GloVe词向量所得。我们的实现是基于 glove.840B.300d,word2vec用gensim实现。我们使用一种半监督的方法来训练模型,并使用一个迭代过程去识别更多的术语。该过程从种子术语开始,将包含种子术语的句子作为标记数据,将所有其他句子作为未标记数据。每次迭代后,训练一个术语识别模型,用于从句子中识别更多的术语。与种子术语的提取方式相似,这个迭代的术语提取过程也使用上述三条规则去过滤不相关术语。然后,我们将所有具有新识别术语的未标记句子添加到已标记数据中,开始下一次的迭代。这种过滤策略保证了迭代添加到标记数据中的句子质量。当满足以下任一条件时,整个迭代过程结束:  1)训练后的模型没有识别出新的术语; 2)迭代次数达到预设限制; 3 )没有未标记的句子。 在最后一次迭代中,所有新识别的术语都被接受,除了那些在名称开头或结尾包含停用词的术语。为了保证所提取术语的质量,我们进一步细化种子术语提取和扩展术语提取,来产生候选术语。首先,消除通用技术术语。我们使用以下等式来估计一个术语的普遍性。freq_g(t), freq_d(t) 是一个术语t在通用技术语料库 & 领域语料库中出现的频率;TN_g(t), TN_d(t)是一个术语t在通用技术语料库 & 领域语料库中的出现次数。N_g和N_d是通用技术语料库 & 领域语料库中的标记数量。 我们消除了普遍性高于阈值的术 语,阈值是根据多次试 验优化 而选取的。 我们使用的 通用技术 语料库包括 JD K 8 和 Pyt hon  3.6 的参考 文档 。 例如,“ACM”, "App" 和 "number values"就是通过这种规则被消除的。

7970590dc0025eca8200253c462e8f7c.png

其次,对于每个包含一个缩略词的术语,将其缩略词作为候选术语加入。例如,“AIS data”是一个候选术语,因此“AIS”也作为一个候选术语被加入。
3.4 别称合并
这一步的目的在于从候选术语中识别相同概念的别称,并将它们合并在一起形成一个概念。这一步骤主要处理技术文档中广泛存在的两种概念别名,即形态同义词和缩写。首先对所有候选术语进行归类,然后识别并合并形态同义词,最后识别并合并缩写词。 3.4.1 形态同义词 的识别和合并

技术文档中典型的形态同义词包括:1)仅在大小写或者单/复数形式上不同的单词或短语,如“Deeplearning4J” 和 “Deeplearning4j”,“RNN” 和 “RNNs”。2)拼写不同 & 拼写错误的单词或短语,例如“Deeplearning4J”和“Deeplearnning4J”。3)以不同方式使用连字符的单词或短语,例如“t-SNE” 和 “tSNE”。

第一类形态的同义词可以通过词形还原来直接识别。 对于另外两种类型,我们使用编辑距离来确定两个单词或短语是否为形态同义词。我们使用Damerau-Levenshtein距离(DL距离)来度量两个单词或短语的相似性。DL距离是将一个单词或短语转换为另一个单词或短语所需的最小操作数(插入、删除或替换单个字符,或转置两个相邻字符)。考虑到不同长度的单词或短语,我们计算两个单词或两个短语(s1和s2)之间的相对距离RDistance(s1,s2),如下式所示。其中,Distance(s1,s2)是s1和s2之间的DL距离,length(s)是一个字符串s的长度。

03dfad949f90658ab0c0cd7b6b6724e6.png

例如,“Deeplearinng4J”可以通过“i”和“n”的换位操作转换为“Deeplearning4J”,因此这两个词的DL距离为1;同理,“RNN”和“NN”的DL距离也为1。这两对单词的DL距离相同,但是 “RNN” 和 “NN” 的相对距离(1/3)远大于 “Deeplearinng4J” 和 “Deeplearning4J” (1/14)。对于两个单词或短语,如果它们的DL距离和相对DL距离都低于预定义的阈值,我们就将它们视为一对形态同义词。阈值的选取基于形态同义词的轨迹选择:首先将DL距离阈值固定为2,通过实验搜索相对DL距离的最优阈值,然后通过确定相对DL距离阈值,来寻找DL距离的最优阈值。 在识别出的形态同 义词的基础上,我们通过计算传递闭包,构造了领域概念的别称集合,即迭代地将 形态同义词合并在一起。 对于 没有 形态同义词的任何候选术语,我们构造一个别称集合,其中只包含 术语本身。 3.4.2 缩略 关系的识别与合并技术文档中典型的缩略关系包括: 1)一个单词是一个短语的首字母缩写,例如“NN”和“neural network”。 2)一个单词是另一个单词的前缀,例 如“net”和“network”。 3)两个短语在消除它们常见的头尾词之后(如“neural net”和“neural network”),满足上述两种关系中的一种。 满足上述三个条件之一的任意两个单词或短语都被视为候选缩略关系。 因此,我们可以根据所识别的候选缩略关系进一步合并别称集合。 这里的难点在于,一个候选术语可能与多个其他候选术语具有缩写关系,但它通常只是其中一个候选术语的缩写。 例如,“RNN”是“Recurrent Neural Network”和“Recursive Neural Network”的候选缩略形式,但它在深度学习中通常是前者的缩写。 因此,我们只需要为别称合并中的缩写确定一个全名。 对于一个别称集合 AS,它与一组其他别称集合ASSet存在候选缩略关系,我们根据上下文相似度,按照以下方法确定ASSet中唯一的别称集合,作为AS的全称。我们计算AS和ASSet中每个别称集合的上下文相似度,作为它们对应向量的余弦相似度。别称集合的向量是通过对别名集合中包含候选术语的所有句子的向量求平均得到的,而句子的向量是通过对句中所有单词的预训练向量求平均得到的。基于上下文相似性,我们从ASSet中选择具有最高上下文相似性的别称集合,其全称为AS。根据最终确定的缩略关系,迭代地合并具有缩略关系的别称集合。别称合并后,每个别称集合被视作一个领域概念,集合中所有候选术语被视作别称。例如,我们可以得到以下领域概念及其别称:“RNN”(“RNNs”, "递归神经网络",“Rnn",“recurrent neural network”,“recurrent neural networks”,“rnn”);"neural network"("NN",“neural net”,“Neural Net”,“Neural Network”,“Neural Networks”,“Neural net”,“Neural network”,“Neural networks”,“neural nets”,“neural networks”)。
3.5 关系抽取
所提取领 域概念之间的关系往往隐藏在文档的特定句型,以及代码元素的结构化关系中。 通过对文档和代码的分析,我们识别了被抽取概念间的"is a",“has a”和“related to”关系。 对于两个概念 C1 和 C2 ,我们从以下几个方面来确定它们之间的"is a",“has a”和“related to”关系。 首先根据Hearst Patterns,从提及C1 和 C2的句子中识别 "is a" 关系。 该模式广泛用于从不受限制的文本中自动获取上下位词汇关系。 我们当前实现所用的模式如表一所示,其中C1和C2可以是对应概念的任何别称。 其次,根据包和类之间的结 构化关系,识别“is a”和“has a”关系。 对于两个名称分别是C1和C2别称的包或类E1和E2: 1)如果E1包含E2,或者将E2作为一个属性聚合,在C1到C2间加一个“has a”关系。 2)如果E1继承E2,在C1到C2间加一个“is a”关系。 最后,基于概念别称间的前后缀关系,识别“is a”和“has a”关系。 1)如果C1的一个别称是C2的一个别称的前缀,在C1到C2间加一个“has a”关系。 2)如果C1的一个别称是C2的一个别称的后缀,在C2到C1间加一个“is a”关系。为了提供更丰富的概念关系,我们进一步识别所提取概念间的“related to”关系,这种关系要弱于"is a"和“has a”关系。“related to”关系的识别基于两个概念之间的相似度:如果两个概念间的相似度高于预定义的阈值,则在它们之间添加一条双向的“related to”关系。上下文相似度的计算基于以下等式,它结合了两个概念的词汇相似度以及上下文相似度。

72e186c35c1bf7447e588e957df387cd.png

C1和C2的词汇相似度是它们别称的标记集合间的 Jaccard similarity。

ae927481de2fa48769dd10fdb02511bb.png

C1和C2间上下文相似度的计算方法与合并别称时使用的上下文相似度相似: a. 通过对提及概念的所有句子的向量求平均,来为每个概念生成一个向量; b. 计算概念向量之间的余弦相似度。我们的实现中,相似度阈值设置为0.5,w1和w2分别设置为0.25和0.75。阈值和权重是基于“related to”de 轨迹识别来确定的:我们首先将阈值固定为0.5,通过实验搜索w1的最优值,然后我们通过确定w1来寻找一个最佳阈值。下面是一些从不同方面提取概念关系的例子: 请注意,有些“related to”关系可能是“is a”或“has a”关系。 例如,L1是机器学习中一种常用的避免过拟合的正则化方法,但由于它们之间的“is a"关系缺乏句子和代码元素的支持,只提取到一个“related to”的关系。 两个概念之间可能不止一种关系,例 如“RNN”和“neural network”之间同时具有“is a”和“has a”的关系。
  • {SGD, is, a, optimizer}提取自句子“torch.optim: Contains optimizers such as SGD.”,基于Hearst Patterns。

  • {NN, has a, Activation Layer} 基于包之间的包含关系被提取,例如 org.deeplearning4j.nn 和 org.deeplearning4j.nn.layers.ActivationLayer。

  • {RNN, has a, RNN Layer}和{recurrent neural network, is a, neural network}是基于概念名称间的前后缀关系被提取的。

  • {L1, related to, Regularizer}是基于概念的上下文相似度被提取的。

3.6 解释抽取
解释抽取的目的是为每个领域概念选择一组有助于用户理解该概念的句子。这些句子通常可以分为以下几类。
  • 概念定义:为概念和相关技术提供定义,例如分类法、含义解释;

  • 技术评论:对某一概念和相关技术的特点进行评论,如优点和缺点,与其他技术的比较;

  • 用法指导:建议使用概念和相关技术的正确方法,例如适用场景、相关设置的指导、常见问题解决方案。

我们需要过滤掉那些提到一个概念但对理解这个概念毫无用处的句子。这些句子可能是不完整的低质量的句子,或者是讨论低级实现的句子(例如,使用概念来解释代码元素的功能)。我们将所有提到一个领域概念的句子作为该概念的候选句子,并使用以下启发式规则过滤掉无用的句子。符合以下任何规则的候选句子将被过滤掉。例如,对于“Activation Layer”这一概念,我们选择以下两个句子作为其解释性句子: 1)“Activation layer is a simple layer that applies the specified activation function to the input activations.”  2)“Activation Layer Used to apply activation on input and corresponding derivative on epsilon.” 下面两句话则被过滤掉: 1)“Imports an Activation layer from Keras.”  2)“Advanced Activation Layers.” 4 实例研究 我们在两个技术领域实现了实证研究。基于研究结果,我们评估了领域概念提取方法的有效性,以及所提取领域概念对于软件开发任务的有用性。 4. 1 研究设计 我们选择的两个学科领域代表了两种技术领域。深度学习领域包括用不同语言编写的软件库,并为深度学习应用程序的开发提供类似的功能。Hadoop领域是一个由相互依赖的软件系统组成的软件生态系统。我们为深度学习领域选择的主题项目是三个流行的深度学习库:“Deeplearning4j 1.0.0-beta3”,“Tensorflow 1.12”,“PyTorch 1.0.0”。其中,Deeplearning4j是用Java编写的,Tensorflow和Pytorch是用Python编写的。 我们为Hadoop领域选择的主题项目 有Hadoop 2.9.2,HBase 2.1.0,Hive 2.3.4。 Hadoop是一个基于MapReduce模型的分布式数据存储和处理框架。 HBase是一个运行在HDFS之上的分布式数据库,为Hadoop提供了 Bigtable-like 的功能。 Hive提供了一个 类似SQL接口,去查询存储在各类数据库中的数据,以及与Hadoop集成的文件系统。 这三个项目都是用Java编写的。这六个项目都是开源的。我们抓取这些项目的源代码以及在它们的官方网站上的文档。文档包括官方项目介绍、用户指南/手册、教程和API参考文档。对于这两个领域,我们使用我们的方法来提取领域概念、概念间关系和解释性句子。 基于研究结果,我们设计了一系列问题来回答以下研究问题。
  • RQ1: 所提取的领域概念、关系和解释有多精确?在领域词汇表提取方面,该方法是否优于现有方法?

  • RQ2: 所提取的领域词汇表如何融合来自不同项目和文档的知识?提取的概念如何对WIkiPedia等通用知识库进行补充?

  • RQ3: 提取的领域词汇表是否能够帮助开发人员获得所需知识?

4.2 基本结果
对于深度学习领域,我们识别出471个种子术语,在扩展术语提取中识别出6,645个附加术语。这些候选术语在别称合并后,最终会被转变为5,382个概念。这些概念总共有7,116个别称,每个概念有1到22个别称(平均1.32个)。从这些概念中提取16,962个关系,其中包括119个 “is a” 关系,709个 “has a” 关系,16,134个 “related  to” 关系,每个概念有1到115个关系(平均6.30个)。为这些概念提取了1,689个解释句子,每个概念对应0到69个句子(平均0.31个)。对于Hadoop领域,我们识别出了202个种子术语,在扩展术语提取中识别出2,537个附加术语。这些候选术语经过别称合并后,最终转化为2,069个概念。这些概念总共有2,739个别称,每个概念有1到12个别称(平均1.32个)。为这些概念提取了6815个关系,其中135个“is a”关系,479个“has a”关系,6201个“related  to”关系,每个概念有1到150个关系(平均6.59)。为这些概念提取1,311个解释句子,每个概念对应0到68个句子(平均0.63个)。图2显示了为深度学习领域提取的概念和关系的片段。这个片段解释了一组深度学习概念之间的关系,如NN、RNN、CNN、LSTM、LSTM  Cell、RNN Cell、Seq2Seq。表2显示了部分概念的别称和解释性句子。

ad11fa361020004266f10ecd2d8c5804.png

41051f355d9bce5cfbb57758b31d7eb4.png

4.3 准确率(RQ1)
如表3所示,我们的方法在术语提取、别称合并、关系识别、解释提取等方面都取得了较高的准确率。 对于术语提取,错误提取的术语包括:

1)非概念短语,如“network learn”(deep learning) 和 “table exists(Hadoop)”;

2)与领域无关的概念,如“Google Cloud”(deep learning) 和 “Webapp”(Hadoop);

3)带有无意义限定符的概念,如“second tensors”(deep learning),“given rows”(Hadoop)。

对于别称合并,错误识别的别称关系包括:

1)相似但含义不同的术语,如“opencl”和“opencv”(deep learning);

2)错误合并的缩写和全称,如“RR”和“random row”(Hadoop,正确的全称是“Record Reader”)

对于关系识别,错误提取的概念关系包括:

1)错误概念间的错误关系,如{contrib, has a, Early Stopping} (deep learning,“contrib”不是一个术语)

2)词汇相似术语间错误的“related to”关系,如{specified nodes, related to, specified metric} (Hadoop, 这两个术语在词法上相似但并不相关)

对于解释提取,错误提取的句子不能提供有用的解释和指导,如对于“reparameterized sample”的句子“The reparameterized sample therefore becomes differentiable.”。

e5620d4fc9d8d88c719943a71ca63126.png

根据抽 样方法,我们从每个领域中选择384个句子,并与 Arora 等人的方法进行比较。 在 deep learning 领域和 Hadoop 领域,人工标注的协议率分别为0.776和0.805。 对比结果如表4所示。 对于每种方法,我们提供每个领域术语抽取的精确度、召回率和F1-值。

b1d1654468e3a7d6c932606c223be5e0.png

可以看出,在深度学习领域,我们的方法在精度和召回率方面都显著优于 Arora 等人的方法。他们的方法是基于名词短语的识别,因此可能会提取出许多不相关的单词和词语,特别是首字母缩略词,如深度学习领域的“specified value”,“AND”和“IT”,以及Hadoop领域的“Hadoop example code”,"ONLY"和“OR”。在 Hadoop领域,我们的方法在精度和F1-值方面是优于Arora 等人的方法,但在召回率方面要逊于它们的方法。研究发现,我们的方法在Hadoop领域取得较低召回率的原因在于这两个域之间的差异。在我们的研究中,Deep  learning 领域由三个功能相似的可选库组成,这些项目共享许多术语;虽然Hadoop领域由三个相互依赖的软件系统组成,但它们提供不同的功能,并且这些项目共享的术语要少得多。我们的方法依赖于不同项目共享术语的规则来识别训练数据,进行术语提取,因此它识别和提取出的Hadoop领域的训练术语较少。综上所述,我们的方法总体上优于Arora等人的方法;当目标领域包含提供类似功能的项目时,它的性能会更好。
4.4 知识融合(RQ2)
我们的方法收集了来自不同项目和文档的术语、概念和解释。为了评估我们的方法是如何融合来自不同项目和文档的,我们分析了在不同项目和文件中提取的术语、概念以及解释的分布。表5统计了不同项目中的知识融合情况,即不同项目的不同文档中包含了多少术语、概念和解释性句子。对于深度学习领域,如果一个人阅读某个具体项目的单个文档,他最多可以学到58%的术语、53.7%的概念和29.5%的解释性句子;对于Hadoop领域,相应的比率是45.7%,40.9%和40.6%。从分析中可以看出,要融合来自不同项目的不同文档中的知识,对特定领域的概念就必须有个全面的理解。例如,缩写“GAN”出现在Tensorflow的文档中,但其全称“Generative Adversarial Networks” 只能在 Deeplearning4j中找到,其解释只能在Pytorch中找到。

1d3c168e02d5a27ff9a35996df7e443d.png

我们进一步分析了在每个领域中抽取的384个词汇与维基百科的互补性,以此来对术语抽取进行评估。对于每一个术语,我们都要手动去维基百科中检查,看它是否包含相同的含义。表6显示了互补性分析的结果,包括确认的词汇数量、维基百科中包含的词汇词汇数量和比例。从表中可以看出,我们所提取的,两个领域的术语分别只有23.0%、28.0%包含在维基百科中,与维基百科的互补性很强。维基百科包含了一些特定领域的术语,比如深度学习领域的“RNN”和“LSTM”,但是漏掉了更多特定领域的术语。例如,我们的方法将“computation graph”定义为深度学习领域的一个术语并提供了有用的解释,但它并没有包含在维基百科中。因此,我们的方法提取的概念、关系和解释能够很好地补充维基百科等通用知识库。

326d8ef01de15facf0db7cdfc5a7214b.png

4.5 有用性(RQ2)

我们设计了一个实验来研究所提取的领域词汇表是否可以帮助回答实际开发人员的查询。对于一个查询,我们使用一个文档搜索引擎来搜索目标领域的文档语料库,然后使用基于所提取的领域词汇表的查询扩展再次执行文档搜索,并比较查询扩展前后的性能。

我们从100个最高投票数的Stack Overflow上的问题中选择12个,标签为“deep learning”或“Hadoop”的问题。这些问题与领域概念相关,并且可以由文档来回答。所选择的句子如表7所示,其中Q1-Q8与deep learning相关,Q9-Q12与Hadoop相关。对于每个问题,将其标题作为查询,并计算查询结构的三个指标:准确度(P),表示相关句子在排名前10的句子中所占的比例;平均精度(AP),所有相关结果检索后得到的精度分数的平均值。排名倒数,第一个正确结果位置的倒数。

66398a4dfd2286f78e620a65a07cd39c.png

表8给出了查询扩展的评价结果,比较累每个问题查询拓展前后的性能。可以看出,在领域词汇表的帮助之下,查询扩展极大地提高了深度学习和Hadoop领域的文档搜索表现。

326c2a4292f81b3c63dafc5c0d544a83.png

在问题Q2、Q7、Q8、Q10、Q11、Q12上,查询扩展表现得很好。我们可以看到,这些查询与概念的理解非常相关。相反,查询扩展在Q3、Q9上的表现不太有效。这两种查询都要求使用对应软件库、系统的具体技术解决方案。造成这种差异的一个原因可能是,具体的技术解决方案与特定项目和基本技术相关,而不是整个领域和高层概念。这促使我们考虑将领域词汇表与更通用的背景知识库集成起来,为软件知识的获取提供更好的支持。

5 结论

本文中,我们提出了一种由源代码和软件文档自动化构造领域术语库的学习方法。我们在deep learning领域和Hadoop领域进行了实证研究,研究证实了所提取领域术语的准确性,以及它对获取和融合不同项目的不同文档中知识的有用性。未来工作中,我们计划改进该方法,细化提取的过程,并与通用知识图谱集成,将构造的领域术语应用到更多的软件工程任务。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值