计算机系统应用  2021, Vol. 30 Issue (8): 237-242   PDF    
基于用户反馈的API推荐工具
杨忻莹1, 周宇1,2     
1. 南京航空航天大学 计算机科学与技术学院, 南京 211106;
2. 南京航空航天大学 高安全系统的软件开发与验证技术工信部重点实验室, 南京 211106
摘要:在软件开发的过程中, 开发人员经常会检索合适的API来完成编程任务. 为了提高软件开发效率, 大量API推荐方法及工具应运而生. 然而, 这些方法大多数都没有考虑用户交互信息. 本文提出了一个基于客户端/服务器架构的API推荐工具, 将其以插件的形式集成到VS Code IDE中. 本工具使用现有的API推荐工具生成初始API推荐列表, 结合用户反馈信息, 利用排序学习和主动学习技术对API推荐列表进行重新排序, 实现了用户个性化推荐. 大量实验证明, 随着反馈数据量的增加, 本工具的性能稳步提升.
关键词: API推荐    用户反馈    排序学习    主动学习    
API Recommendation Tool Based on User Feedback
YANG Xin-Ying1, ZHOU Yu1,2     
1. School of Computer Science and Technology, Nanjing University of Aeronautics and Astronautics, Nanjing 211106, China;
2. Key Laboratory of the Ministry of Industry and Information Technology for Software Development and Verification Technology for High Security Systems, Nanjing University of Aeronautics and Astronautics, Nanjing 211106, China
Foundation item: National Key Research and Development Program of China (2018YFB1003902); National Natural Science Foundation of China (61972197)
Abstract: Developers often search for appropriate APIs to complete programming tasks during software development. Many API recommendation approaches and tools have been proposed to improve the efficiency of software development, but most of these approaches do not consider user interaction information. In this study, we propose an API recommendation tool based on client/server architecture and integrate it into the VS Code IDE in the form of a plug-in. In our tool, initial API recommendation lists are generated by existing tools. Learning-to-rank and active learning techniques are used, combined with user feedback information, to re-rank the API recommendation lists, achieving personalized recommendation. Extensive experiments demonstrate that the performance of this tool has been steadily improved with the increase in feedback data.
Key words: API recommendation     user feedback     learning-to-rank     active learning    

在软件开发过程中, 应用程序接口(API) 发挥了重要作用[1], 开发人员可以使用API更有效地执行编程任务. 但是由于API的数量庞大, 开发者不可能熟悉所有的API, 也不可能始终为特定的开发任务选择合适的API. 当遇到不熟悉的编程任务时, 开发者往往会通过上网搜索相关功能的案例进行代码复用, 或者搜索相关的API文档, 学习相关API的使用方法. 能够针对程序员的需求进行合理的API接口推荐便成为了提高软件开发效率的重要途径之一. 为了解决这个问题, 国内外大量科研人员已在API接口推荐领域展开了一系列研究工作, 并实现了许多API推荐方法, 以减轻开发人员理解和搜索API的负担.

Thung等通过将历史特征请求与API文档信息相结合的方式, 进行API方法推荐[2]. BIKER[3]获取Stack Overflow问答网站上的问答信息和JDK的API文档信息[4], 根据帖子问题与用户查询的相似性推荐API.

这些方法往往基于信息检索技术以及自然语言处理相关技术提取关键字, 来缩小目标API的搜索范围、加快推荐效率. 然而他们大多均未考虑用户交互信息(例如用户从推荐列表中选择API), 这些信息通常被认为能够大大提高API推荐性能.

针对这一不足之处, 有少数工作利用了用户反馈信息. 例如, NLP2API[5]利用来自Stack Overflow网站的问答对来模拟伪用户交互, 从而重新制定查询语句, 实际上并没有进行真正的用户交互. Wang等[6]将反馈纳入到代码搜索过程中, 提出了一种主动代码搜索方法, 尽管他们的工作利用了反馈信息, 但需要用户明确的对推荐结果中的每一条信息进行相关性评分, 开销太大. 这部分工作虽然将反馈信息从传统的推荐系统领域引入到代码推荐领域, 但仍有改进的空间.

因此, 在现有的API推荐工作上, 本文提出一个新颖的API推荐工具.

