没有合适的资源?快使用搜索试试~ 我知道了~
16930StaQC:来自StackOverflow的系统挖掘的问题-代码数据集0Ziyu Yao † , Daniel S. Weld # , Wei-Peng Chen †† , Huan Sun †0† 俄亥俄州立大学,# 华盛顿大学,†† 美国富士通实验室{yao.470,sun.397}@osu.edu,weld@cs.washington.edu,wei-peng.chen@us.fujitsu.com0摘要0StackOverflow(SO)是自然语言问题及其代码解决方案(即问题-代码对)的重要来源,对于包括代码检索和注释在内的许多任务至关重要。在大多数现有研究中,问题-代码对是根据启发式方法收集的,往往质量较低。在本文中,我们研究了一种从StackOverflow中系统地挖掘问题-代码对的新问题(与启发式收集相对)。它被定义为预测代码片段是否是问题的独立解决方案。我们提出了一种新颖的双视图分层神经网络,可以捕捉代码片段的编程内容和文本上下文(即两个视图)以进行预测。在Python和SQL领域的两个手动注释数据集上,我们的框架的性能显著优于启发式方法,F1和准确性至少提高了15%。此外,我们使用我们的框架自动从SO中挖掘了迄今为止最大的数据集StaQC(StackOverflow问题-代码对),其中包含约148K个Python和约120K个SQL问题-代码对。在各种案例研究中,我们证明StaQC可以极大地帮助开发与编程语言相关的自然语言模型1。0CCS概念0• 信息系统 → 网络搜索和信息发现;问题回答;信息提取;•软件及其工程 → 自动编程;0关键词0自然语言问题回答;问题-代码对;深度神经网络;Stack Overflow0ACM参考格式:Ziyu Yao † , Daniel S. Weld # , Wei-Peng Chen †† , HuanSun † . 2018. StaQC: A Systematically Mined Question-Code Datasetfrom Stack Overflow. In WWW 2018: The 2018 Web Conference, April23–27, 2018, Lyon, France. ACM, New York, NY, USA, 11 pages.https://doi.org/10.1145/3178876.318608101 可在https://github.com/LittleYUYU/StackOverflow-Question-Code-Dataset找到。0本文发表在Creative Commons Attribution 4.0 International (CC BY4.0)许可下。作者保留在个人和公司网站上传播作品的权利,并附上适当的归属。WWW2018,2018年4月23日至27日,法国里昂 © 2018IW3C2(国际万维网会议委员会),根据创作共用CC BY 4.0许可发布。ACM ISBN978-1-4503-5639-8/18/04。https://doi.org/10.1145/3178876.31860810这非常详细:0适用于所有这些(不会损害已取消的版本):0>>> convert('CamelCase') 'camel_case' >>>convert('CamelCamelCase')'camel_camel_case'0或者如果您要调用它一万次,可以预编译正则表达式:0first_cap_re = re.compile('(.)([A-Z][a-z]+)') all_cap_re =re.compile('([a-z0-9])([A-Z])') def convert(name): s1 =first_cap_re.sub(r'\1_\2', name) return all_cap_re.sub(r'\1_\2',s1).lower()0不要忘记导入正则表达式模块0import re0def convert(name): s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2',name) returnre.sub('([a-z0-9])([A-Z])',r'\1_\2',s1).lower()0图1:在SO中回答问题“Elegant Python function to convertCamelCase to snake_case?”的被接受答案帖子。S i ( i = 1 , 2 ,3 , 4 )和 C j ( j = 1 , 2 , 3 , 4)分别表示句子块和代码块,根据HTML格式可以轻松地将它们分开。01 引言0在线论坛,如StackOverflow(SO)[40],贡献了大量的代码片段,理解和重用这些代码片段可以极大地加快软件开发的速度。为了实现这个目标,最近已经开展了大量的研究工作,例如基于自然语言查询检索或生成代码片段,并使用自然语言注释代码片段[2,21,28,44,52,61,64]。在这些工作的核心是将自然语言和编程语言之间进行映射的机器学习模型,这些模型通常需要大量高质量的自然语言问题和代码解决方案对(即问题-代码或QC对)。在我们的工作中,当提问者可以仅基于代码片段解决问题时,我们将代码片段定义为代码解决方案(也称为“独立”解决方案)。以图1为例,图1显示了问题“ElegantPython function to convert CamelCase tosnake_case”的接受答案帖子2。在四个代码片段{C1,C2,C3,C4}中,只有C1和C3是独立的代码解决方案02在SO中,如果提问者认为回答解决了问题,接受的答案帖子会被标记为绿色勾号。根据之前的工作[21,59],尽管一个问题可以有多个答案帖子,但我们只考虑被接受的答案帖子,因为它们具有验证的质量,并且可以互换地使用“接受的答案帖子”和“答案帖子”。0会议: Web搜索和挖掘WWW 2018,2018年4月23日至27日,法国里昂16940其余的不是,因为C2只是给出了“convert”函数的输入输出演示而没有给出其定义,而C4则是一个额外细节的提醒。给定一个包含多个代码片段的答案帖子(即多代码答案帖子),以前的工作通常以启发式的方式收集问题-代码对:简单地将问题标题与第一个代码片段配对,或与每个代码片段配对,或与帖子中所有代码片段的连接配对[2,64]。Iyer等人[21]仅使用包含一个代码片段的接受答案帖子,并且丢弃所有包含多个代码片段的答案帖子。这种启发式的问题-代码收集方法至少存在以下一个弱点:(1)低精度:当后者作为背景、解释或输入输出演示而不是解决方案时,问题与其配对的代码片段不匹配(例如,图1中的C2);(2)低召回率:如果只选择第一个代码片段与问题配对,答案帖子中的其他代码解决方案(例如C3)将被忽略。事实上,多代码答案帖子在SO中非常常见,这使得低精度和低召回率问题更加突出。在StackExchange数据转储[51]中,对于Python和SQL“如何做”问题的所有接受答案帖子(将在第2节介绍),分别有44.66%和34.35%包含多个代码片段。请注意,接受的答案帖子仅由提问者整体验证,每个单独的代码片段是否作为独立解决方案是不容易获得的。此外,通过在编程环境中简单运行每个代码片段来获得这些标签是不可行的,原因有两个:(1)可运行的代码片段不一定是代码解决方案(例如,图1中的C4);(2)据报道,SO中大约74%的Python代码和88%的SQL代码片段不能直接解析或运行[21,59]。然而,它们通常包含回答问题所需的关键信息。因此,一旦与自然语言问题配对,它们仍然可以用于下游任务的语义分析[2,21,59,64]。为了系统地挖掘具有高精度和召回率的问题-代码对,我们提出了一个新的任务:给定SO中的一个问题3及其接受的答案帖子,其中包含多个代码片段,如何预测每个代码片段是否是独立的解决方案?在本文中,我们专注于“如何做”的问题类型,这些问题询问如何实现某个任务,如图1所示,因为对这类问题的答案很可能是独立的代码解决方案。不同类型问题的定义和分类将在第2节中讨论。我们在我们的任务中确定了两个挑战:(1)如图1所示,答案帖子中的代码片段可以扮演许多非解决方案的角色,例如作为输入输出演示或提醒(例如C2和C4),这需要一个统计学习模型来进行准确的预测。(2)代码片段的文本上下文和编程内容都可能具有预测性,但是一个有效的模型来共同利用它们需要仔细设计。直观地说,具有“you can do ...”和“this is one thoroughsolution...”等模式的文本块更有可能在代码解决方案之后出现。例如,给定图1中的S1和S3,代码解决方案很可能在它们之后介绍。另一方面,通过检查代码内容,C2可能不是问题的代码解决方案。03 在之前的工作[2, 6,21]的基础上,我们在这项工作中仅使用问题帖子的标题,并将问题帖子内容的整合留给未来的工作。0因为它包含特殊的Python控制台模式,如“ >>> ... >>>”,并且没有“convert”的特定定义。为了解决这些挑战,我们探索了一系列模型,包括传统的分类器和深度学习模型,并提出了一种名为Bi-View Hierarchical NeuralNetwork(BiV-HNN)的新模型,以捕捉每个代码片段的文本上下文和编程内容(构成了两个视图)。在BiV-HNN中,我们设计了两个不同的模块分别从文本和代码中学习特征,并将它们结合到一个深度神经网络架构中,最终预测一个代码片段是否是一个独立的解决方案。总结起来,我们的贡献有三个方面:首先,据我们所知,我们是第一个系统地研究挖掘大规模高质量问题-代码对的人,这对于开发以学习为基础的模型来实现自然语言和编程语言之间的映射至关重要。其次,我们广泛探索了各种模型,包括传统的分类器和深度学习模型,以预测一个代码片段是否是一个解决方案,并提出了一种新颖的Bi-View Hierarchical NeuralNetwork,它考虑了基于文本和代码的视图。在Python和SQL领域的两个手动标记的数据集上,BiV-HNN在F1和准确性方面都大大优于广泛采用的启发式方法和传统的分类器。此外,BiV-HNN不依赖于任何先验知识,可以轻松应用于其他编程领域。最后但并非最不重要的是,我们通过我们的框架系统地挖掘了迄今为止最大的约148K个Python和约120K个SQL问题-代码对的数据集StaQC。通过多个案例研究,我们展示了StaQC在表面变异方面的丰富性:一个问题可以与多个代码解决方案配对,而语义上相同的代码片段可以有不同/释义的自然语言描述。由于这种多样性以及其大规模性,StaQC是一个比现有数据资源更好的构建自然语言和编程语言之间映射模型的数据资源。此外,我们可以继续通过定期将我们的框架应用于快速增长的SO来扩大StaQC的规模和多样性。其他编程语言中的问题-代码对也可以类似地挖掘并包含在StaQC中。02 准备工作0在本节中,我们首先明确我们的任务定义,然后描述了如何为模型开发注释数据集。02.1 任务定义0给定一个问题及其在StackOverflow中包含多个代码片段的被接受答案帖子,我们的目标是预测答案帖子中的每个代码片段是否是问题的独立解决方案。如第1节所解释的,我们专注于“被接受”的答案帖子和“独立”的解决方案。用户可以在SO中提出不同类型的问题,例如“如何实现X”和“什么/为什么是Y”。根据之前的工作[12, 13,32],我们将问题分为五种类型:“如何做”,“调试/纠错”,“概念性”,“寻求某事,例如建议,教程”及其组合。特别地,当提问者提供一个场景并询问如何实现它时,问题属于“如何做”的类型,如图1所示。0会议:Web搜索和挖掘WWW 2018年4月23日至27日,法国里昂ytSQ3BI-VIEW HIERARCHICAL NN16950为了收集问题-代码对,我们针对“如何做”类型的问题,因为对其他类型的问题的答案很可能不是独立的代码解决方案(例如,“概念性”问题的答案通常是文本描述)。接下来,我们描述如何区分“如何做”类型的问题和其他类型的问题。02.2 “如何做”问题收集02.2.1问题类型分类。在高层次上,我们将除了“如何做”之外的其他四种问题类型合并为一个名为“非如何做”的类别,并构建了一个二元问题类型分类器。我们首先从SO中根据标签收集Python和SQL问题,这些标签适用于所有问题帖子。具体来说,我们认为包含关键字“python”的问题属于Python领域,而被“sql”、“database”或“oracle”标记的问题属于SQL领域。对于每个领域,我们随机抽样并标记了250个问题,用于训练(150个)、验证(20个)和测试(80个)分类器4。在这250个问题中,大约有45%的Python问题和57%的SQL问题是“如何做”问题。我们分别为每个领域构建了一个逻辑回归分类器,基于从问题和答案帖子中提取的简单特征,如关键字出现特征、问题/答案帖子中的代码块数量、代码块的最大长度等[13]。分类器中的超参数是根据验证集进行调整的。最后,我们得到了Python的问题类型分类准确率为0.738(精确率:0.653,召回率:0.889,F1值:0.753),SQL的准确率为0.713(精确率:0.625,召回率:0.946,F1值:0.753)。问题类型的分类可能会通过更高级的特征和算法进一步改进,但这不是本文的重点。2.2.2“如何做”问题集合。使用上述分类器,我们对SO中的所有Python和SQL问题进行了分类,其中接受答案帖子包含代码块,并收集了每个领域中大量的“如何做”问题。在这些“如何做”问题中,约有44.66%(68,839个)Python问题和34.45%(39,752个)SQL问题的接受答案帖子中有多个代码片段,我们将从中系统地挖掘问题-代码对。02.3 为模型训练标注QC对0为了构建我们任务的训练/验证/测试数据集,我们雇佣了四名熟悉Python和SQL的本科生来注释这两个领域中的答案帖子。对于答案帖子中的每个代码片段,注释者可以根据他们认为仅凭代码片段就能解决问题(即它是一个独立的代码解决方案)为其分配“1”,否则为“0”。我们确保每个代码片段都由两个注释者进行注释,并且只有当两个注释者都同意时才采用标签。对于每种编程语言,约有85%的代码片段被标记。平均Cohen'skappa一致性[9]约为0.658(Python)和0.691(SQL)。我们手动注释的数据集的统计信息总结在表1中,这将用于开发我们的模型。04 尽管训练数据量很小,但在我们的实验中没有观察到过拟合现象,部分原因是特征非常简单。0QC对的数量0具有标签“1”的QC对的百分比0QC对的数量0具有标签“1”的QC对的百分比0训练 2,932 43.89% 2,183 56.12%0验证 976 43.14% 727 55.98%0测试 976 47.23% 727 58.32%0表1:手动注释数据集的统计信息。0不失一般性,让我们假设给定问题的答案帖子具有一个由序列块{S1,C1,S2,...,Si,Ci,Si +1,...,SL-1,CL-1,SL}组成的序列,其中有L个文本块(Si)和L-1个代码块(Ci)交替出现。我们的任务是自动为每个代码片段Ci分配一个二进制标签,其中1表示独立的解决方案,否则为0。在这项工作中,我们独立建模每个代码片段,并根据其文本上下文(即Si,Si +1)和编程内容来预测Ci的标签。如果Si或Si +1为空,我们插入一个空的虚拟文本块以使我们的模型适用。可以将我们的公式扩展到更复杂的序列标记问题,其中一系列代码片段可以同时建模,这留待将来的工作。03.1 直觉0我们首先从高层次分析每个单独块如何有助于流畅地阐述整个答案。例如,在图1中,第一个文本块S1表明其后面的代码块C1(实现一个函数)是“彻底的”,因此可能是一个解决方案。随后,S2将C1与它可以使用的示例连接到C2。相反,S3以连词“或”开始,可能会引入另一种解决方案(例如C3)。这个观察启发我们首先使用令牌级序列编码器分别对每个块的含义进行建模,然后使用块级编码器对块序列Si-Ci-Si+1进行建模,从中最终获得Ci的语义表示。图2显示了我们的模型,名为Bi-View分层神经网络(BiV-HNN)。它逐步从令牌级到块级学习代码块的语义表示,基于此我们预测它是一个独立的解决方案还是不是。另一方面,BiV-HNN自然地将两个视图,即文本上下文和代码内容,结合到模型结构中。我们将每个组件详细说明如下。03.2 令牌级序列编码器0文本块。给定一个带有单词序列wit的句子块Si,t∈[1,Ti],我们首先通过预训练的词嵌入矩阵We将单词嵌入为向量,即xit= Wewit。然后,我们使用双向门控循环单元(GRU)基于循环神经网络(RNN)[8]来通过总结来自两个方向的上下文信息来学习单词表示。GRU通过控制从先前状态更新多少信息来跟踪序列的状态。具体而言,给定当前步骤中的输入词向量xt和上一步的隐藏状态ht−1,GRU首先计算用于重置来自先前步骤的信息的重置门r以便0Track: Web Search and Mining WWW 2018, April 23-27, 2018, Lyon, France16960Softmax0令牌级编码器0块级编码器0代码标签预测0一个词令牌序列在0连接前馈Bi-GRU0一个词令牌序列在0Bi-GRU0Bi-GRU0一个代码令牌序列在0Bi-GRU0一个词令牌序列在0图2:我们的Bi-View分层神经网络(BiV-HNN)。文本块Si和问题q由一个双向GRU基于RNN(Bi-GRU)模块进行编码,代码块Ci由另一个具有不同参数的Bi-GRU进行编码。0学习一个新的隐藏状态˜ht:0r = σ(Wr[xt, ht−1] + br),0˜ht = ϕ(W[xt, r⊙ht−1] +b),0其中[xt,ht−1]是xt和ht−1的连接,σ和ϕ分别是sigmoid和tanh激活函数。Wr,W是Rd h ×(dx + dh)中的两个权重矩阵,br,b是Rdh中的偏置,其中dx,dh是xt和隐藏状态ht−1的维度。直观地说,如果r接近0,则在学习新的隐藏状态时,ht−1中的信息不会传递到当前步骤。GRU还为整合隐藏状态ht−1和˜ht定义了一个更新门u:0u = σ(Wu[xt, ht−1] + bu),0ht = uht−1 + (1 −u)˜ht。0当u接近0时,ht包含更多关于当前步骤ht的信息;否则,它更多地记住了之前的步骤。为了方便起见,我们将上述计算表示为ht =GRU(xt,ht−1)。在我们的工作中,双向GRU(即Bi-GRU)包含一个正向GRU从wi1到wiTi读取文本块Si,以及一个反向GRU从wiTi到wi1读取:0−→ h it = GRU(x it, −→ h i, t −1),t ∈ [1, T i],←− h it = GRU(xit, ←− h i, t + 1),t ∈ [T i, 1],−→h i 0 = −→ 0,←− h i, T i + 1 =←− 0,0其中,正向和反向GRU的隐藏状态都初始化为零向量。由于正向和反向GRU从不同的角度总结上下文信息,我们将它们的最后隐藏状态(即−→ h iT i, ←− h i 1)连接起来表示文本块 S i 的含义:0s i = [−→ h iT i,0代码块。同样,我们使用另一个双向GRURNN模块基于其代码令牌序列学习代码块 C i 的向量表示 vc。可以直接将此代码向量 v c作为代码块的令牌级别表示。然而,由于我们模型的目标是决定一个代码片段是否回答了某个问题,我们将 C i 与问题标题 q关联起来,以捕捉它们在学习的向量表示 c i中的语义对应关系。具体而言,我们首先通过将文本级别编码器应用于 q 中的单词序列来学习问题向量 v q。然后将 v q 和 v c连接起来,输入到一个前馈 tanh 层(即图2中的“concatfeedforward”)生成 c i:0c i = ϕ(W c [v q, v c] + b0我们将在实验中验证将 q纳入模型的效果。与建模代码块不同,我们在学习其表示时不将文本块与问题 q关联起来,因为我们观察到两者之间没有直接的语义匹配。例如,在图1中,文本块几乎无法通过其内容与问题匹配。然而,正如我们在第1节中讨论的那样,具有“you can do ...”或“This is onethorough solution...”等模式的文本块可以暗示在其之后会引入一个代码解决方案。因此,我们单独对每个文本块进行建模,不包含问题信息。03.3 块级序列编码器0给定令牌级别表示序列 s i - c i - s i + 1,我们使用双向GRURNN构建块级序列编码器,最终获得代码块表示:−→ h i = GRU(si, −→ 0),←− h i = GRU(s i, ←− ch i),−→ ch i = GRU(c i, −→h i),←− ch i = GRU(c i, ←− h i + 1),−→ h i + 1 = GRU(s i +1, −→ ch i),←− h i + 1 = GRU(s i + 1, ←− 0),0其中编码器在两个方向上都初始化为零向量(即−→ 0和←−0)。我们将代码块的正向状态−→ ch i和反向状态←− chi连接起来作为其语义表示:0z i = [−→ ch i,←− ch i]。03.4 代码标签预测0然后,代码块 C i 的表示 z i 用于预测:0y i = softmax(W y z i + b0其中,y i = [y i 0, y i 1]表示预测 C i的标签为0或1的概率。我们使用交叉熵[19]定义损失函数,在训练过程中对所有 N 个代码片段进行平均:0L = -10N0N �0i = 1 p i 0 log(y i 0) + p i 1log(y i 1),0Track: Web Search and Mining WWW 2018, April 23-27, 2018, Lyon, France16970其中,如果第i个代码片段被手动注释为解决方案,则p i 0 = 0且p i1 = 1;否则,p i 0 = 1且p i 1 = 0。04 使用特征工程的传统分类器0除了像BiV-HNN这样基于神经网络的模型之外,我们还探索了传统的分类器,如逻辑回归(LR)[11]和支持向量机(SVM)[10]。特征是从文本和代码两个视图手动创建的:0文本上下文。 (1)Token:上下文中的单个词和二元词组。(2)FirstToken:如果一个句子以“try this”或“useit”等短语开头,那么接下来的代码片段很可能是解决方案。受到这个想法的启发,我们将上下文中的第一个标记与其他标记区分开来。(3)Conn:布尔特征,指示上下文中是否出现连接词/短语(例如“alternatively”)。我们使用了Penn Discourse Tree Bank[43]中的常见连接词和短语。0代码内容。 (1)CodeToken:代码片段中的所有代码标记。(2)CodeClass:为了区分功能良好且可以用于学习和实用重用(即“工作代码”[22])的代码片段与输入输出演示,我们引入了CodeClass,它是代码片段是工作代码的概率。具体来说,从SO中的所有“如何做”Python问题中,我们首先收集了完全按照“output:”和“outputis:”等文本块的输入输出代码片段作为850个代码片段。我们进一步随机选择了850个接受的答案帖子,其中包含恰好一个代码片段,并将它们的代码片段作为工作代码。然后,我们提取了一组特征,如数字和括号的比例,并构建了一个二元逻辑回归分类器,该分类器在手动标记的测试集上获得了0.804的准确率和0.891的F1。最后,训练好的分类器输出Python中每个代码片段作为“工作代码”的概率作为CodeClass特征。对于SQL,工作代码通常可以通过关键词(如“SELECT”和“DELETE”)来检测,这些关键词已包含在CodeToken特征中。因此,我们没有为其设计CodeClass特征。0还可以将其他特征合并到传统分类器中。然而,想出有用的特征绝非易事。相比之下,神经网络模型可以从原始数据中自动学习高级特征,并在不同领域广泛且成功地应用[8,24,30,50,53]。因此,在我们的工作中,我们选择设计基于神经网络的模型BiV-HNN。我们将在实验中比较不同的模型。05 实验0在本节中,我们进行了大量实验,比较了各种模型,并展示了我们提出的BiV-HNN的优势。05.1 实验设置0数据集概述。第2节讨论了我们如何手动注释用于训练、验证和测试的问题-代码对。统计数据总结在表1中。为了评估不同的模型,我们采用了精确率、召回率、F1和准确率,这些指标的定义与典型的二元分类设置相同。0数据预处理。我们尽力对Python代码片段进行标记化处理:首先使用Python内置的标记器进行处理,对于处理后仍未标记化的代码行,我们采用NLTK工具包[27]中的“word-punct_tokenizer”来分离标记和符号(例如“.”和“=”)。此外,我们通过遍历使用Python内置的AST解析器解析的代码片段的抽象语法树(AST)来检测变量、数字和字符串,并分别用特殊标记“VAR”、“NUMBER”和“STRING”替换它们,以减少数据稀疏性。对于SQL,我们遵循[21]进行标记化处理,用占位符标记替换表/列名,并对其进行编号以保留它们的依赖关系。最后,我们从Python(SQL)训练集中收集了4557(3191)个单词标记和6581(1200)个代码标记。0实现细节。我们使用Tensorflow[55]来实现我们的BiV-HNN及其在第5.2节中介绍的变体。单词和代码标记的嵌入大小设置为150。嵌入向量使用GloVe[42]在SO中的所有Python或SQL帖子上进行预训练。参数按照[18]的方法进行随机初始化。我们将学习率初始值设为0.001,并使用Adam优化器[23]对神经网络模型进行小批量大小为100的训练。对于标记级别的编码器,GRU单元的大小从{64,128}中选择,对于块级别的编码器,GRU单元的大小从{128,256}中选择。根据[20,21,29]的惯例,我们根据它们在验证集上的性能选择模型参数。逻辑回归和支持向量机模型使用Python的Scikit-learn库[41]实现。05.2 BiV-HNN的基线和变体0基线。我们将我们提出的模型与收集QC对的两种常用启发式方法进行比较:(1)选择第一个:只将回答帖子中的第一个代码片段视为解决方案;(2)选择全部:将回答帖子中的每个代码片段都视为解决方案,并将每个代码片段与问题配对。此外,我们还将我们的模型与基于手工特征的传统分类器LR和SVM进行比较(第4节)。0BiV-HNN的变体。首先,为了评估组合两个视图(即文本上下文和代码内容)的有效性,我们将BiV-HNN调整为只考虑一个单一视图:(1)Text-HNN(图3a):在这个模型中,我们只使用代码片段的文本上下文。我们用特殊标记CodeBlock屏蔽所有代码块,并用统一的向量表示它们。(2)Code-HNN(图3b):我们只将标记级代码编码器的输出(即ci)输入到第3节中的“代码标签预测”层中,不对文本上下文进行建模。此外,为了评估在编码代码块时问题q的影响,我们将BiV-HNN与BiV-HNN-nq进行比较,后者直接将代码向量vc作为代码块表示ci,而不与问题q关联进行进一步学习。这三个模型都是BiV-HNN的输入级变体。其次,为了评估BiV-HNN中的分层结构,我们将其与“平坦”RNN模型进行比较,这些模型将单词和代码标记建模为一个单一序列。比较在仅文本和双视图设置中进行:(1)Text-RNN(图4a):与Text-HNN相比,我们将上下文块Si和Si+1中的所有单词以及统一的代码向量CodeBlock连接为一个单一序列,即{wi1,...,wi,Ti,CodeBlock,wi+1,1,...,wi+1,Ti+1},使用Bi-GRURNN。正向和反向的连接0Track: Web Search and Mining WWW 2018, April 23-27, 2018, Lyon, France......Softmax..................Softmax............Softmax..................Softmax......16980Softmax0代码块0连接前馈0块级编码器(Bi-GRU)0一个单词标记的序列0词标记的序列0Softmax0Bi-GRU0一个代码标记的序列0Bi-GRU Bi-GRU Bi-GRU0(a)Text-HNN0Softmax0代码块0连接前馈0块级编码器(Bi-GRU)0一个单词标记的序列0一个单词标记的序列0Softmax0Bi-GRU0一个代码标记的序列0Bi-GRU Bi-GRU Bi-GRU0一个单词标记的序列0(b)Code-HNN0图3:BiV-HNN的单视图变体:(a)Text-HNN,没有代码内容;(b)Code-HNN,没有上下文文本。0代码0连接0(a)Text-RNN0代码块0连接0(b)BiV-RNN0图4:“平坦”结构的BiV-HNN变体,不区分标记级和块级:(a)Text-RNN;(b)BiV-RNN。0隐藏状态的CodeBlock被视为其最终的语义向量zi,然后被输入到代码标签预测层中。(2)BiV-RNN(图4b):与BiV-HNN相比,BiV-RNN将Si-Ci-Si+1中的所有单词和代码标记作为一个单一序列,即{wi1,...,wiTi,coi1,...,coij,...,coi,|Ci|,wi+1,1,...,wi+1,Ti+1},其中coij表示代码Ci中的第j个标记,|Ci|是Ci中代码标记的数量。BiV-RNN将两个方向的最后隐藏状态连接起来作为最终的语义向量zi进行预测。我们还尝试通过连接Si-q-Ci-Si+1中的标记来直接“展平”BiV-HNN,但观察到性能更差,可能是因为从Si转换到问题q不太自然。最后,在块级别上,可以使用前馈神经网络[47]将连接的标记级输出[si,ci,si+1]应用于代表BiV-HNN中的块级Bi-GRU的一层5前馈神经网络,表示为BiV-HFF。直观地说,将这三个块建模为一个序列更符合人类阅读帖子的方式。我们将在实验中验证这种直觉。0虽然我们的模型可能还有其他变体,但上述变体与BiV-HNN中最关键的设计相关。由于空间限制,我们只展示了它们的性能。0为了公平比较,我们只使用了一层,因为BiV-HNN中的Bi-GRU只有一层隐藏层。05.3 结果0我们在表2中的实验结果显示了我们的BiV-HNN的有效性。在两个数据集上,BiV-HNN在F1和准确率上比启发式基准方法Select-First和Select-All提高了15%以上。这表明我们的模型可以收集到比现有研究中使用的启发式方法更高质量的问题-代码对。此外,与LR和SVM相比,BiV-HNN在Python数据集上的F1和准确率提高了7%�9%,在SQL数据集上的F1和准确率提高了3%�5%。在SQL数据上的提升相对较小,可能是因为解释SQL程序相对较容易,这一观察结果表明简单分类器和BiV-HNN都可以达到约85%的F1。0表3中的结果显示了BiV-HNN中关键组件与其他替代方法的效果。由于空间限制,我们没有展示每个模型的准确率,但它们的变化趋势与F1大致相同。我们得出了以下观察结果:(1)单视图变体。BiV-HNN在两个数据集上都大幅优于Text-HNN和Code-HNN,表明两个视图对我们的任务至关重要。特别是通过整合代码内容信息,BiV-HNN在Python数据集上的F1提高了7%,在SQL数据集上提高了约5%。(2)无查询变体。在Python数据集上,将问题信息整合到BiV-HNN中比BiV-HNN-nq带来了3%的F1改进。0Track: Web Search and Mining WWW 2018, 2018年4月23日至27日,法国里昂16990Python测试集 SQL测试集0模型 精确率 召回率 F1 准确率 精确率 召回率 F1 准确率0启发式基准方法0选择-首个 0.676 0.551 0.607 0.663 0.755 0.517 0.613 0.6200选择-全部 0.472 1.000 0.642 0.472 0.583 1.000 0.737 0.5830基于简单特征的分类器0逻辑回归 0.801 0.733 0.766 0.788 0.843 0.849 0.846 0.8200支持向量机 0.701 0.813 0.753 0.748 0.843 0.858 0.850 0.8240BiV-HNN 0.808 0.876 0.841 0.843 0.872 0.903 0.888 0.8670表2:BiV-HNN和基准方法的比较。0这表明将问题与代码片段关联起来可以有效识别代码答案。对于SQL数据集,添加问题并没有明显的好处,可能是因为每个SQL程序中的代码内容已经携带了进行预测所需的关键信息(例如,包含“SELECT”关键字的SQL程序很可能是给定问题的解决方案,无论问题内容如何)。(3)“扁平”结构变体。在两个数据集上,分层结构在双视图(BiV-HNN vs. BiV-RNN)和单视图(Text-HNN vs.Text-RNN)设置中都带来了1%�2%的改进。(4)非序列变体。在Python数据集上,BiV-HNN在F1上的表现优于BiV-HFF约2%,表明块级别的Bi-GRU优于前馈神经网络。两个模型在SQL上的性能大致相同,可能是因为我们的任务在SQL领域比在Python领域更容易,正如我们之前提到的。总之,我们的BiV-HNN比广泛采用的启发式基准方法和传统分类器更加有效。BiV-HNN中的关键组件,如双视图输入、分层结构和块级序列编码,也经过了实证验证。0错误分析。代码片段可以扮演各种非解决方案的角色,比如只是多步解决方案的一步,输入输出示例等等。我们观察到超过一半的错误预测是假阳性(即将非解决方案的代码片段预测为解决方案),要纠正这种错误通常需要整合整个答案帖子的信息。例如,当一个代码片段是多步解决方案的第一步时,BiV-HNN可能会错误地将其视为完整且独立的解决方案,因为BiV-HNN在进行预测时没有同时考虑后续代码片段及其上下文。此外,当正确的预测需要对问题帖子的内容进行仔细检查时(除了标题之外),BiV-HNN可能会犯错误。在未来的研究中探索这些方向可能会进一步提高模型在这个任务上的性能。0模型组合。在尝试BiV-HNN的单视图变体(即Text-HNN和Code-HNN)时,我们观察到三个模型在进行准确预测时互补。例如,在Python验证集上,Text-HNN或Code-HNN产生的约70%的错误可以通过考虑其他两个模型的预测来纠正。尽管BiV-HNN是基于文本和代码视图构建的,但其60%的错误预测可以通过Text-HNN和Code-HNN进行纠正。在SQL数据集上也观察到了相同的模式。因此,我们进一步通过简单的启发式方法测试了组合三个模型的效果:预测代码片段的标签仅当三个模型都同意时才预测为1。0Python测试集 SQL测试集0模型 精确率 召回率 F1值 精确率 召回率 F1值0单视图变体0Text-HNN 0.723 0.826 0.771 0.798 0.887 0.8400Code-HNN 0.770 0.859 0.812 0.848 0.854 0.8510无查询变体0BiV-HNN-nq 0.8
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功