安卓api文档_技术分享基于功能动词短语显式匹配的API方法推荐

1b2ac6ba07985cf18efc8a570ac64c7d.png

CodeWisdom-技术分享

基于功能动词短语显式匹配的API方法推荐

0ebb3ed5-903c-eb11-8da9-e4434bdf6706.svg

正确选择和使用API是完成许多软件开发任务的前提条件。流行的API库(例如JDK和安卓API)一般都提供了参考文档,其中对于API功能和使用方式都有描述。然而,由于API开发人员提供的功能描述和应用开发者使用的查询语句之间的语义鸿沟,基于文档的API检索结果经常都不如人意。其中的一个根本问题在于缺少对于API功能描述及相应的用户查询的语义信息的细化解析和理解能力。

针对这个问题,复旦大学CodeWisdom团队智能化软件开发小组首先对于API的功能描述进行了经验研究,总结得到了87种功能类别和每种功能类别包含的功能动词、描述常用的短语模式。根据经验研究的发现,进一步提出了一种API推荐方法,PreMA。该方法能够在API功能描述和用户查询中对于功能动词短语进行显式对齐匹配得到匹配的API。实验评估证明当PreMA用于API检索任务时,能比其他基准检索方法更准确和快速地帮助参与者完成编程任务。

相关研究论文《API method recommendation via explicit matching of functionality verb phrases》发表在软件工程领域的顶级国际会议ESEC/FSE 2020上。作者包括谢文凯(复旦大学)、彭鑫(复旦大学)、刘名威(复旦大学)、Christoph Treude(澳大利亚阿德莱德大学)、邢振昌(澳大利亚国立大学)、张晓欣(复旦大学)、赵文耘(复旦大学)。

论文链接地址:https://dl.acm.org/doi/10.1145/3368089.3409731

论文演讲地址:https://youtu.be/D8IeIKssB2o

背景

在我们程序员的撸码日常中,常常会在API文档中查询能满足我们所需功能的API。但有时候查询的结果会让我们一头雾水。

有一天,程序员小明想查询一个能将String对象转化成Int对象的API,小明自信满满的在查询栏输入了 “Convert a String to Int”,查询结果里却没有看到他想要的那个。

不服气的小明在整个API文档里翻了好几遍,终于看到了他的查询目标:java.lang.Integer.parseInt(String)。小明点开了这个API的详细信息,看到它的功能描述写着:“Parses the string argument as a signed decimal integer”。小明懵了,这明明和我输入的查询语句是一个意思,为什么查不出来呢?唉,这个搜索引擎可真不给力啊。

在我们平时的API查询中,有这么三个“坑”,给API的检索带来了麻烦。

01

第一个问题是功能动词的差异。特定的动词对于表达API的功能至关重要,而API使用者和API的开发者可能会使用不同的动词来描述同一个功能,给API检索带来了障碍。如上文中的小明的查询,其实parse和convert代表着同样的意思,都表达了转换类型的功能,相同意思的功能动词还包括了transformchange等。

02

第二个问题是短语模式的差异。由于自然语言表达的多样性和灵活性,可以使用不同的短语模式表达相同的功能。如convert A to B 和return B from A其实是表达了相同的功能。进一步的,在短语模式中涉及的不同成分可能扮演了不同的语义角色,这个对于句子的语义进行区分是至关重要的。同样以小明为例子,“Convert a String to Int”和“Convert a Int to String”描述了两个完全不同的功能,但是这两个句子的文本相似度是非常高的,导致检索出来的答案也是相同的。差异之处在于Int和String在两个句子之中扮演的不同角色,现有的API搜索方法将文本以词袋的方式进行考虑,就无法区分这种差异。

03

第三个问题是术语的差异。例如,当你查询“How do you crash a JVM?”时,回答可能会是“Terminates the currently running Java Virtual Machine. (java.lang.System.exit(int))”。在这个例子中,JVM和Java Virtual Machine是同一个东西的不同表达。有时候我们需要一些额外的知识背景来将两个不同的术语联系起来。

为了解决这个问题,有些研究人员使用了词嵌入技术或者更为高级的深度学习模型来学习自然语言描述和API调用序列的顺序模式。但这些方法或多或少都有各自的缺陷,忽略了API功能描述本身有的特性。我们认为在描述API的功能和解释用户查询的意图的时候,功能动词和对应的短语模式至关重要的,我们应该根据功能动词和短语模式所表达的语义而不是其词汇相似性,来对功能描述和用户查询进行匹配。

经验研究

基于我们初步的对于API功能描述的观察,我们假设大多数API功能可以用有限数量的常用功能动词来描述,并且这些功能可以进一步分类为少量功能类别。当然,为了验证这个假设,我们做了一系列的经验研究。

