Skip to main content
QUICK REVIEW

[论文解读] Learning to Mine Aligned Code and Natural Language Pairs from Stack Overflow

Pengcheng Yin, Bowen Deng|arXiv (Cornell University)|May 23, 2018
Software Engineering Research参考文献 42被引用 22
一句话总结

本文提出了一种新颖的方法,通过结合手工设计的结构特征与基于神经网络的对应特征,从 Stack Overflow 中挖掘高质量、细粒度对齐的自然语言(NL)与代码配对。在少量标注样本上进行训练后,该方法在覆盖范围和准确率方面显著优于以往基于启发式规则的方法,实现了从一种编程语言到另一种编程语言的强零样本迁移性能,从而实现了代码生成、检索和摘要任务中可扩展的高质量数据收集。

ABSTRACT

For tasks like code synthesis from natural language, code retrieval, and code summarization, data-driven models have shown great promise. However, creating these models require parallel data between natural language (NL) and code with fine-grained alignments. Stack Overflow (SO) is a promising source to create such a data set: the questions are diverse and most of them have corresponding answers with high-quality code snippets. However, existing heuristic methods (e.g., pairing the title of a post with the code in the accepted answer) are limited both in their coverage and the correctness of the NL-code pairs obtained. In this paper, we propose a novel method to mine high-quality aligned data from SO using two sets of features: hand-crafted features considering the structure of the extracted snippets, and correspondence features obtained by training a probabilistic model to capture the correlation between NL and code using neural networks. These features are fed into a classifier that determines the quality of mined NL-code pairs. Experiments using Python and Java as test beds show that the proposed method greatly expands coverage and accuracy over existing mining methods, even when using only a small number of labeled examples. Further, we find that reasonable results are achieved even when training the classifier on one language and testing on another, showing promise for scaling NL-code mining to a wide variety of programming languages beyond those for which we are able to annotate data.

研究动机与目标

  • 为解决自然语言与代码之间高质量、细粒度平行数据稀缺的问题,此类数据对于训练代码生成与检索中的数据驱动模型至关重要。
  • 克服现有启发式方法的局限性——例如仅依赖已接受的答案或完整代码块——这些方法在挖掘的 NL-代码对中存在覆盖范围低和噪声高的问题。
  • 开发一种可扩展且准确的方法,从 Stack Overflow 中挖掘细粒度子代码块级别的对齐 NL-代码对,即使标注数据极少也能适用。
  • 通过在一种编程语言上进行训练并在另一种语言上进行测试,实现零样本迁移学习,从而减少在多种语言上进行大量人工标注的需求。

提出的方法

  • 该方法使用一个分类器,结合两类特征:从代码片段中提取的手工设计结构特征(如语法模式、变量使用、控制流结构)和通过神经网络学习到的对应特征,该神经网络旨在建模自然语言查询与代码之间的对齐关系。
  • 神经网络组件通过建模局部和全局依赖关系,学习自然语言意图与代码之间的语义对应,从而即使在小片段或嵌入在较大代码块中的情况下,也能检测出相关代码片段。
  • 使用一个小规模的人工标注的 NL-代码对数据集来训练分类器,使模型能够泛化到大量未标注的 Stack Overflow 帖子。
  • 分类器端到端训练,以预测给定的自然语言片段与代码片段是否对齐,目标是识别出细粒度且语义相关的代码段,以回答问题。
  • 该方法支持零样本迁移,即在一种语言(如 Python)上进行训练,并在另一种语言(如 Java)上进行评估,展示了在极少微调下跨语言的泛化能力。
  • 通过自动指标和人工评估对挖掘出的配对进行评估,确保提取数据的高精确率与高召回率。

实验结果

研究问题

  • RQ1与仅依赖已接受答案或完整代码块的启发式方法相比,基于混合特征的分类器是否能显著提升挖掘的 NL-代码对的准确率与覆盖范围?
  • RQ2该方法在识别自然语言问题与代码片段之间子代码块级别的对齐方面有多有效,特别是在相关代码片段较小或被嵌入时?
  • RQ3在未提供额外标注数据的情况下,仅在一种编程语言(如 Python)上训练的模型,能在多大程度上泛化到另一种语言(如 Java)?
  • RQ4当标注数据量变化时,特别是仅提供少量样本时,该方法的性能如何变化?
  • RQ5将手工设计的结构特征与学习到的神经对应特征相结合,对挖掘出的 NL-代码对的质量有何影响?

主要发现

  • 与以往基于启发式规则的方法相比,所提方法在挖掘对齐的 NL-代码对方面实现了显著更高的精确率与召回率,尤其在识别细粒度相关代码片段而非整个代码块方面表现更优。
  • 即使仅使用数百个标注样本进行训练,模型仍表现出良好的泛化能力,显示出在极小监督设置下的强劲性能。
  • 该方法在零样本跨语言设置中取得了高质量结果,表明在 Python 数据上训练的模型能有效挖掘 Java 的准确 NL-代码对,且性能下降极小。
  • 人工评估确认,挖掘出的配对具有高度相关性且语义对齐,其中大部分正确且有用的代码片段均与问题意图匹配。
  • 将神经对应特征与手工设计的结构特征结合,相比单独使用任一类型特征,均能显著提升挖掘质量。
  • 该方法可有效扩展至完整的 Stack Overflow 数据集,能够构建大规模、高质量的平行数据集,适用于下游自然语言处理与代码生成模型的训练。

更好的研究,从现在开始

从论文设计到论文写作,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。