基于用户反馈的API推荐工具①

2021-09-10 07:32杨忻莹
计算机系统应用 2021年8期
关键词:排序列表文档

杨忻莹,周 宇,2

1(南京航空航天大学 计算机科学与技术学院,南京 211106)

2(南京航空航天大学 高安全系统的软件开发与验证技术工信部重点实验室,南京 211106)

在软件开发过程中,应用程序接口(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.1 语义相似度计算模型构建

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

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 综合得分的计算公式如下:

其中,S coreQ(i)表示第i个API 在初始API 列表中的排序学习预测值,ALrelevQ(i) 表示列表中第i个API的排序学习预测值.S coremax和S coremin分别为排序分数的最大值和最小值,用于进行归一化处理.相关性得分的权重是一个动态值,它依赖于第i个API 在列表中所处的位置,即posi.

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的测量(一种标准化的非参数效应量测量) 来评估分析效应量的改进程度.一般来说,对于A和B两种算法,如果为0.5,则认为这两种算法是等价的.如果大于0.5,则算法A 优于算法B.通过以下统计量计算:

其中,R1是第一个数据组的秩和,m和n分别是第一个和第二个数据样本中的观察次数.在本文实验中,运行了相同次数的两种算法,即m和n的值都设置为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所示,通过记录每次用户查询的评价指标,可计算出评价指标的平均值(表2Avg.Tool),通过计算本文方法与对比方法的绝对提升值和相对提升值(表2Abs.Imp.和Rel.Imp.),可以更清晰的看出本工作相对于对比实验的优越性.

表2 模拟用户反馈场景

5 结论与展望

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

猜你喜欢
排序列表文档
浅谈Matlab与Word文档的应用接口
有人一声不吭向你扔了个文档
作者简介
轻松编辑PDF文档
扩列吧
恐怖排序
节日排序
Word文档 高效分合有高招
列表法解分式方程问题探索
列表画树状图各有所长