首先, 记录用户使用本工具时产生的真实交互信息(即用户输入的查询语句和用户从推荐列表中选择的API), 将其作为用户反馈数据, 即反馈信息, 并构建反馈库, 将反馈数据以<用户查询, API>对的形式存入其中. 故用户在使用时不需要主动提供额外信息(如评分), 可减轻用户负担.

其次, 引入排序学习和主动学习技术以提升API推荐性能. 通过将API视为文档, 本工作将排序学习技术应用至API推荐领域中, 利用用户反馈等数据构建特征向量, 训练排序学习模型, 将用户反馈有效的融入到API推荐中, 以提高API推荐结果的准确性; 为了缓解“冷启动”问题、加速反馈数据的学习过程, 本工作采用了主动学习, 通过收集Stack Overflow的问答信息, 构造问答数据对, 用于辅助训练主动学习模型, 从而保证即使在反馈数据十分稀缺时, 仍能实现良好的推荐效果.

最后, 为了实现更好的扩展性, 可利用第三方API推荐方法作为组件, 根据用户需求, 灵活地嵌套到其他的API推荐方法之上.

本工具以插件的形式集成到了VS Code IDE中, 向用户提供API推荐, 这将会对API推荐系统产生积极影响. 值得强调的是, 尽管本工作目前专注于Java, 但是我们希望可以将其应用于其他编程语言的API. 本工作不仅提出了一种推荐方法, 而且提高了API推荐性能. 本文着重介绍了本工作的工具实现, 读者可参考原始论文[7]以获得更多详细信息.

为了评估所提出方法的有效性, 本文实验选择了最先进的API推荐方法BIKER[3]作为对比, 利用Hit@k/Top-k, MAP, MRR作为评估指标. 实验结果表明, 对比BIKER, 本工具API推荐的Hit@1准确率相对提升了18.2%, 高达51.8%.

1 方法实现

工作流程如下, 首先从JDK 8官方文档中提取用于描述API类和方法的总结句, 作为API文档, 再利用现有API推荐方法, 对用户输入的自然语言查询语句进行推荐, 得到初始API推荐列表. 通过语义相似度计算模型(1.1节)进行相似度计算, 对API推荐列表中的API构建特征向量(1.2节), 利用训练好的排序学习和主动学习模型(1.3节), 对初始API推荐列表进行重新排序, 并向用户呈现重排序的API推荐列表(1.4节). 此外, 可将用户从列表中选择的最合适的API, 与本条查询语句一起形成反馈数据, 存入反馈库中(1.5节), 再根据反馈数据对推荐结果进行优先级调整, 使得用户选择的推荐项位于推荐结果列表中更加靠前的位置, 从而提高API推荐准确率. 本工作的具体实现细节可以在文献[7]中找到, 在此不做赘述. 本工具的整体架构如图1所示.

1.1 语义相似度计算模型构建

本模块构建一个语义相似度计算模型, 为特征提取模块提供相似度计算方法. 首先从Stack Overflow[8]问答网站上下载历史问答信息[9], 问答信息以.xml格式文件保存. 由于本工具是针对Java相关的API推荐, 因此只提取带有Java标记的帖子信息. 随后利用NLTK[10]对帖子信息进行传统的文本预处理操作, 包括标记和词干分析. 接着使用Word2Vec[11]对词嵌入模型进行训练, 并计算预处理后语料库中每个单词的IDF (逆文档频率), 从而构建一个IDF逆文档频率表作为词嵌入模型的权重项. 利用训练得到Word2Vec模型和IDF逆文档频率表文档, 构建语义相似度计算模型[12].

图 1 方法整体架构

1.2 特征提取

特征提取模块主要任务是根据构建的语义相似度计算模型, 进行相似度计算, 并构建特征向量, 构造完成的特征向量可作为训练模型或预测模型的输入数据.

在接收到查询语句、初始API推荐列表之后, 结合反馈库数据, 为初始API推荐列表中每个API提取一个特征向量, 特征向量包括两个部分, 相关信息特征和反馈特征. 相关信息特征可从API文档中获取, 由API路径功能和API描述功能组成, 分别表示推荐的API与用户查询和相关文档描述的相关性; 反馈特征可从反馈库中提取, 代表与反馈库中API的相关性.

1.3 排序学习和主动学习模型训练

