基于众包知识的API推荐方法研究
张廷秀
摘要:软件开发者在开发过程中使用应用程序接口(Application Programming Interface ,API)来提高软件开发效率,但查找并选取合适的API接口是一项耗时且具有挑战的任务。已有的研究通常采用API文档作为语料库,通过关键词匹配的方式来推荐适合的API,然而由于开发者使用的关键词与需要查找API的差异,因此直接检索的效果并不是很好。众包问答网站如Stack Overflow每天产生数以千计的问答数据,这些数据包含了API名称及API的描述,可以利用这些众包问答数据提升用户检索数据结果。基于这一思路,提出了一种基于信息检索技术和众包问答数据的API推荐方法。该方法利用众包问答数据对用户输入的查询语句进行建模并计算与已有问题的相似度进而根据已有问题的答案为用户推荐相关API。为了验证该方法的有效性,从Stack Overflow中提取Java相关的问答数据,提取其中的API描述信息及API信息进行模拟实验,结果表明,该文方法能有效提高API查询的准确性。
关键词:众包知识;API 推荐;信息检索;问答网站
中图分类号:TP301? ? ? 文献标识码:A
文章编号:1009-3044(2021)17-0076-03
开放科学(资源服务)标识码(OSID):
Research on API? Recommendation Method Based on Crowdsourcing Knowledge
ZHANG Ting-xiu
(Jiangsu Vocational Institute of Architectural Technology , Xuzhou 221116 , China)
Abstract: Software developers apply application programming interface (API) to improve the efficiency of software development, but it is a time-consuming and challenging task to find the appropriate API. Existing studies usually use API documents as corpus to recommend suitable APIs by keyword matching. However, due to the differences between the keywords used by developers and the APIs they need to find, the effect of direct retrieval is not very good. Crowdsourcing Q & A websites such as stack overflow generate thousands of Q & a data every day. These data include API name and API description, which can be used to improve users' retrieval results. Based on this idea, an API recommendation method based on crowdsourcing Q & a data is proposed. This method uses crowdsourcing Q & a data to model user input query statements and calculate the similarity with existing questions, and then recommends relevant APIs for users according to the answers of existing questions. In order to verify the effectiveness of this method, Java related Q & a data is extracted from stack overflow, and the API description information and API information are extracted for simulation experiments. The results show that this method can effectively improve the accuracy of API query.
Key words:crowdsourced knowledge; API recommendation; information retrieval; Q&A
1 引言
隨着信息技术的发展,软件的规模越来越大,软件开发者需要使用各种各样的开发框架和接口来完成开发任务。然而,当开发者需要开发不熟悉的功能时,他们需要确定哪个API或者库能帮助他们完成开发任务。通常,开发者通过互联网搜索引擎或者软件文档查询、搜索相关API及代码片段来辅助完成开发任务。但从海量的数据或文档中选择合适的API并学习API使用模式是一件耗时且具有挑战性的任务。开发者需要通过自然语言在互联网或者问答网站上检索,由于同一个功能或者API具有多种不同的描述方式,在检索时开发者可能需要多次变换检索关键字才能找到满意的结果,研究表明,开发者平均花费19%的开发时间通过互联网搜索相关API或代码片段完成开发任务。
然而,当开发者不熟悉某个API时很难使用准确的关键字描述API,因此开发者直接从API文档中查找需要使用的API具有一定难度,同时在找到合适的API时,如何使用这些API即掌握API的调用序列是开发者在使用API过程中面临的第二个问题。如果开发者选择通过互联网搜索相关API,也要面临选择合适关键词作为检索词及API调用序列学习的问题。同时当开发者面临开发任务或者难以解决的编程任务时也会到众包问答网站,如Stack Overflow上提问,众多具有丰富经验的开发者可以根据提问者的描述给出自己的答案,提问者可以根据回答者的回答进行编程测试,并根据测试结果选择合适的解决方案。如图1所示,从著名众包编程问答网站Stack Overflow上截取的编程问答实际案例。Stack Overflow包含数以千万计的问答数据,并且新的问题也在不断地被提出,每个问题包含了不同级别开发者对于问题的不同描述,问题的回答者也会根据问题内容给出具体API和代码片段。因此研究如何利用众包编程问答网站产生的问答数据帮助开发者快速找到合适的API及API调用序列是具有重大意义和亟待解决的问题。
2 问题描述及相关工作
2.1问题描述
API推荐是根据用户输入的Q,返回相关的代码片段、单个API方法或者API调用序列及API Library。根据输入Q的类型不同,可以分为以自由文本作为出入、API名称作为输入及其他类型的输入。本文研究的内容为根据用户的自由文本输入推荐API名称及API调用序列。
2.2相关工作
2.2.1基于自由文本输入API推荐研究现状
传统基于自由文本输入API推荐主要是基于信息检索技术,计算用户输入和API代码注释的文本相似度进行API推荐。张云帆等人提出了基于用户输入和GitHub开源项目API注释的文本相似度的API推荐方法。张睿峰等人提出了基于注意力机制的API使用模式推荐方法,解决了自由文本输入时关键词出现顺序不同导致语义不同的情形。Jiang 等人结合信息检索和监督学习方法为开发者推荐代码片段。Qiao等人提出了BIKER方法解决API推荐问题,该方法使用词嵌入技术计算文本相似度得分,解决了传统基于文本相似度算法中的词空缺问题。
2.2.2基于API名称输入等其他类型输入API推荐研究现状
基于API名称的推荐研究主要集中在类库方面。Zheng W提出了一种基于搜索引擎的API Library推荐方法可以根据API名称推荐功能相同的API Library。Thung F提出了一种基于协同过滤的方式为开源软件特性功能更新请求推荐API。Yu H提出了一种基于图算法API推荐算法,可以根据API调用上下文信息进行API名称推荐。Gao W提出了一种基于协同过滤算法和个性化权重排序算法的Web API推荐算法。D'Souza A R通过提取GitHub上面开源项目并使用KNN算法对相似的使用语法进行提取然后根据BMN算法对结果进行排序形成最終的API推荐列表。
3 整体框架
图2给出了算法的整体框架。根据前文所述API代码推荐使用场景描述,当用户输入查询语句时,算法会根据用户输入推荐处与用户输入内容前10个最相关的API代码调用序列。整个算法总共分为三个部分:句子向量化表示、API调用序列提取、句子相似度计算。
3.1数据提取
本文从Stack Overflow官方的数据镜像中下载了Posts.xml,并从中提取了208432对有效问答数据。由于我们只关注Java相关的问答数据所以我们在提取时只提出了Tag为java的问答数据。被采纳的回答数据中包含了用户对答案的描述及代码片段,经过观察发现,回答中的代码片段总是包裹在标签中,因此我们可以通过正则表达式提取原始HTML数据中的代码片段和回答描述信息。通过以上步骤我们可以将原始数据中的代码片段和表述信息分离以便下一步处理计算使用。
3.2句子向量化表示
为了能够计算用户输入查询和系统中已存在问题的相似度,需要对用户的输入查询语句进行向量化表示。如图2所示,对于语料库中的数据,我们会对其进行自然语言处理并建立doc2vec模型,该方法基于word2vec的思想,在训练时为每个句子加入唯一标识段落id,保证训练过程中每个句子都有一个唯一的id。该id和传统word2vec算法中的word一样,也是先映射成一个向量,即段落向量。虽然段落向量与词向量的维数一样,但来自两个不同的向量空间。后续计算过程中,段落向量和词向量累加或者连接起来,作为softmax层的输入。同一个句子或者文档的训练过程中段落编号保持不变,共享段落向量,相当于每次在预测单词的概率时,都利用了整个句子的语义。算法原理图如图3所示。
3.3 API类和方法提取
根据已有研究结果,从代码片段中提取API调用序列主要有两种方式。一种是将代码转换成为AST表达式树的方式抽取代码调用序列;另外一种是通过正则表达式组合及孤岛解析技术提取API调用模式或者方法。前一种适合完整可运行的代码片段,而第二种技术适用场景比较广泛且本文所研究数据基于众包问答网站数据,用户的回答所包含的代码不一定是完整可运行的,所以本文采用第二种提取方式。首先从原始数据中提取出标签中所包含的代码片段,之后采用论文中的方法提取API类和方法,为了保证提取出API类和方法的正确性,在提取出API方法和类时会和官方文档中的类名和方法名对比,只有对比通过的数据才会作为有效数据存储。经过本步骤的提取最终形成三元组。
3.4 API推荐
API推荐主要包含两个部分,第一部分是对用户输入的查询内容进行自然语言处理,转换成句向量。第二部分将生成的句向量依次与已有的三元组中的问题描述句向量计算相似度,将相似度最高的前N个三元组中的API调用序列、API方法名作为推荐结果输出。
4实验分析
4.1实验步骤
根据实验步骤3.1-3.4算法步骤和从Stack Overflow中提取的数据训练算法模型。设计多个API查询场景的自然语言查询语句,如“how to parse html in java”,在推荐的结果中查询是否有合适的API出现,如果有则视为有效推荐,否则视为无效推荐。
4.2评价指标
为了评价算法的有效性,本文通过准确率和累计增益评价对TOP-N推荐结果进行评价。准确率(Precision)是通过计算推荐结果列表中包含用户所需要API个数进行评测,用来评价结果的质量。则推荐结果的准确率定义为:
其中, R(u)表示在根據训练数据给用户做出的推荐列表, T(u)表示用户根据测试数据给用户做出的推荐列表,则为推荐列表中最终有效的推荐结果。
为了衡量推荐结果的排序对算法有效性的影响,我们采用折损累积增益(Discounted Cumulative Gain,DCG)作为评价指标,其基本思想是用户需要的API越靠前越能提高用户的体验。用户往往只会查看排名靠前的TOP-N个结果。DCG的定义为:
其中,i代表推荐结果排序的位置,如果该推荐结果与查询相关则reli 为1,否则为0, DCGp为推荐列表前 Top?K 项得分的累加值,其值越大表示用户兴趣度越高。
4.3实验结果
本文使用传统的TF-IDF文本相似度算法做对比实验,对比结果如图4,图5所示。
由图4可知,随着推荐结果K的增长,两种推荐算法的准确率都呈现了下降趋势。当K值为5时两种算法的准确率都达到了最高水平。对比来看,本文算法同等条件下准确率较高且随着K值的增长准确率减少速度相对较慢。由此可知,本文算法推荐效果更好,稳定性更强。
从图5的DCG指标来看,同等推荐数据设置情况下,随着推荐数量K的增加,TF-IDF算法和本文算法DCG值均会提高,但是相对而言,本文算法提高速度更快。由此可知,本文算法不仅在准确率上优于TF-IDF算法,而且能够适应用户的喜好,更好地满足项目的推荐效果。
综上所述,以TF-IDF算法为基准算法做对比,本文算法在准确率和折损累积增益两个指标上均有所提升。表明本文推荐算法不仅能够挖掘出用户需要的 API接口,而且可以取得更高的准确率和用户满意度,其推荐效果和质量均优于传统的TF-IDF算法。
5 结论
本文基于众包编程问答网站Stack Overflow数据作为语料库构建了基于句子相似度的API推荐算法,这弥补了传统基于API文档等语料库数据更新不及时的缺点。实验证明众包编程问答网站的数据可以用来做API推荐语料库,且基于本文算法推荐API比传统TF-IDF算法具有更优的推荐效果。
参考文献
[1] 余力,刘鲁,李雪峰,等.用户多兴趣下的个性化推荐算法研究[J].计算机集成制造系统 ,2004,10(12):1610-1615.
[2] 李鑫.一种面向Mashup应用的API推荐方法[J].计算机技术与发展,2021,31(2):38-43.
[3] 杨延娇,赵国涛,王丕栋.基于语义与情感的句子相似度计算方法[J/OL].[2021-01-20].https://kns.cnki.net/kcms/detail/11.2127.TP.20201120.1549.017.html.
[4] 李浩,钟声,康雁,等.融合领域知识的API推荐模型[J].计算机科学,2020,47(S2):544-548.
[5] 高顺峰,张再跃.面向句法块向量的句子相似度计算方法[J].软件导刊,2020,19(10):106-110.
[6] 李鑫.多维数据融合的API服务可信推荐方法研究[D].开封:河南大学,2020.
[7] 吴涵.基于Mashup服务功能语义聚类的Web API推荐方法研究[D].杭州:浙江工业大学,2020.
[8] 朱书苗.基于Mashup服务语义表达聚类的API推荐方法研究[D].杭州:浙江工业大学,2020.
[9] 张云帆,周宇,黄志球.基于语义相似度的API使用模式推荐[J].计算机科学,2020,47(3):34-40.
[10] 韩院彬,赵辉,檀蓉,等.改进型协同过滤的API服务推荐方法研究[J].现代电子技术,2019,42(21):86-89.
[11] 夏艳敏,唐兵,唐明董,等.利用关联规则挖掘的Web API组合模式发现[J].小型微型计算机系统,2019,40(10):2195-2201.
[12] 张睿峰,王鹏程,吴鸣,等.基于注意力机制的Java API序列推荐方法[J].计算机系统应用,2019,28(9):209-214.
【通联编辑:唐一东】