【论文】 Post2Vec:Learning Distributed Representations of Stack Overflow Posts

Post2Vec:Learning Distributed Representations of Stack Overflow Posts

Post2Vec:基于Stack Overflow 贴子的分布式表示学习
Stack Overflow网址
论文代码

摘要

之前的研究已经提出了分析Stack Overflow内容以帮助用户找到所需信息或帮助各种下游软件工程任务的解决方案。这些解决方案执行的一个常见步骤是提取适当的Post(帖子)向量表示。然后将这些向量用于不同的任务,例如标签推荐、相关性预测、文章分类和API推荐。Post向量表示的质量决定了解决方案在执行各自任务时的有效性。

在这篇论文中,为了帮助现有的分析Stack Overflow帖子的研究,论文提出了一个专门的深度学习架构Post2Vec,它提取Stack Overflow帖子的分布式表示。Post2Vec知道Stack Overflow帖子中出现的不同类型的内容,如标题(title)、描述(Description)和代码(Code)片段,并将它们无缝集成在一起,以学习帖子的表示方式。Stack Overflow用户提供的标签作为一个通用的词汇表来捕捉帖子的语义,用来指导Post2Vec完成任务。

为了评估Post2Vec的深度学习体系结构的质量,论文首先研究了它在标签推荐任务中的端到端有效性,得到的结果与那些采用了深度神经网络的先进标签推荐方法进行对比。结果表明,Post2Vec以更低的计算成本实现了(F1-score@5)指标15-25%的改进。此外,为了评估Post2Vec学习到的表示的价值,论文将它们用于其他三个下游任务,即相关性预测、Post分类和API推荐,结果表明,Post2Vec提取的表征可以显著提高三个任务的最先进解决方案的有效性(三个任务分别在f1评分、f1评分和正确性方面提高10%、7%和10%)。

介绍

StackOverflow相当于国内的CSDN的这种模式,这种SQA站点(Sofeware Question and Answer)是开发人员解决问题和自学的日常工作的重要组成部分,由帖子的形式集成,帖子一般包含标题(title)、描述文本(Description)和代码(Code)片段。为了帮助开发人员浏览SQA站点并有效地找到相关信息,以前的工作已经提出了许多解决方案,这些解决方案一个常见的步骤是提取一个合适的向量来表示一个帖子(即Post向量),以便进一步处理。遵循"garbage in, garbage out"原则,Post矢量表示的质量是决定最终结果的重要因素

StackOverflow界面
在这里插入图片描述

这篇论文提出了一种新的深度学习体系结构Post2Vec,它可以有效地将帖子嵌入到相似帖子之间距离较小的空间中。具体来说,即利用帖子共享的语义标签监督Post表示学习。

Post2Vec主要解决之前研究的三个限制:

  • 之前的研究大多简单地将不同的部分(这里应该指的是标题(title)、描述文本(Description)和代码(Code)片段三个部分)同等对待
  • 很多之前的研究中,删除了代码片段
  • 早期利用如Bag-Of-Words单词袋等过于简单的特征,信息丢失严重

模型框架

在这里插入图片描述

Post2Vec由4个部分组成:

  • 预处理:从Stack Overflow帖子中提取三段信息(即标题、描述和代码片段),对它们进行清理,并将它们分别表示为一个标记序列
  • 输入层:将贴子的标题、描述和代码片段对应的标记序列编码为二维矩阵,二维矩阵作为特征提取层的NN的输入
  • 特征提取层:提取嵌入向量(又称特征)的标题、文本描述和代码片段,将这些嵌入向量连接起来,形成输入StackOverflow 帖子的post向量表示
  • 特征融合和标签预测层:将post向量映射到标签向量,标签向量表示分配给Stack Overflow post的各种标签的概率

预处理

在这里插入图片描述

1. 分离正文中的Description和Code
  • 正文中的代码片段包含在HTML 标签<pre>\<code><\code><\pre>中,所以我们选择正则表达式:<pre>\<code>([\s\S]*?)<\\\code><\\\pre>提取代码片段
  • 将一篇文章中的所有代码片段连接到一个文档中,并将文章的其余部分连接到另一个文档中
2. 删除HTML标记
  • 去掉文档中的HTML的标签,这些标签主要是格式作用,所以把他去掉,比如说这里<code>标签
3. 注释标题、描述和代码片段
  • 用NLTK(自然语言处理工具包)中的函数word_tokenize将每个帖子的标题、描述和代码片段分割为一个Token序列
4. 分别构建词汇表
  • 基于post训练数据,构建 γ T γ^T γT γ D γ^D γD γ C γ^C γC词汇表,分别对应一组tokens和它们在标题、文本、代码的出现频率
  • 放弃其中出现比较少的单词,设定频率阈值k(作者设定k=50,是之前工作中比较常见的阈值)

在预处理步骤的最后,我们得到的是每个帖子的标题、描述和代码的三个Token序列。这些序列被输入到我们提出的框架的输入层进行进一步处理