本模块用于训练排序学习和主动学习模型, 为API重排序模块提供模型支撑. 通过1.2节中特征提取过程, 对反馈库中的每条反馈数据提取特征向量, 以构建训练集.

通过将特征向量输入到排序学习模型, 最终得到训练良好的排序学习模型.

训练主动学习模型之前, 先利用来自Stack Overflow的问答信息构造<查询, API>问答数据对, 其中查询与问题相对应, API与接受的答案中的API相对应. 这些问答数据对可对主动学习模型选取的样本提供标注, 将其放入训练集中再次训练模型. 通过迭代此过程, 可以获得训练好的主动学习模型.

1.4 API重排序推荐

本模块的目的是根据训练好的模型, 得到用户输入查询对应的重排序API推荐列表, 供用户选择. 对于用户输入查询语句, 首先通过1.2节得到其对应的API特征向量, 将其分别输入到训练好的排序学习和主动学习模块中, 得到各个模块的预测值, 计算出API推荐列表中每个API的分数. 列表中的API排名位置根据分数降序排列, 得到重排序API推荐列表, 供用户进行选择, 使得用户选择的API在列表中位于更加靠前的位置. API综合得分的计算公式如下:

$ AllScor{e_Q}\mathit{(i)} = \frac{{Scor{e_Q}\mathit{(i)} - Scor{e_{\min }}}}{{Scor{e_{\max }} - Scor{e_{\min }}}} + \mu ALrele{v_Q}\mathit{(i)} $ (1)

其中, $Scor{e_Q}(i)$ 表示第 $i$ 个API在初始API列表中的排序学习预测值, $ALrele{v_Q}(i)$ 表示列表中第 $i$ 个API的排序学习预测值. $Scor{e_{\max }}$ $Scor{e_{\min }}$ 分别为排序分数的最大值和最小值, 用于进行归一化处理. 相关性得分的权重是一个动态值, 它依赖于第 $i$ 个API在列表中所处的位置, 即 $po{s_i}$ .

1.5 用户反馈

用户反馈模块负责更新反馈库. 用户从重排序API推荐列表中, 根据自身需求, 选择API, 将查询语句和用户所选API作为反馈数据, 存入反馈库, 为后续推荐提供反馈信息.

2 工具实现

本工具以插件的形式集成到VS Code IDE中, 采用客户端/服务器架构. 服务器端对VS Code获取的用户输入数据进行处理, 返回数据处理结果, 并通过客户端将结果展示给用户.

为方便用户在编程过程中快速查询所遇到的问题, 本工具直接内嵌在VS Code IDE中, 不涉及另外的系统界面. 用户可以在源码编程面板任意位置点击右键, 或者使用快捷键唤醒.

根据用户交互信息, 本工具为用户提供了个性化的API推荐列表, 实现了API个性化推荐功能. 系统架构主要分为两个模块: 用户输入查询模块和API推荐反馈模块.

2.1 用户输入查询模块

用户输入查询模块的整体流程如图2所示, 该模块的目的是提供一个接口, 以获取用户输入的自然语言查询语句, 传递给后台服务器进行API推荐的后续处理工作.

图 2 用户输入查询流程

具体来说, 当用户在编程环境中, 想要获取API推荐, 可以通过图2中的操作(a)、(b)或(c)打开文本输入框(d)以进行自然语言查询输入. 客户端从文本输入框中获得查询语句, 传给服务器端进行处理, 再将得到的推荐结果返回给用户, 即API推荐列表页面(图3).

图 3 API推荐列表页面

2.2 API推荐反馈模块

服务器获取自然语言查询语句后, 会返回相关的API, 客户端为用户展示如图3所示的API推荐列表页面. 用户可在该页面上进行API选择, 客户端将查询语句连同用户选择的API视为反馈数据传递给服务器. 服务器将其放入反馈库, 用以优化模型.

2.2.1 API推荐

服务器将与查询语句最相关的前30个API返回给客户端, 客户端以每页10个API的方式分页展示, 用户可以通过图3中操作(g)切换页面, 以浏览更多的API. 本工具不仅为列表中每个API提供API方法名(e), 还提供对应的描述语句(f), 为用户选择反馈提供参考依据.

2.2.2 用户反馈

