CN114356319A - 一种根据自然语言描述推荐api的方法 - Google Patents
一种根据自然语言描述推荐api的方法 Download PDFInfo
- Publication number
- CN114356319A CN114356319A CN202111667464.4A CN202111667464A CN114356319A CN 114356319 A CN114356319 A CN 114356319A CN 202111667464 A CN202111667464 A CN 202111667464A CN 114356319 A CN114356319 A CN 114356319A
- Authority
- CN
- China
- Prior art keywords
- api
- metadata
- java
- similarity
- recommendation
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 53
- 230000009193 crawling Effects 0.000 claims description 13
- 239000013598 vector Substances 0.000 claims description 12
- 239000008186 active pharmaceutical agent Substances 0.000 claims description 11
- 238000005065 mining Methods 0.000 claims description 9
- 238000004422 calculation algorithm Methods 0.000 claims description 7
- 230000000694 effects Effects 0.000 claims description 4
- 238000004364 calculation method Methods 0.000 claims description 3
- 238000007621 cluster analysis Methods 0.000 claims description 3
- 238000000605 extraction Methods 0.000 claims description 3
- 239000000463 material Substances 0.000 claims description 3
- 238000007781 pre-processing Methods 0.000 claims description 3
- 230000004044 response Effects 0.000 claims description 3
- 238000005259 measurement Methods 0.000 claims description 2
- 238000013139 quantization Methods 0.000 claims description 2
- 239000000126 substance Substances 0.000 claims description 2
- 238000011161 development Methods 0.000 description 4
- 238000011160 research Methods 0.000 description 3
- 230000006870 function Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 238000011002 quantification Methods 0.000 description 1
- 238000011524 similarity measure Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种根据自然语言描述推荐API的方法,属于软件工程领域,本发明爬取、分析Github上的大量Java开源项目,通过层次聚类挖掘API使用模式,实现基于自然语言查询的API推荐系统,根据输入的功能描述的自然语言文本,推荐实现这一功能所需的API方法。
Description
技术领域
本发明涉及软件工程领域领域,尤其涉及一种根据自然语言描述推荐API的方法。
背景技术
API在现代软件开发中被广泛使用,调用API是开发者快速构建软件、提高开发效率的重要方式之一。随着软件行业的发展和软件规模的扩大,软件工程越来越复杂,第三方库的数量也与日俱增,它们提供了大量可供调用的API来帮助开发者简化开发过程。但是随之而来的也有不足之处,对于这些众多的第三方API,开发人员几乎不可能完全了解,很难只凭借自己的经验去做出选择。根据调查,开发人员在使用API文档的过程中存在障碍。API文档的质量参差不齐,文档的编写需要投入大量时间,很难即时维护,很容易出现文档滞后、描述不准确、存在歧义等问题。此外,开发人员的功能需求往往比较抽象广泛,而API文档中对于API的功能描述通常比较具体,查阅文档同样需要耗费大量时间。
发明内容
为了解决以上技术问题,本发明提供了一种根据自然语言描述推荐API的方法。通过对大规模代码进行分析和模式挖掘,进行API推荐,并不断提高推荐相关API的准确性,减少开发人员查找和选择API的工作量,提高软件开发的效率。
本发明的技术方案是:
一种根据自然语言描述推荐API的方法,利用Scrapy爬虫框架爬取Github上的Java开源项目,使用代码分析工具对源代码进行分析和提取;把相关的API方法放到排序靠前的位置进行推荐,并且经过层次聚类以得到更好的推荐效果。
进一步的,
分为四个步骤:1)爬Java开源项目、2)提取元数据、3)挖掘API使用模式、4)API推荐;
其中,
步骤1)爬取Java开源项目,是为了在后续步骤中分析与提取API信息以及API推荐提供数据材料;
步骤2)提取元数据,根据第三方API库的使用频率,选择commons-io、commons-codec、commons-lang、commons-logging、easymock、log4j、slf4j、servlet-api、junit这9个API库作为目标库,从Java开源项目中提取这些第三方API库的API方法调用;
步骤3)从上述步骤中得到的所有元数据中随机选取元数据作为数据集,使用层次聚类算法对数据集进行聚类分析,从中挖掘API使用模式;
步骤4)根据对元数据经过层次聚类得到的API使用模式进行API推荐。
进一步的,
1)爬取Java开源项目,步骤如下:
步骤S101、利用GitHub提供的获取Github上的数据API构造出的查询https://api.github.com/search/repositories?q=stars:2500..100000+language:Java&sort=stars&order=desc&per_page=100&page=1作为爬虫爬取的初始链接;
步骤S102、查询搜索star数在2500到100000之间的Java项目,按star数降序排序,每页100项条目,返回结果为Json格式;
步骤S103、对爬虫得到的响应解析后得到搜索结果中每个存储库的信息。
进一步的,
元数据的提取基于Eclipse JDT中的AST模块实现。
步骤2)提取元数据,步骤如下:
步骤S201、对于MethodDeclaration类型节点,判断是否存在注释信息,没有则返回false,停止遍历其子节点,否则提取注释信息和方法名,并返回true继续遍历子节点;
步骤S202、遍历到MethodDeclaration类型的节点下的MethodInvocation子节点时,获取API方法调用信息,忽略项目内的方法调用,只保留第三方API方法的调用;
步骤S203、遍历所有开源项目中的所有文件,对于后缀名为.java的Java源代码文件,通过ASTParser解析为抽象语法树,然后利用自定义的ASTVisitor遍历访问抽象语法树,就可以得到这个代码文件中的方法名、API调用、注释信息等数据。
进一步的,
步骤3)挖掘API使用模式,步骤如下:
步骤S301、首先定义相似度度量法则,结合方法名和API调用这两方面来定义元数据之间的相似度;
步骤S302,编辑距离,即Levenshtein距离,是针对两个字符串的差异程度的量化;类间相似度最大作为合并规则,分别属于两个类的两个元数据之间的最小相似度定义为这两个类之间的类间相似度;
步骤S303,使用层次聚类算法对元数据进行层次聚类获得一个以上的簇集,每个簇集是相似的元数据的集合,这些簇集就是不同的API使用模式。
再进一步的,
步骤S302中,停止条件设置为所有类两两之间的类间相似度低于一个阈值,这里将阈值设置为0.5;当所有类的类间相似度低于0.5时,认为所有相似的元数据都已经聚在一类中,已经没有符合条件的足够相似的类了,停止聚类。
进一步的,
步骤4)API推荐的步骤如下:
步骤S401,层次聚类得到的簇集的注释集合作为API使用模式的描述信息,将这些描述信息利用TF-IDF权重计算方法转换为向量空间模型中的权重向量;
步骤S402,将输入的自然语言查询,进行文本预处理后,转换为向量空间模型中的权重向量;
步骤S403,分别计算自然语言查询与每个API使用模式之间的余弦相似度,将计算出的余弦相似度排序,最后输出相似度最高的API使用模式作为推荐结果。
针对API推荐问题,在已有的API推荐方法的相关研究基础上,本发明通过对Github上的大量Java开源项目进行爬取和分析,实现API推荐。
1、利用Scrapy爬虫框架爬取Github上的Java开源项目,使用代码分析工具对源代码进行分析和提取。
2、实现的推荐方法有效,能把相关的API方法放到排序靠前的位置进行推荐,并且经过层次聚类能得到更好的推荐效果。使用层次聚类能够将数据集中相似的方法,例如重载的方法,即方法名相同、参数列表不同的方法进行合并。
附图说明
图1是本发明的步骤1的工作流程示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
由于软件库的不断发展,API的更新迭代速度很快,API也会存在过时淘汰的情况,功能相似的第三方API之间也有竞争,开发者在选用第三方API之前需要结合功能、便利性、稳定性、安全性等多方面综合考虑。如何获取并分析Github上大量Java项目的代码数据,利用这些数据实现API推荐系统是一个具有现实意义的研究问题。为提高API推荐的便利性和有效性,本发明研究通过爬取与分析Github上的大量Java开源项目,实现基于自然语言查询的API推荐系统。
本发明首先主要分为四个步骤,爬Java开源项目,提取元数据,挖掘API使用模式以及API推荐。爬取Java开源项目,是为了在后续步骤中分析与提取API信息以及API推荐提供充足的数据材料。为了保证数据的可靠性,需要尽量选择代码质量较高的Java项目。具体步骤如图1所示,详细描述如下:
步骤S101、利用GitHub提供的获取Github上的数据API构造出的查询https://api.github.com/search/repositories?q=stars:2500..100000+language:Java&sort=stars&order=desc&per_page=100&page=1作为爬虫爬取的初始链接。
步骤S102、查询搜索star数在2500到100000之间的Java项目,按star数降序排序,每页100项条目,返回结果为Json格式。
步骤S103、对爬虫得到的响应解析后得到搜索结果中每个存储库的信息。
第二步提取元数据,根据第三方API库的使用频率,同时参考以往类似的研究中所选用的目标库,最终选择commons-io、commons-codec、commons-lang、commons-logging、easymock、log4j、slf4j、servlet-api、junit这9个API库作为目标库,从Java开源项目中提取这些第三方API库的API方法调用。元数据的提取基于Eclipse JDT中的AST模块实现。
步骤S201、对于MethodDeclaration类型节点,判断是否存在注释信息,没有则返回false,停止遍历其子节点,否则提取注释信息和方法名,并返回true继续遍历子节点。
步骤S202、遍历到MethodDeclaration类型的节点下的MethodInvocation子节点时,获取API方法调用信息,忽略项目内的方法调用,只保留第三方API方法的调用。
步骤S203、遍历所有开源项目中的所有文件,对于后缀名为.java的Java源代码文件,通过ASTParser解析为抽象语法树,然后利用自定义的ASTVisitor遍历访问抽象语法树,就可以得到这个代码文件中的方法名、API调用、注释信息等数据。
第三步从上述步骤中得到的所有元数据中随机选取元数据作为数据集,使用层次聚类算法对数据集进行聚类分析,从中挖掘API使用模式。
步骤S301、首先定义相似度度量法则,本文结合方法名和API调用这两方面来定义元数据之间的相似度。
在步骤S302,编辑距离,即Levenshtein距离,是针对两个字符串的差异程度的量化。类间相似度最大作为合并规则,分别属于两个类的两个元数据之间的最小相似度定义为这两个类之间的类间相似度。
停止条件设置为所有类两两之间的类间相似度低于特定的一个阈值,这里将阈值设置为0.5。当所有类的类间相似度低于0.5时,认为所有相似的元数据都已经聚在一类中,已经没有符合条件的足够相似的类了,停止聚类。
步骤S303,使用层次聚类算法对元数据进行层次聚类获得多个簇集,每个簇集是大量相似的元数据的集合,这些簇集就是不同的API使用模式。
第四步根据对元数据经过层次聚类得到的API使用模式进行API推荐
步骤S401、将层次聚类得到的簇集的注释集合作为API使用模式的描述信息,将这些描述信息利用TF-IDF权重计算方法转换为向量空间模型中的权重向量。
在步骤S402,将输入的自然语言查询,进行文本预处理后,转换为向量空间模型中的权重向量。
步骤S403,分别计算自然语言查询与每个API使用模式之间的余弦相似度,将计算出的余弦相似度排序,最后输出相似度最高的API使用模式作为推荐结果。
本发明的目的是为了提升软件工程编码效率,为了测试使用该方法的效果,根据步骤1得到所有star数在100以上的15969个Java开源项目的源代码(约251GB),得到的所有元数据中随机选取75500个元数据作为数据集,使用层次聚类算法对数据集进行聚类分析,从中挖掘API使用模式如表所示:
表API使用模式数量统计表
假设开发者想实现删除文件目录的功能,输入delete a directory,输出结果如下:
org.apache.commons.io.FileUtils#cleanDirectory
org.apache.commons.io.FileUtils#deleteDirectory
org.apache.commons.io.FileUtils#forceDelete
以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (8)
1.一种根据自然语言描述推荐API的方法,其特征在于,
利用Scrapy爬虫框架爬取Github上的Java开源项目,使用代码分析工具对源代码进行分析和提取;把相关的API方法放到排序靠前的位置进行推荐,并且经过层次聚类以得到更好的推荐效果。
2.根据权利要求1所述的方法,其特征在于,
分为四个步骤:1)爬Java开源项目、2)提取元数据、3)挖掘API使用模式、4)API推荐;
其中,
步骤1)爬取Java开源项目,是为了在后续步骤中分析与提取API信息以及API推荐提供数据材料;
步骤2)提取元数据,根据第三方API库的使用频率,选择commons-io、commons-codec、commons-lang、commons-logging、easymock、log4j、slf4j、servlet-api、junit这9个API库作为目标库,从Java开源项目中提取这些第三方API库的API方法调用;
步骤3)从上述步骤中得到的所有元数据中随机选取元数据作为数据集,使用层次聚类算法对数据集进行聚类分析,从中挖掘API使用模式;
步骤4)根据对元数据经过层次聚类得到的API使用模式进行API推荐。
3.根据权利要求2所述的方法,其特征在于,
1)爬取Java开源项目,详细步骤如下:
步骤S101、利用GitHub提供的获取Github上的数据API构造出的查询https://api.github.com/search/repositories?q=stars:2500..100000+language:Java&sort=stars&order=desc&per_page=100&page=1作为爬虫爬取的初始链接;
步骤S102、查询搜索star数在2500到100000之间的Java项目,按star数降序排序,每页100项条目,返回结果为Json格式;
步骤S103、对爬虫得到的响应解析后得到搜索结果中每个存储库的信息。
4.根据权利要求3所述的方法,其特征在于,
元数据的提取基于Eclipse JDT中的AST模块实现。
5.根据权利要求4所述的方法,其特征在于,
步骤2)提取元数据,详细步骤如下:
步骤S201、对于MethodDeclaration类型节点,判断是否存在注释信息,没有则返回false,停止遍历其子节点,否则提取注释信息和方法名,并返回true继续遍历子节点;
步骤S202、遍历到MethodDeclaration类型的节点下的MethodInvocation子节点时,获取API方法调用信息,忽略项目内的方法调用,只保留第三方API方法的调用;
步骤S203、遍历所有开源项目中的所有文件,对于后缀名为.java的Java源代码文件,通过ASTParser解析为抽象语法树,然后利用自定义的ASTVisitor遍历访问抽象语法树,就可以得到这个代码文件中的方法名、API调用、注释信息数据。
6.根据权利要求5所述的方法,其特征在于,
步骤3)挖掘API使用模式,详细步骤如下:
步骤S301、首先定义相似度度量法则,结合方法名和API调用这两方面来定义元数据之间的相似度;
步骤S302,编辑距离,即Levenshtein距离,是针对两个字符串的差异程度的量化;类间相似度最大作为合并规则,分别属于两个类的两个元数据之间的最小相似度定义为这两个类之间的类间相似度;
步骤S303,使用层次聚类算法对元数据进行层次聚类获得一个以上的簇集,每个簇集是相似的元数据的集合,这些簇集就是不同的API使用模式。
7.根据权利要求6所述的方法,其特征在于,
步骤S302中,停止条件设置为所有类两两之间的类间相似度低于一个阈值,这里将阈值设置为0.5;当所有类的类间相似度低于0.5时,认为所有相似的元数据都已经聚在一类中,已经没有符合条件的足够相似的类了,停止聚类。
8.根据权利要求6所述的方法,其特征在于,
步骤4)API推荐的详细步骤如下:
步骤S401,层次聚类得到的簇集的注释集合作为API使用模式的描述信息,将这些描述信息利用TF-IDF权重计算方法转换为向量空间模型中的权重向量;
步骤S402,将输入的自然语言查询,进行文本预处理后,转换为向量空间模型中的权重向量;
步骤S403,分别计算自然语言查询与每个API使用模式之间的余弦相似度,将计算出的余弦相似度排序,最后输出相似度最高的API使用模式作为推荐结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111667464.4A CN114356319A (zh) | 2021-12-31 | 2021-12-31 | 一种根据自然语言描述推荐api的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111667464.4A CN114356319A (zh) | 2021-12-31 | 2021-12-31 | 一种根据自然语言描述推荐api的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114356319A true CN114356319A (zh) | 2022-04-15 |
Family
ID=81105103
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111667464.4A Pending CN114356319A (zh) | 2021-12-31 | 2021-12-31 | 一种根据自然语言描述推荐api的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114356319A (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140208296A1 (en) * | 2013-01-22 | 2014-07-24 | Microsoft Corporation | API Usage Pattern Mining |
CN106095443A (zh) * | 2016-06-14 | 2016-11-09 | 电子科技大学 | 一种基于c/c++代码库的api调用模式挖掘方法 |
CN107423396A (zh) * | 2017-07-26 | 2017-12-01 | 中山大学 | 一种基于功能隐含关系及聚类的Mashup推荐方法 |
CN107479879A (zh) * | 2017-07-28 | 2017-12-15 | 扬州大学 | 一种面向软件功能维护的api及其使用推荐方法 |
CN109670022A (zh) * | 2018-12-13 | 2019-04-23 | 南京航空航天大学 | 一种基于语义相似度的Java应用程序接口使用模式推荐方法 |
CN110297657A (zh) * | 2019-06-11 | 2019-10-01 | 东南大学 | 一种基于层次上下文的api推荐方法 |
US20200250015A1 (en) * | 2019-02-06 | 2020-08-06 | Fujitsu Limited | Api mashup exploration and recommendation |
-
2021
- 2021-12-31 CN CN202111667464.4A patent/CN114356319A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140208296A1 (en) * | 2013-01-22 | 2014-07-24 | Microsoft Corporation | API Usage Pattern Mining |
CN106095443A (zh) * | 2016-06-14 | 2016-11-09 | 电子科技大学 | 一种基于c/c++代码库的api调用模式挖掘方法 |
CN107423396A (zh) * | 2017-07-26 | 2017-12-01 | 中山大学 | 一种基于功能隐含关系及聚类的Mashup推荐方法 |
CN107479879A (zh) * | 2017-07-28 | 2017-12-15 | 扬州大学 | 一种面向软件功能维护的api及其使用推荐方法 |
CN109670022A (zh) * | 2018-12-13 | 2019-04-23 | 南京航空航天大学 | 一种基于语义相似度的Java应用程序接口使用模式推荐方法 |
US20200250015A1 (en) * | 2019-02-06 | 2020-08-06 | Fujitsu Limited | Api mashup exploration and recommendation |
CN110297657A (zh) * | 2019-06-11 | 2019-10-01 | 东南大学 | 一种基于层次上下文的api推荐方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20220091827A1 (en) | Pruning Engine | |
CN108717470B (zh) | 一种具有高准确度的代码片段推荐方法 | |
US8185530B2 (en) | Method and system for web document clustering | |
CN109359172B (zh) | 一种基于图划分的实体对齐优化方法 | |
CN113822067A (zh) | 关键信息提取方法、装置、计算机设备及存储介质 | |
CN106570171A (zh) | 一种基于语义的科技情报处理方法及系统 | |
US8352510B2 (en) | Dynamic database schemas for highly irregularly structured or heterogeneous data | |
US11263062B2 (en) | API mashup exploration and recommendation | |
CN110969517B (zh) | 一种招投标生命周期关联方法、系统、存储介质及计算机设备 | |
CN115562679B (zh) | 一种基于Java语言的自动生成代码的方法及服务器 | |
CN114091426A (zh) | 一种处理数据仓库中字段数据的方法和装置 | |
CN111475196B (zh) | 编译告警溯源方法、装置、电子设备及计算机可读介质 | |
CN103064966A (zh) | 一种从单记录网页中抽取规律噪音的方法 | |
Song et al. | Parallel incremental association rule mining framework for public opinion analysis | |
CN106033444B (zh) | 文本内容的聚类方法和装置 | |
CN114090769A (zh) | 实体挖掘方法、装置、计算机设备和存储介质 | |
CN109614535B (zh) | 一种基于Scrapy框架的网络数据的采集方法及装置 | |
CN114356319A (zh) | 一种根据自然语言描述推荐api的方法 | |
Chunyong et al. | Log parser with one-to-one markup | |
Bogomolov et al. | Sosed: a tool for finding similar software projects | |
Liu et al. | Web log analysis in genealogy system | |
Andruszkiewicz et al. | Data acquisition and information extraction for scientific knowledge base building | |
Nguyen et al. | An efficient approach for mining weighted uncertain interesting patterns | |
CN111368036A (zh) | 用于搜索信息的方法和装置 | |
CN111444402A (zh) | 基于索引构建和社会因控网络进行社区检测的分析方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20221201 Address after: Room 305-22, Building 2, No. 1158 Zhangdong Road and No. 1059 Dangui Road, China (Shanghai) Pilot Free Trade Zone, Pudong New Area, Shanghai, 200120 Applicant after: Shanghai Yunxi Technology Co.,Ltd. Address before: Building S02, 1036 Gaoxin Langchao Road, Jinan, Shandong 250100 Applicant before: Shandong Inspur Scientific Research Institute Co.,Ltd. |
|
TA01 | Transfer of patent application right |