解决编程任务和API文档描述差异性的API推荐方法「建议收藏」

编程文档 (54) 2023-03-24 15:01

1. 引用

API Method Recommendation without Worrying about the Task-API Knowledge GapQiao Huang, Xin Xia, Zhenchang Xing, David Lo and Xinyu Wang xxx et. al. “API Method Recommendation without Worrying about the Task-API Knowledge Gap”, 33rd ACM/IEEE International Conference. Sept. 2018.

2. 摘要

开发人员经常需要寻找适合其编程任务的API。尽管大多数库都有API参考文档,然而在编程实践中,对于编程所需实现的功能,用自然语言表述,和API文档中对实现该功能的API的表述,不论是词汇方面,还是知识方面,都存在巨大差异。因此,找到合适的API实现所需功能,并非易事。在这里,词汇差异是指可以用不同的词来表达相同的语义,而知识差异是指API文档主要描述API的功能和结构,但不会描述编程任务的其他关键信息,例如概念和目的。本文提出了一种名为BIKER(Bi-Information source based KnowledgE Recommendation,基于双信息源的知识推荐)的API推荐方法来弥合这两方面的差异。对于词汇差异,BIKER使用单词嵌入技术来计算两个文本描述之间的相似度得分。我们发现,开发人员常在Stack Overflow上发帖询问API文档相关问题。因此,我们让BIKER利用Stack Overflow上的帖子,提取一个程序任务的可能用到的所有API,并同时考虑当前任务与Stack Overflow帖子和API文档描述的契合度,对这些候选API进行排名。BIKER还汇总了API的补充信息(例如,API描述,Stack Overflow帖子中的代码示例),以帮助开发人员选择与其任务最相关的API。我们评测了413个API相关问题,并最新技术相比较,证明了BIKER对于类和方法级API推荐的有效性。我们还对28位Java开发人员开展了用户调研,进一步证明了BIKER用于API查找的实用性。

3. 技术介绍

图1是BIKER的总体框架,包含三个主要部分:一是构建领域专有词汇模型,用于相似性计算(第3.1节);二是基于Stack Overflow帖子和API文档查找相关的API(第3.2节);三是对找到的API汇总补充信息(第3.3节)。默认情况下,BIKER适用于方法级别的API推荐,而我们会在第3.4节中介绍如何修改BIKER,以适用于类级别的API推荐。

解决编程任务和API文档描述差异性的API推荐方法「建议收藏」_https://bianchenghao6.com/blog_编程文档_第1张

图1 BIKER总体框架

3.1 构建词汇模型,用于相似度计算

为了衡量查询与Stack Overflow帖子或API描述的相似性,我们需要构建领域专有的词汇模型。我们首先通过从HTML页面中的Stack Overflow帖子中提取文本内容来构建文本语料库。在提取过程中,我们删除了HTML标记⟨pre⟩中包含的长代码段,但将短代码片段保留在⟨code⟩中的自然语言句子中。我们使用NLTK包来标记句子。注意,如果你只对特定语言或库的API感兴趣(例如Java),可以只考虑标签是该语言或库的Stack Overflow帖子。我们利用这些Stack Overflow语料库,使用word2vec训练词嵌入模型,这是衡量词相似度的基本模型。然后我们建立单词IDF(Inverse Document Frequency)字典集。单词的IDF表示包含该单词的Stack Overflow帖子数量的倒数。我们使用NLTK包将语料库中的每个单词还原为词根(也称为词干)。因此,具有相同词根形式的单词将具有相同的IDF值。一般来说,单词出现的帖子越多,单词携带重要语义信息的可能性就越小,因此其IDF越低。我们使用IDF作为词嵌入相似度的权重。最后,由于Stack Overflow帖子的文本量比API文档多得多,因此API文档中的单词将直接使用此词嵌入模型和IDF词汇表。

3.2 查找相关API

查找相关API的过程,包含三个步骤:一是检索与查询类似的Stack Overflow问题;二是检测Stack Overflow帖子中的API实体;三是计算查询与Stack Overflow帖子和API描述的相似性,从而对候选API与查询的相关性进行排名。

3.3 汇总API补充信息

生成候选API的排名列表后,BIKER会为列表中的每个API汇总补充信息。 之所以汇总补充信息,是因为在我们的调研以及对开发人员的采访中,发现开发人员往往需要详细查看相关API的描述和使用示例等信息,之后才决定使用哪个API。因此,BIKER汇总补充信息考虑了三个方面,表1是一个例子:

表1 BIKER汇总的API补充信息示例

解决编程任务和API文档描述差异性的API推荐方法「建议收藏」_https://bianchenghao6.com/blog_编程文档_第2张

• API官方描述:BIKER提供了API设计人员对API的官方描述,以便用户快速检查API的功能。

• 相似问题的标题:BIKER会找到前k个相似问题,找到所有涉及该API的回答,而后提取这些回答的标题。然后,BIKER会根据这些问题的标题与查询的相似性得分,对这些问题进行降序排序,并显示它们的标题(带有指向相应网页的超链接)。为避免过多标题对用户造成困扰,BIKER仅显示前3个问题的标题。这样,开发人员就可以将问题标题与其任务进行比较。

• 代码段:基于前k个相似的问题,BIKER检查每个问题的答案并提取包含该API的代码段。具体而言,如果一个代码段包含了指定API(例如Math.round)的情况下,且满足以下两个条件,则提取它 :

1)代码行数不超过5行。

2)API的类名(即Math)和方法名(即round)都包含在代码段中。

所提取的代码段按其与查询的对应问题的相似性得分按降序排列。为避免过多代码段对用户造成困扰,BIKER仅显示前3个代码段。这样,开发人员可以查看这些代码段,了解如何使用该API。

3.4 修改BIKER以适用于类级别的API推荐

默认情况下,BIKER推荐的是方法级别的API。不过,你也可以很方便地对其进行修改,以支持类级别的推荐。首先,我们修改了API检测的启发式规则。具体来说,就是改变正则表达式,使BIKER仅从超链接到API文档页面中提取API的类名(及其包的完整路径)。我们还更改了字典集以存储所有API的类名称,从而进行字符串匹配。其次,在相似度得分计算时,我们还更改了计算SimDoc的方式。尽管API类也有自己的描述,就像API方法一样,但根据我们的观察,API类的描述往往相当长,并且其提供的信息对特定任务要求来说,不具备针对性。因此,BIKER不使用API类的描述,而是将计算API查询请求和该类中每个方法的描述之间的相似性得分,并选择最高得分作为该API类的SimDoc结果。

4. 总结与展望

本文提出了一个名为BIKER的模型,它能够在输入自然语言描述的编程任务后,自动推荐与该任务相关的API。我们分析了开发人员搜索问题的过程,决定利用Stack Overflow帖子和API文档来提高BIKER的效率,并对BIKER推荐的每个API,汇总补充信息,以帮助开发人员更好地了解该API的用法,并确定它与查询任务的相关性。我们在自己的数据集和RACK的数据集上都进行了测试,证明BIKER确实是有效的。我们还进行了用户调研,结果表明,BIKER确实可以帮助开发人员在实践中更有效、更准确地找到合适的API。将来,我们会让BIKER用起来更加方便(例如,将它开发成网络浏览器或IDE中的一个插件)。此外,我们将根据用户研究参与者的建议,进一步改善BIKER的性能以及交互设计。最后,我们将让BIKER支持更多的编程语言。

致谢

本文由南京大学软件学院2018级硕士陈晟浩翻译转述。 感谢国家重点研发计划(2018YFB1403400)和国家自然科学基金(61690200)支持!

上一篇

已是最后文章

发表回复