01

动词分析

我们用Spacy分析了54,256 个android、JDK的功能描述句子,识别出了931个不同的动词和它们对应出现的频率。图1展示了出现频率最高的30个动词,都是领域无关的常见动词。实际上大部分领域特定的动词出现频率都相当低,如dial(拨号,3次),mute(静音,3次),advertise(广告,7次)。

95924d1a127fe288e343093747c73eb4.gif 6e4f318170a6168c05e7e23284dca0c4.png

图1 出现频数最高的前30个动词

02

功能类别分类

我们进一步采样了14,774个功能描述句子进行标注,识别其中的功能动词和其属于的功能类别,比如,get、return、obtain等等一系列语义相似的动词都可以归类到get这个功能类别中。有可能会出现同个动词在不同的句子中有不同的语义的情况,我们会根据这整个功能描述的上下文,合理的将它们分类,所以也会出现同一个动词同时属于多个功能类别的情况。最终我们识别出了87个功能类别,总共包含356个功能动词(含重复的),平均每个类别包含4.7个功能动词,中位数是2.5。

87e22598a9430d3c60fb7734d6685fae.png

图2 出现频数最高的前10个功能类别

03

短语模式分析

我们同时也对于采样的句子进行分析,总结出对应的短语模式,短语模式包含了动词、介词、不定式等句法元素的抽象,其中涉及的名词短语会被根据语义进一步抽象成对应的语义角色,如source(来源),target(目标)。从Convert a String to Int总结出的短语模式是 V {source} to {target}. 经过汇总,我们得到了87个功能类别每个对应的523个短语模式,每个功能类别包含的短语模式最少是1。最多是25,平均值是6,中位数是4。并且对于每个功能类别,其中80%的句子都可以被1-5个短语模式所描述。

总结来说,大多数JDK和android的API功能描述都能被划分到有限的87个功能类别中,并且每个功能类别的句子,基本都能用1-5个短语模式来描述的。

方法

基于经验研究的结论,我们实现了一种基于新的API推荐方法,PreMA。整个方法的流程如图3所示。我们从API文档中抽取了API的功能描述,然后以相同的方式对于用户查询和API功能描述进行解析,包括功能类别分类和短语模式分析。其中对于API的解析式离线的,其结果会保存下来以进行进一步的查询。对于用户查询的解析式在线,然后我们对于用户查询和API功能描述在解析的基础上进行对齐和匹配,得到最终的API匹配结果。

11d7c03fbfed1ffa49b82f38735515f3.png

图3 PreMA方法流程概览

首先,我们基于Google的BERT语言模型实现了一个文本分类器,用于将API的功能描述或者用户查询分类到我们经验研究得到的87个功能类别之一或者特殊类别“Unknown”,训练使用的是我们经验研究标注的句子。

5f9cd678ecb58275911a1779e0d9100e.png

图4 功能类别分类

在确定了句子的功能类别之后,我们获取了功能类别对应的功能动词列表和短语模式列表作为匹配上下文,然后基于整个句子的依赖解析树和一些启发式的规则,最终可以解析得到句子对应短语模式和扮演了特定语义角色的名词。

14d4e7f3cd6a433b80711ff93357ee00.png

图5 短语模式分析

在完成以上步骤之后,我们可以将用户查询和API功能描述进行对齐,在功能类别、语义角色等不同维度进行细粒度的匹配。我们具体设计了一种方式来计算给定的API功能描述和用户查询之间的匹配得分,这个匹配得分综合了功能类别相似度、语义角色相似度以及文本相似度。

当然,是骡子是马还得拉出来溜溜。在实验中,我们将PreMA和基于Word2Vec的API检索工具进行了对比,结果表明我们的工具更为优秀。具体的实验内容可以在我们的论文原文中看到。

总结

总体而言,我们的工作对JDK和Android的API方法的功能描述进行了大量的分析,确定了少量常用的功能动词、功能类别和短语模式就可以将绝大多数API的功能进行描述,并且基于这样的分类方法,我们实现了PreMA这样一个工具,用于检索API并推荐给代码开发人员。当然,这只是我们在智能化软件开发道路上的小步,在利用知识辅助编程任务这个方向上,我们还任重而道远。我们也在计划将我们的总结出来的功能类别等知识进行封装,提供给大家使用,请关注我们的开源项目https://github.com/FudanSELab/funcverbnet。

CodeWisdom

03f3f6ceb1a2d0a176424f6fa38d5d3d.png 6b2eee01ed292a1f6142946a103522d7.png

欢迎关注CodeWisdom,Codewisdom平台由复旦大学软件工程实验室运营,提供智能化软件开发平台及线上沙龙相关资讯,关注可了解更多智能化软件开发的最新消息~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值