输入层

这一层的目的是方便神经网络(NN)进行处理

在这里插入图片描述

1. 索引和填充:
  • 用词汇表中的索引代替序列中的Token:拿标题序列举例子:我们的词汇表是 V t V_t Vt,Token序列表示为 T = ω 1 , ω 2 , … … ω N T={ω_1,ω_2,……ω_N} T=ω1ω2ωN,那么转化后为 i n d e x 1 , i n d e x 2 , … … i n d e x N {index_1,index_2,……index_N} index1index2indexN,index就是ω在词汇表Vt中的下标或者说是位置,其实就是构建一个索引表。
  • 填充截取:因为不同的帖子含的token数量不一样,但是神经网络NN通常情况下要求输入的格式相同,所有我们把它变成一样的,方法就是填充或着截取,这样所有序列的长度就是一样的了,这个截取或者填充的长度,作者说是标题是100,文本和代码是1000,这样保留了95%以上的原始token数据,保证性能较好的同时,数据损失较小
2. token表示
  • 把每个token表示为d维向量,d默认情况下为128
  • 初始化这个向量,随机填充值,这些值会子啊后面训练和学习中更新
3. 组件表示
  • 将每个帖子的标题、描述和代码片段编码为二维矩阵
  • 怎么编码:比方说标题的token序列T,前面填充是填充成了100个tokens,也就是说这个序列中包含100个tokens,每个tokens现在是d维也就是128维,那么编码成的矩阵就是100*128这么大的一个二维矩阵,这些矩阵被用作特征提取层的输入

特征提取层

在这里插入图片描述

利用NNs模型对帖子进行特征提取
  • 将每个StackOverflow(SO)帖子的标题、描述和代码片段编码后的二维矩阵输入到三个独立的NN模型中
  • 现有的代码表示技术无法应用,因为它们要么适用于单一类型的程序语言;要么代码至少应该是一个完整的函数或方法,但帖子中的代码很乱,语言也不同。所以Post2Vec以同样的方式处理代码片段和其他两个文本组件(即标题和描述)
  • 我们可以选择不同类型的神经网络模型可以用作特征提取器。默认情况下,我们使用CNN作为特征提取器。因为技术帖中的类标签通常是由关键短语决定的,比如,在帖子中识别到 throws IOException这样关键短语的帖子是与Java相关的,那我们就附一个Java的tag
  • 后续作者也用了LSTM网络进行对比

特征融合和标签预测层

在这里插入图片描述

1. 合并
  • 这部分的输入是三个嵌入向量(即 Z T Z^T ZT, Z D Z^D ZD Z C Z^C ZC),分别表示从标题,描述和代码片段中提取的特征。将这些嵌入向量连接起来,以构造一个表示帖子的新嵌入向量 Z Z Z
2. 完全链接
  • 将嵌入向量 Z Z Z放入一个完全连接(FC)层中,生成向量 h h h
    h = α ( w h ⋅ z + b h ) h=\alpha(w_h \cdot z+b_h) h=α(whz+bh)
    w h w_h wh为权重矩阵, b h b_h bh为偏移量
3. 标签预测
  • h h h传递给标签预测层,预测帖子的标签向量,即各个标签的可能性:
    t = − h ⋅ w t t=-h \cdot w_t t=hwt
    选择sigmoid函数作为激活函数
    p ( t i ∣ p i ) = e x p ( t i ) e x p ( t i ) + 1 p(t_i|p_i)=\frac {exp(t_i)} {exp(t_i)+1} p(tipi)=exp(ti)+1exp(ti)

实验

标签推荐

实验设计

标签推荐:给定一组已被标签标注的软件帖子,如何对一个新的未见过的帖子自动预测一组合适的标签

数据集:基于2018年9月5日发布的Stack Overflow数据转储版本,构建了一个新的数据集:训练数据1027.9014万组,测试数据10万组

这个实验主要回答以下四个研究问题:

  • RQ1:与最先进的方法相比,Post2Vec在标签推荐方面的有效性和效率如何?
  • RQ2:不同类型的神经网络对特征提取有什么影响?
  • RQ3:Post2Vec能从代码片段中获益吗?
  • RQ4:单独处理帖子的标题、描述、代码部分,对结果有什么影响?

对于第一个问题: 作者把Post2Vec这个模型和2019年发布的基于深度学习的标签推荐方法进行对比,作者使用了他们的实验结果中在有效性方面表现较好的TagCNN和TagRCNN作为对照实验,并且使用了他们的源代码保证结果的可信度

对后三个问题: 作者设计了四组实验

在这里插入图片描述

可以从表中看出:

  1. 4组与1组对比,使用了不同的(神经网络)NN模型;
  2. 4组与2组对比,2组没有加入代码部分,而4组加入了代码部分;
  3. 4组与第3组相比,3组将所有部分合并处理,而第4组对标题、描述、代码部分分别进行处理。
实验结果

在这里插入图片描述

