最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

SimilarTech:自动推荐跨不同编程语言的相似库

XAMPP新闻 admin 32浏览 0评论

摘 要

第三方库是软件项目的重要组成部分。开发人员经常需要查找类似的库,这些库可以提供与他们熟悉的库相似的特性。现有的发现类似库的方法受到社区管理的库、博客或问答帖子列表的限制,这些列表通常包含大量且过时的信息。本文介绍了SimilarTech工具(https://graphofknowledge.appspot.com/similartech),通过结合标签嵌入和从Stack Overflow中挖掘的领域特定的关系和分类知识,使自动推荐类似库成为可能。SimilarTech目前支持跨6种不同编程语言的6715个库推荐,同时发布了SimilarTech网站供公众使用。SimilarTech网站在过去6个月吸引了超过2400名用户,在网站访问日志中可以观察到两种典型的网站使用模式,来满足开发人员不同的信息需求。演示视频地址:https://youtu.be/ubx8h4D4ieE

 

1 引言

第三方库是软件系统的组成部分,它们允许开发人员专注于其应用程序的关键业务逻辑,从而帮助开发人员更有效地工作。开发人员经常需要一些类似的库,这些库可以提供与他熟悉的库相似的特性。这种需求包括,如由于任务需求当前的库缺乏某些想要的特性,或开发人员想要迁移到其他语言。图1给出了Stack Overflow上需要此类信息的一个例子。

drh00098

除了在问答网站上发布这样的问题外,开发人员还可以通过诸如“nltk类似库”、“nltk java”等查询在Internet上搜索有关类似库的信息。搜索结果通常包括一些社区管理的库列表、许多在线文章列表、或问答网站上的问答讨论列表(见图1)。然而,针对在线文档的许多推荐可能是过时的,或基于个人观点,因此可能存在偏见。此外,开发人员经常需要阅读许多在线文档,比较它们的信息,并对类似库查询的答案进行聚合。

为了克服这些缺点,SimilarTech工具的开发,允许用户直接且轻松地找到不同语言的类似库。该工具从Stack Overflow标签中提取软件库,基于从数以千万计的Stack Overflow问题的标签中学习到的标签嵌入来确定库的语义相似性。SimilarTech使用关联规则挖掘和自然语言处理方法挖掘关于标签之间的关联关系和分类信息。最后,从库的语义相似性、关联知识和分类知识出发,解释了库之间的相似性。该方法不是列出几十个无价值的库,也不是依赖博客或问答帖子,而是基于从Stack Overflow挖掘的类似库组成的知识库来直接推荐第三方库。这个知识库就像不断发展的博客帖子,包括良好的相似库以及人们熟悉的库。

目前,SimilarTech工具支持六种流行编程语言的相似库推荐,用户可以通过一个公开的web应用程序或通过我们的浏览器插件使用这个推荐工具。除了推荐相似库,SimilarTech网站还提供了Stack Overflow中每个推荐库的访问趋势,即随着时间的推移,用库标签标记的问题数量。这个趋势允许用户为他们的任务选择流行的库。

通过Google Analytics对网站访问数据的跟踪分析,作者发现在过去的6个月中,超过2400名用户访问了SimilarTech网站。从访问日志中,还可以观察到网站的使用模式,这可以帮助开发人员在搜索软件库时,处理不同的信息需求,这些定量和定性分析证明了SimilarTech工具的有效性。

 

2 提出的方法

SimilarTech方法将Stack Overflow中每个问题的标签和TagWiki的每个标签作为输入,并输出一个由相似库组成的知识库(见图2)。作者将一个Stack Overflow问题的所有标签视作一个标签语句,并将问题的每个标签看作这个标签语句的单词。最终建立了一个由标签语句组成的语料库,每个问题对应一个标签语句。本文通过关联规则挖掘从标签语句中挖掘出标签之间的关联关系,并根据TagWiki中的标签类别的定义,采用POS标注和短语分块来确定标签类别。然后使用连续skip-gram模型【9】学习标签嵌入,并结合标签的关联知识和类别知识,构建由相似库组成的知识库。

drh000098

2.1 挖掘关系型知识

根据作者的观察,在Stack Overflow中,每个问题最多有5个标签,并且同时出现的标签总是相关的。为了挖掘这种隐式关系,使用关联规则挖掘【1】来发现标签之间的相关性。

在应用关联规则挖掘时,将一个Stack Overflow问题视作一个事务,而问题标签作为事务中的项。由于要构造TAN,所以需要查找频繁的技术对,即由两个标签组成的频繁项集。如果使用这对标签标记的问题数量与所有问题数量的百分比高于最小支持阈值tsup,则表明这对标记经常被同时使用。对于一个频繁的标签对{t1, t2},如果关联规则的置信度高于最小置信度阈值tconf,则有关联规则t1 => t2。规则t1 => t2的置信度计算为,用这对标签标记的问题数量与用标签t1标记的问题数量的百分比。通过这些规则可以挖掘到高度相关的标签,如 (java, opennlp) 和 (python, nltk) 。更多的细节可以参考作者之前的工作【5,6】。

2.2 挖掘分类知识

从图1可以看出标签可以是不同的类别,如编程语言、库、概念、操作系统等。本文使用TagWiki中的标签定义,来区分标签的类别。TagWiki中的标签定义是由Stack Overflow社区协作编辑的。虽然Stack Overflow中没有严格的格式规则,但是TagWiki的描述通常以一个简短的句子开始来定义标签(如图3)。通常,be动词后面的第一个名词短语定义了标签的类别。

drh97

在此基础上,使用NLP方法(与【8】中用于命名实体识别的方法类似)从标签定义语句中提取名词短语作为标签的类别。POS标注将文本中的某个词标记为对应于某一特定词性,如普通名词、动词、形容词等。短语组块是将句子分割成名词短语、动词短语等子成分的过程。该方法首先采用POS对句子中的每个词进行标注,然后通过短语组块来识别名词短语。图3展示了iOS的标签定义句子的结果。基于POS标注和短语组块的结果,在be动词(在本例中是is)之后抽取第一个名词短语(即NP)(在本例中是operating system)。使用该名词短语作为标签的类别,即iOS的类别是operating system。但是标签句并不总是完整的,这不适用于POS标注。对于该情况,论文使用启发式标签匹配算法来找到对应的标签(更多细节在【3】中可以找到)。

2.3 标签嵌入学习

基于“具有相似含义的单词通常出现在相似上下文中”这一假设,单词嵌入是单词的低维向量表示。最近,Mikolov等人【9,10】论证了成对单词之间的单词嵌入编码的相似性,如“Paris : France”、“Madrid : Spain”存在的首都关系。尤为重要的是,上述作者表明这种关系可以反映在单词对之间的向量偏移上,即使用简单的向量计算便可以解决“a is to A as ? is to B”关系的表示,但这种关系本质上是被隐藏的。

在构建好一个标签句语料库之后,本文基于标签句语料库中标签的上下文,使用连续skip-gram学习算法【9】来学习每个标签的词表示。在生成的词嵌入空间中,类似库与其相应编程语言之间的向量偏移将表现出关系相似性,如nltk−python ≈ opennlp−java。因此,给定一个库nltk及其相应的编程语言python和另一种编程语言java,我们可以将寻找类似库的问题转化为一个简单的搜索某标签的K-最近邻(如opennlp)的问题,其中的最近邻项指的是与单词嵌入空间中的nltk-python+java向量最相似的标签表示。

本文采用Mikolov提出的连续skip-gram模型【9】。连续skip-gram模型的目标是学习每个擅长预测同句中共现词的单词表示。具体来说,给定一个训练文本流序列t1,t2,…,tk,则连续skip-gram模型的目标是使以下平均对数概率最大化:

drh097

其中tk为中心单词,tk+j为与中心单词距离为j的单词,N代表上下文窗口大小为2N + 1。

公式1中的概率 p(tk+j|tk) 可以表示为一个对数线性的softmax函数,该函数可以用负采样方法【9】进行有效求解。经过迭代前馈和反向传播后,训练过程最终收敛,每个标签得到一个低维向量作为其单词表示(即标签嵌入)。

2.4 构建相似库的知识库

基于标签的关系型知识、分类知识以及标签嵌入,本文建立了一个类似库的知识库。

在提出的方法中,库标记泛指其类别为library、framework、api、toolkit等的标记,因为这些类别的含义经常是重叠的,并且在TagWiki中没有一致的规则来使用这些术语。例如,在Stack Overflow的TagWiki中,junit被定义为一个framework,google-visualization被定义为一个API,而wxpython被定义为一个wrapper。本研究将这些标记都视为库标记。

给定一个库标记t1,首先检查它的相关标记,以确定编程语言标记PL1。PL2是一个编程语言标记,它可以与PL1相同,也可以与PL1不同。假设vec(x) 表示标签x的嵌入向量。为找到与用编程语言PL1标记的库t1相似的用编程语言PL2标记的库t2,该方法计算与vec(t1) -vec(PL1)+vec(PL2) 向量最相似(本文采用余弦相似度计算)的标签嵌入向量vec(t2)。

drh0097

其中T是不包括t1的库标记集,cos(u,v)是两个向量的余弦相似度。实际上,可能存在多个用编程语言PL2标记的库t2,与用编程语言PL1标记的库t1相似。因此,本文通过设置公式2的余弦相似度值高于某个阈值tal,来选择满足条件的库t2

以nltk库(用python写的NLP库)为例。如图4所示,对于python,该方法返回类似库,如textblob和gensim;对于java,该方法返回类似库,如stanford-nlp、opennlp、gate。

注意,标签嵌入向量与 vec(t1)−vec(PL1)+vec(PL2) 向量相似的标签可能并不总是库标签。该方法依赖于标签类别(即分类知识)来只返回库标记。类似地,返回的库标签有时包括不适合给定编程语言PL2的库。通过分析库和编程语言之间的关系(即关系型知识)来为给定的编程语言选择库。

 

3 推荐质量的评估

为了评估该工具的准确性,本文使用Precision@k度量,即给定一个库,手动检查跨不同编程语言的top K推荐。例如,给定nltk库,该工具推荐python和java两种语言的类似库。作者根据自己的已有知识,或通过线上查询库信息来检查每一个推荐是否正确。随机抽取了100个库,并手动检查它们的相应推荐。整体上的precision@1是0.81,precision@5是0.67。此外,实验还表明,与仅依赖标签嵌入的方法相比,结合分类和关系信息可以显著提高推荐的准确性。更多的实验细节,包括关系知识和分类知识质量的评估,可以论文【3】中找到。

 

4 工具支持

SimilarTech网站(https: //graphofknowledge.appspot.com/similartech)便是基于上述思想开发的。给定一个库的名称,该网页推荐它的六种不同编程语言的类似库。SimilarTech的后端是一个基于Stack Overflow数据堆构建的由类似库组成的知识库,其中包含了从2008年7月31日到2015年8月16日的Stack Overflow帖子数据。为了避免推荐结果过时,知识库可以在新数据堆发布时定期进行自动更新。

 

数据堆包含9,970,064个问题和41,856个不同的标签。在使用tagWiki的数据集中的36,197个标记中,有7,783个标记被归类为库标记。数据库只存储6,715个库标签,这些标签在Stack Overflow中使用次数足够频繁(在当前的实现中超过10次),以及它们对应的类似库,这些库对应于Stack Overflow中最常被问的前六种编程语言,包括java、javascript、c#、php、python以及c++。

drh00097

采用Django框架,用python语言搭建了这个网站,并基于D3.js绘制了每个库的访问趋势。SimilarTech应用程序的屏幕截图,如图4所示。给定一个库,试图为六种编程语言推荐类似库(与给定库的相似度高于最小相似度阈值0.4)。在当前的实现中,SimilarTech为每种编程语言提供了多达4个相似度最高的库。这样做的理由是,开发人员不太可能浏览一长串的推荐,而且每种编程语言通常只有几个最流行的库。请注意,列出最多4个库只是一个实现决策,而不是方法的限制。

对于每个推荐的类似库,SimilarTech显示了从相应的TagWiki中提取的简短定义。单击库名会导航到所单击库的类似库页面。这允许用户以交互方式探索底层类似库的知识库。SimilarTech还总结了每个月标记在一个库上的问题数量,并绘制了随着时间变化的访问趋势变化图。类似库的询问趋势允许用户很容易地比较Stack Overflow上每个库的问题数量。

对SimilarTech网站进行搜索引擎优化,使其可以被Google和Bing等搜索引擎检索。开发了一个程序来自动总结每个库的推荐结果,并将所有这些信息放入每个SimilarTech页面的元数据中。当搜索引擎抓取SimilarTech网站时,不仅会检索页面内的内容,还会检索网站元数据。最终,搜索引擎可以将SimilarTech网站排列在某些查询的搜索结果的顶部。如图5所示,2016年5月5日,SimilarTech网站在“nltk类似库”查询中排名第二。该网页的元数据是“8个最流行的与nltk库相似的(可替代的)库:textblob…”。元数据对网络用户来说是直观的和友好的,因为用户可以在没有点击的情况下了解网站提供什么信息。这里,只有nltk官方网站排名比我们高,但nltk官方网站与类似的库没有任何关系。

drh000097

5 工具使用

通过Google Analytics统计了SimilarTech网站的访问量,并展示了SimilarTech网站的两种典型使用场景。

5.1 SimilarTech网站的使用

SimilarTech发布后,并在相关网站(http://stackapps.com/questions/6667)发布了这个消息。根据Google Analytics的网站流量统计,从2015年11月11日到2016年5月5日,超过来自99个国家的2400名用户访问了SimilarTech网站。这些用户在每个会话中平均浏览3.7个页面,总共浏览10377个页面。这表明用户对检索结果感兴趣,因为他们通过访问几个页面来探索站点并与站点进行交互。其中13% 的用户在第一次访问后再次访问。对网站日志的分析显示,用户总共浏览了1802个推荐的类似库。图7列出了前15个最常访问的库。SimilarTech网站的使用数据虽然非常有限,但显示了用户对跨不同编程语言的类似库推荐的需求和兴趣。

drh0000097

drh96

5.2 使用场景

在对网站访问数据进行定量分析之后,进一步分析了SimilarTech网站的用户导航模式。根据作者的观察,用户访问有两种不同的导航模式。这两种使用模式有助于解决对软件库的两种不同的信息需求。

5.2.1 查找其他语言的库

该工具的主要目标是帮助开发人员找到针对不同编程语言的库的类似库。SimilarTech网站访问记录显示,用户确实是出于这种信息需求而来的网站,因为他们的第一次的搜索和随后的点击主要是为了寻找不同语言的库。这样的操作表明,给定一个库,用户对它在另一种语言中的类似库感兴趣。因此,他们点击推荐的库以获得更多细节。例如,一个用户首先键入“pdfminer”进行搜索,这是Python中最流行的pdf解析库之一。他随后点击“pdfbox”和“icepdf”,这两个库和“pdfminer”功能相似但语言不同,是用java编写的。

除了推荐类似库之外,SimilarTech系统有时还会提供一些新颖的(偶然发现)推荐,即一些有用但可能超出用户期望的信息。例如,某用户首先搜索opencv(c++中最流行的计算机视觉库),随后点击推荐结果之一marvin-framework(java中的图像处理)。然后,他不仅看到了一些类似于marvin-framework的库,如javacv,还看到了一个库opencv4android,这也是一个java库,但专门为Android移动系统采用。如果用户是一名移动应用程序开发人员,他可以从该推荐结果中受益。事实上,这个用户通过点击opencv4android显示了他对推荐的opencv4android的兴趣。

5.2.2 查找同一语言的类似库

令人意外的是,除了跨语言推荐之外,很多用户也使用SimilarTech网站来寻找同一语言的类似库。通过观察这些访问日志,作者发现他们的行为有两个目的。一方面,一些用户在寻找性能更好的库。例如,一个用户连续单击“jspdf”、“pdf.js”和“pdfjs”。这些库具有几乎相同的功能,用户可能会根据它们的描述和趋势数据来比较它们的性能。

另一方面,用户可以逐渐优化初始搜索,并通过搜索推荐结果找到需要的内容。例如,用户首先搜索“pythonmagick”(python编写的图像编辑库),然后单击“python-imaginglibrary”(python编写的用于图像处理的一个更流行的库)。最后,他点击一个更特定的库“pypng”(PNG图像编/解码),这个库比其他两个通用库要小得多,但可能有满足他需要的特定功能。这表明,通过SimilarTech网站导航可以细化搜索过程,以找到任务的更好解决方案。

 

6 相关工作

SimilarTech的目标是推荐不同编程语言的类似库。然而,软件工程中关于推荐的绝大多数研究工作集中在代码级推荐【17,19】和API级推荐【2,16】上。

语言迁移对于开发人员来说较为常见,因为他们可能必须根据任务需求从一种编程语言切换到另一种。最大的挑战通常是代码和库的迁移,而不是学习一门新语言。许多研究者提出了一些方法来克服代码迁移的难题,如代码映射【12】、函数映射【14】和API迁移【18,11】。与这些代码级迁移方法相比,该方法支持库级迁移。

Thung等人【15】分析软件项目中的库共现模式,为软件项目推荐相关库。Teyton等人【13】分析了项目对第三方库依赖的演变,并推荐了可以替代软件项目中现有库的库。与这些方法不同的是,本文方法不依赖于项目对第三方库的依赖信息,而是从特定领域的问答网站(如Stack Overflow)的众包知识中挖掘类似库。此外,现有的方法仅限于推荐同一编程语言的库,而SimilarTech系统可以推荐跨不同编程语言的可替代的、可比较的库。

目前也有一些网站支持类似工具推荐。SimilarWeb是一个为网站和移动应用提供用户参与度统计数据和类似的竞争对手的网站。AlternativeTo是一个根据用户提供的软件推荐可替代的软件的社交软件推荐网站。这些网站可以帮助经常上网的用户找到类似或替代的软件应用程序,但它们提供的内容对于软件开发人员特定领域的信息需求没有用处,例如,寻找不同编程语言的类似库。相比之下,SimilarTech系统是建立在软件工程数据之上的,是专门为软件开发人员设计的。

 

7 结论和未来工作

本文构建了一个SimilarTech工具,用来自动推荐不同编程语言的类似库。通过挖掘和整合Stack Overflow中的语义、关系和分类知识,实现了自动推荐。采用自然语言处理应用中最先进的深度学习方法(也称为单词嵌入)来学习标签嵌入,它对标签的语义相似度进行编码。用软件特定的关系和分类知识进一步增强标签嵌入,以更好地回答软件工程环境中的类似问题。给定一个库,SimilarTech工具可以为六种不同的流行编程语言推荐几个最突出的类似库。

在未来,作者将改进web应用程序,分析SimilarTech网站的流量和用户行为,以提高类似库推荐的准确性。此外,作者希望将方法扩展到细粒度级别的类似关系,例如,在问答讨论或其他在线资源(如GitHub)中挖掘不同库或编程语言的类似API。在Stack Overflow上可以找到成千上万的API类似问题,这表明迫切需要API级别的自动工具支持。当开发人员从一种编程语言迁移到另一种不熟悉的语言时,能够轻松地找到类似的API及其使用示例,可以提高他们的生产力和效率。

转载请注明:XAMPP中文组官网 » SimilarTech:自动推荐跨不同编程语言的相似库