用户可以选中一个API(h), 此时会弹出一个对话框, 向用户确认是否将该API作为反馈信息存入反馈库中.

若用户选择“是”, 则该API与本次输入的自然语言查询语句一起构成反馈数据, 存入反馈库, 为下一次用户查询提供更加个性化的推荐; 若用户选择“否”, 则会返回至API推荐列表界面.

3 应用场景

本章通过示例来说明本工具如何提升API推荐性能. 在通常情况下, API方法名和文档描述信息有助于用户了解API的用途. 对于诸如: How to convert int to string的查询语句, 用户在浏览API方法名时可以快速找到正确的答案: java.lang.Integer.toString. 但是, 在许多情况下, 仅通过API方法名来判断该API是否有用是很困难的. 例如, 给定查询: Make a negative number positive, 其对应的答案: java.lang.Math.abs在语义上与查询语句没有重叠, 但借助文档描述信息(即: 返回参数的绝对值), 可以很容易判断该API是正确答案.

当用户了解API的用法之后, 可以选择他认为合适的答案, 放入反馈库中保存, 这些反馈信息对于后续的推荐有显著帮助. 例如, 对于查询语句: killing a running thread in java, 在反馈库中没有相关查询语句的情况下, 根据API方法名和描述信息, 用户能很快确定排名第7的API: java.lang.Thread.interrupt是正确答案, 并对其进行选择, 放入反馈库中存储. 当用户之后再次查询类似的语句, 例如: how to stop a thread, 通过检索反馈库数据, 本工具能将原本排在第8位的: java.lang.Thread.interrupt提升到第1位. 使得用户浏览API推荐结果时, 能迅速找到正确答案, 极大提升了API推荐效率.

4 实验评估

为了验证方法的有效性, 本文使用目前最先进的API推荐方法之一的BIKER[3]作为对比实验. BIKER和现有的大多数API推荐方法一样, 仅利用了语义相似度技术, 根据文本相似度分数向用户推荐API. 而本文提出了一种基于用户反馈的API推荐工具, 将用户反馈融入到API推荐过程中, 并且采用了排序学习和主动学习技术, 通过语义相似度构建特征向量, 训练模型进行预测, 根据模型预测综合得分, 为用户提供个性化的API推荐.

为了确保与对比实验进行公平的比较, 本文实验的数据集复用BIKER发布的数据集, 即来自Stack Overflow上与Java API相关的413个问答对. 为了评估实验性能, 实验设置遵循标准的10折交叉验证, 即将数据集随机分割为9:1, 每次使用1折作为测试数据, 其余9折用于模型训练. 重复实验5次, 将结果记录下来, 并计算平均值作为最终结果. 为了避免偏差, 反馈库与测试集中不存在相同的查询语句. 读者可以查看之前的工作[7], 以获取有关实验结果的更多详细信息.

4.1 增加反馈数据量

通过从训练集中随机选择问答对, 来构建反馈库. 反馈库的大小从训练集的10%到100%不等, 且增幅为10%. 实验结果如表1所示, 结果表明, 在可接受的开销条件下, 与BIKER相比, 随着反馈数据的增加, 本工具的推荐性能稳步提升, Hit@1准确率最高提升了18.2%, MAP和MRR提升了12%左右, Hit@5突破了80%. 实验结果验证了反馈信息有助于提升API推荐性能.

表 1 增加反馈数据量对工具的影响

4.2 有效性分析

为了评估实验结果的意义, 本节对得到的结果进行了统计分析. 根据Mann-Whitney U检验[13], 可从统计意义上判定实验是否有显著的改善. 此外, 通过Vargha和Delaneys的 ${\hat A_{{\rm{12}}}}$ 测量(一种标准化的非参数效应量测量)来评估分析效应量的改进程度. 一般来说, 对于AB两种算法, 如果 ${\hat A_{{\rm{12}}}}$ 为0.5, 则认为这两种算法是等价的. 如果 ${\hat A_{{\rm{12}}}}$ 大于0.5, 则算法A优于算法B. ${\hat A_{{\rm{12}}}}$ 通过以下统计量计算:

${\hat A_{12}} = \dfrac{{\dfrac{{{R_1}}}{m} - \dfrac{{m + 1}}{2}}}{n} $ (2)