由上到下,三个表分别是P值(精确度)、R值(召回率)、F1值的对比,@符号后面k为标签个数,因为stackoverflow最多可以添加5个标签,所以设计了预测1个至5个标签的效果对比。

其中P值: P r e c i s i o n @ k i = ∣ T R i k ∩ G T i ∣ k Precision@k_i=\frac{|TR_{i}^k\cap GT_i|}{k} Precision@ki=kTRikGTi

R值:
在这里插入图片描述

F1-score@k:
F 1 − s c o r e @ k i = P r e c i s i o n @ k i × R e c a l l @ k i P r e c i s i o n @ k i + R e c a l l @ k i F1-score@k_i=\frac{Precision@k_i \times Recall@k_i}{Precision@k_i + Recall@k_i} F1score@ki=Precision@ki+Recall@kiPrecision@ki×Recall@ki

可以看出,在F1值对比上,预测tag为5时,最好的是选择CNN模型、有代码段、分开处理各部分的实验组,优于选择LSTM模型实验组2%,优于合并处理所有部分的实验组5%,优于缺少代码段处理的实验组7%,优于2019年发布的TagCNN 15%,TagRCNN 25%。

所耗时间对比:
在这里插入图片描述

由于数据集大,所有的方法都需要超过5天的时间来训练模型。
具体来说,TagRCNN需要8.5天,TagCNN需要7.1天,选择LSTM模型实验组需要12.7天,选择CNN模型、缺少代码段处理的实验组需要 6.9天,选择CNN模型、合并处理所有部分的实验组需要5.4天,选择CNN模型、有代码段、分开处理各部分的实验组花了7天,所有组别预测时间相近

根据实验结果对RQ1-4的回答:

  • RQ1:与最先进的方法相比,Post2Vec在标签推荐方面的有效性和效率如何?
    Post2Vec在有效性(F1-score@5提高了15-25%)和效率(模型训练时间提高了1.5天)方面都优于最先进的方法。

  • RQ2:不同类型的神经网络对特征提取有什么影响?
    基于CNN的Post2Vec显著优于基于LSTM Post2Vec,并且在模型训练中消耗的计算资源更少

  • RQ3:Post2Vec能从代码片段中获益吗?
    考虑代码片段可以提高效率(例如,F1-score@5提高了7%),但在模型训练期间会消耗更多的计算资源。

  • RQ4:Post2Vec能从代码片段中获益吗?
    Post2Vec的体系结构考虑了不同的post组件(即标题、描述和代码片段),在F1-score@5方面显著提高了5%的性能,但Sep在模型训练期间消耗的计算资源比Com要多

下游任务

相关性预测

相关性预测:自动识别相关的post和内容的多类分类问题,被称为相关性预测

数据集:40,000个具有四种类型相关性的文章,每一种类型的相关性对应10,000个帖子。

标签按照相关性由高到低:Duplicate>Direct>Indirect>Isolated。在两个帖子之间只有一个可能的关联标签。

在这里插入图片描述

F V s o f t S V M + P 2 V FV_{softSVM+P2V} FVsoftSVM+P2V 比前三个模型 F V s o f t S V M FV_{softSVM} FVsoftSVM F V s o f t S V M + D 2 V ( D o c 2 V e c ) FV_{softSVM+D2V(Doc2Vec)} FVsoftSVM+D2VDoc2Vec F V s o f t S V M + T a g C N N FV_{softSVM+TagCNN} FVsoftSVM+TagCNN 结果分别高出10%、8%、2%

Post分类

数据集: 包含500个人工标记的贴子,分别有30、206、145、129、79、30和93个贴子标记为API CHANGE、API USAGE、CONCEPTUAL、DISCREPANCY、LEARNING、ERRORS和REVIEW

采用随机分层抽样的方法重复实验50次,记录评价指标的平均得分。
在这里插入图片描述

F V S T O A + P 2 V FV_{STOA+P2V} FVSTOA+P2V F V S T O A FV_{STOA} FVSTOA效果好出7%

API推荐

API推荐: 查询时,查询者输入查询问题,系统需要推荐某个API或API序列来回答问题

  • BIKER:原始BIKER的全部特性
  • BIKER+D2V:集成doc2vec学习的后表示的增强BIKER
  • BIKER+T agCNN:集成TagCNN学习的后表示的增强BIKER
  • BIKER+Post2V ec:集成Post2V ec学习的后表示的增强BIKE

在这里插入图片描述

通过整合Post2Vec学习的post表示,BIKER的正确性提高了10%,时间成本降低了18%

BIKER和BIKER+Post2Vec对同一个问题实验性查询情况对比:
在这里插入图片描述

未来展望

  1. 通过整合更多信息,如评论和答案,改进post表示方式;
  2. Post2Vec学习的post表示,在其他下游任务中的有效性;
  3. 除了LSTM和CNN之外,其他神经网络的有效性;
  4. Post2Vec对Stack Overflow之外,其他软件问答网站的适用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值