其中, ${R_{\rm{1}}}$ 是第一个数据组的秩和, mn分别是第一个和第二个数据样本中的观察次数. 在本文实验中, 运行了相同次数的两种算法, 即mn的值都设置为5.

结果表明, 大多数p值在0.003到0.005范围内, 效应量为1, 表明在96%的置信度上, 该提升具有统计学意义. 在50个案例中有2个案例(反馈数据量为10%时的Hit@3和Hit@5), 其中p值大于0.005(即, 应否定原假设).

4.3 模拟用户反馈场景

本节设计了一个伪用户来模拟真实场景下的用户推荐及反馈过程. 实验随机选择50个查询, 将其作为伪用户在编程环境中输入的查询语句, 依次进行自然语言查询. 在每次查询期间, 本工具都会根据反馈库信息推荐API, 而伪用户则会从推荐结果中选择API. 查询语句和选择的API用于扩展反馈库. 实验结果如表2所示, 通过记录每次用户查询的评价指标, 可计算出评价指标的平均值(表2 Avg. Tool), 通过计算本文方法与对比方法的绝对提升值和相对提升值(表2 Abs. Imp.和Rel. Imp.), 可以更清晰的看出本工作相对于对比实验的优越性.

表 2 模拟用户反馈场景

5 结论与展望

本文提出了一种新的工具来提升API推荐方法的性能, 并将其以插件的形式集成到VS Code IDE中. 在用户编程环境中, 通过获取用户输入的自然语言查询语句, 推荐相关API. 受传统推荐系统中的用户反馈信息的启发, 本工作通过不断收集用户对于API推荐列表的反馈, 提高推荐准确率. 实验表明, 本工具的推荐性能优于对比实验, 随着反馈信息数量的增加, API推荐的有效性也显著提升. 未来的工作计划是扩展工具以支持更多的编程语言. 此外, 本文中提出的方法实际上具有更广泛的适用性, 因此计划将其扩展到软件工程中的其他推荐场景.

参考文献
[1]
Brandt J, Guo PJ, Lewenstein J, et al. Two studies of opportunistic programming: Interleaving web foraging, learning, and writing code. Proceedings of the 27th International Conference on Human Factors in Computing Systems. Boston, MA, USA. 2009. 1589–1598.
[2]
Thung F, Wang SW, Lo D, et al. Automatic recommendation of API methods from feature requests. Proceedings of the 28th IEEE/ACM International Conference on Automated Software Engineering. Silicon Valley, CA, USA. 2013. 290–300.
[3]
Huang Q, Xia X, Xing ZC, et al. API method recommendation without worrying about the task-API knowledge gap. Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering. Montpellier, France. 2018. 293–304.
[4]
Java documentation. http://docs.oracle.com/java-se/8/docs/api/. (2019-05-06).
[5]
Rahman MM, Roy CK. Effective reformulation of query for code search using crowdsourced knowledge and extra-large data analytics. Proceedings of 2018 IEEE International Conference on Software Maintenance and Evolution. Madrid, Spain. 2018. 473–484.
[6]
Wang SW, Lo D, Jiang LX. Active code search: Incorporating user feedback to improve code search relevance. Proceedings of the 29th ACM/IEEE international conference on Automated software engineering. Vasteras, Sweden. 2014. 677–682.
[7]
Zhou Y, Yang XY, Chen TL, et al. Boosting API Recommendation with Implicit Feedback. IEEE Transactions on Software Engineering, 2021.
[8]
Stack overflow. https://stackoverflow.com/. (2019-04-13).
[9]
Jentsch M. Stack overflow data dump. http://www.dieletztedomain.de/stack-overflow-data-dump/. (2014-01-27).
[10]
NLTK. http://www.nltk.org/. (2019-04-28).
[11]
[12]
Mihalcea R, Corley CD, Strapparava C. Corpus-based and knowledge-based measures of text semantic similarity. Proceedings of the 21st National Conference on Artificial Intelligence and the 18th Innovative Applications of Artificial Intelligence Conference. Boston, MA, USA. 2006. 775–780.
[13]
Arcuri A, Briand L. A practical guide for using statistical tests to assess randomized algorithms in software engineering. Proceedings of the 33rd International Conference on Software Engineering. Honolulu, HI, USA. 2011. 1–10.