CN110990003B - 一种基于词嵌入技术的api推荐方法 - Google Patents

一种基于词嵌入技术的api推荐方法 Download PDF

Info

Publication number
CN110990003B
CN110990003B CN201911118507.6A CN201911118507A CN110990003B CN 110990003 B CN110990003 B CN 110990003B CN 201911118507 A CN201911118507 A CN 201911118507A CN 110990003 B CN110990003 B CN 110990003B
Authority
CN
China
Prior art keywords
api
dataset
word
list
data
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.)
Active
Application number
CN201911118507.6A
Other languages
English (en)
Other versions
CN110990003A (zh
Inventor
文万志
张斌
姜文轩
李喜凯
顾晖
李跃华
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nantong Yingsi Beiyun Information Technology Co.,Ltd.
Shenzhen Hongyue Information Technology Co ltd
Original Assignee
Nantong University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nantong University filed Critical Nantong University
Priority to CN201911118507.6A priority Critical patent/CN110990003B/zh
Publication of CN110990003A publication Critical patent/CN110990003A/zh
Application granted granted Critical
Publication of CN110990003B publication Critical patent/CN110990003B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse

Abstract

本发明提供一种基于词嵌入技术的API推荐方法,给开发人员推荐合适的API,属于代码推荐的技术领域,包括如下步骤:步骤1、收集Java帮助文档和Stack Overflow上Java语言的问答数据集;步骤2、通过收集得到的Stack Overflow中的数据进行词嵌入建模;步骤3、通过UI界面收集开发者输入的问题,使用单词模型和TF‑IDF来计算与目标问题集之间的相似度,并使用LSA模型来过滤候选问题列表;步骤4、通过LDA提取主题词,最后从Java帮助文档中得到API推荐信息,开发者使用本发明进行API查询的时候,能够给开发者推荐出较为准确的API信息。

Description

一种基于词嵌入技术的API推荐方法
技术领域
本发明属于代码推荐技术领域,具体涉及一种基于词嵌入技术的API推荐方法。
背景技术
随着技术的不断发展,人们对软件的功能需求日益丰富,软件的结构呈现出复杂化和大型化的特点。在软件开发过程中,程序开发人员可能会面临很多软件编写困难的情况,比如遗忘了API(Application Programming Interface,应用程序接口)的作用、不熟悉某个API的返回值和参数列表或者想要知道某些不常用的功能的具体实现方法。因此,开发人员在开发过程中查询到满足开发需求的API尤为重要。
当在实际开发过程中找不到合适的API情况出现时,可以采取以下几种方法:
(1)开发者通常会选择使用搜索引擎查询需要的Java API。但是利用搜索引擎通常需要确切的功能性描述或者关键字。这种方法在查询某一特定API的功能时很有效,但是在查找实现某一功能的API时可能不会有很好的效果。而且搜索结果还需要开发者进行甄选会耗费很多时间。
(2)借助Java帮助文档,以Java SE 8 API文档为例。这种文档包含了Java语言常用的API规范,很多官方的介绍和类、方法、变量的解释和代码引例。使用这种方法同样能很好的解决某个特定API的功能,而在查找实现某一功能的API时则很难实现。
(3)通过查询Stack Overflow网站上的帖子,Stack Overflow上面收集了世界各地开发者们的提问和解答记录,开发者可以从类似问题的答案中获取想要的API,而这个过程需要开发者设置查询相似的问题,并且对答案要具备一定的甄别能力。
(4)向有经验的开发人员咨询,这种方法建立在开发人员对这些API极其熟悉的情况下,存在很大的主观性,同时效率也很低。
基于上述问题,为了解决开发者在查询API时所遇到的问题。设计出一个为开发者推荐合适API的系统就十分有意义。
发明内容
本发明要解决的技术问题是提供一种基于词嵌入技术的API推荐方法,能够给开发者推荐出较为准确的API信息,,大大提高了开发者的在开发过程中的编程效率。
为解决上述技术问题,本发明的实施例提供一种基于词嵌入技术的API推荐方法,分为两大模块,其中一个是离线训练模块,另一个是在线推荐模块,其中,所述离线训练模块包括如下步骤:
步骤1、数据收集:收集两个目标数据集,其中一部分是Java SE8的API文档,另一部分是Stack Overflow上关于Java API的问答数据集;
步骤2、对从Stack Overflow上获取的数据进行数据处理:将数据集拆分为问题数据集和答案数据集,收集问题数据集中的所有单词建立单词库,并预处理此单词库,对单词库中的数据进行词嵌入建模,生成单词模型;建立TF-IDF字典,对包含重要信息的单词设置高权重;
所述在线推荐模块包括如下步骤:
步骤3、通过UI界面收集开发者输入的问题,使用步骤2得到的单词模型和TF-IDF字典对开发者输入的问题和问题数据集进行相似度计算,得到相似度较高的候选问题列表;使用LSA模型过滤候选问题列表,排除具有语义差别的问题;
步骤4、通过LDA模型提取主题词,把主题词设置为开发者此次提问的标签提供给开发者;在数据库中找到对应的API,组成候选API列表;最后通过API文档进一步完善API推荐信息,并把API推荐信息输出到UI界面。
其中,步骤(1)中,收集得到的数据集Java SE8的API文档命名为DataSet_SE;
Stack Overflow上关于Java API的问答数据集从Stack Overflow上获取,命名为DataSet_SOAPI。
其中,步骤2的具体步骤如下:
2.1)把通过步骤1得到的问答数据集中的数据分为两个部分:问题数据集和答案数据集,分别命名为DataSet_Questions和DataSet_Answers;
2.2)收集DataSet_Questions中所有的单词建立一个单词库,命名为TextCorpus,然后对处理完成的单词库进行词嵌入建模;通过使用word2vec的方法把单词库中的每一个单词转换成单词矩阵;
2.3)使用TF-IDF值为计算单词的相似度加权;使用2.2)步骤得到的数据集TextCorpus计算出TextCorpus中的TF-IDF值;TF-IDF的计算又分为词频的计算和逆向文档频率的计算,其计算公式为:
Figure GDA0002366458920000041
其中,公式中ni,j表示目标词ti在语料di中的出现次数,而分母表示在语料di中所有单词的出现次数之和;D是数据集TextCorpus中的语料的总数;|{j:ti∈dj)|是包含目标词ti的数目。
其中,步骤2.2)的具体步骤如下:
2.2.1)收集问题数据集中所有的单词,需要对单词做分词、删除停词和提取词根的自然语言处理;实现步骤中的三个条件,需按照以下步骤进行:
2.2.1.1)在遍历DataSet_Questions和DataSet_Answers中的数据时,首先需要对TextCorpus数据集进行分词操作,即把TextCorpus数据集中的每一句话分成n个独立的单词存储在列表当中,列表命名为List_word;
2.2.1.2)在2.2.1.1)结束之后,得到一个包含所有单词的列表,使用NTLK库中的corpus包来进行删除停词的操作,当遍历列表List_words时,判断列表中的数据是否在stopwords.words('english')当中;如果存在,则删除该停词;如果不存在,则把数据存入到一个新的列表当中,命名为List_outStopWords;
2.2.1.3)在删除停词的操作结束之后,进行提取词干的操作:对通过步骤2.2.1.2)的列表List_outStopWords再次进行遍历,通过对列表中的每个元素进行词干提取操作,把处理过的新列表命名为List_StemmerWords;
2.2.1.4)得到List_StemmerWords列表之后,通过python内置的set()方法来使列表去除重复元素,在对列表中含有的特殊符号的数据进行删除,最终得到单词库KeyCorpus;
2.2.2)在收集完问题数据集中的单词后,选择CBOW算法训练问题数据集;
2.2.3)确定了使用COBW算法之后,设置向量的维度。
其中,步骤3的具体步骤如下:
3.1)通过UI界面收集开发者在开发过程中的提问,称为Query;然后把得到的Query通过步骤2.2.1.1)、步骤2.2.1.2)和步骤2.2.1.3)分别进行分词去重、删除停词和词根转化的处理;
3.2)得到处理过的Query后,通过步骤2.2)的词嵌入模型和步骤2.3)的TF-IDF来计算出与DataSet_Questions的相似度,并以相似度从大到小排列建立Top-N列表,问题数量为N;
3.3)在得到Top-N列表之后,使用LSA模型来排除与其他语义相差过大的问题项;使用LSA模型排除掉n条语义相差的问题,并把剩下的N-n条问题列表命名为DataSet_Question40;其中,LSA模型原理的计算公式为:
Figure GDA0002366458920000061
其中,U是m×m阶矩阵;∑是半正定m×n阶对角矩阵;VT是V的共轭转置矩阵。
其中,步骤4的具体步骤如下:
4.1)使用LDA模型生成文档主题并将其处理为标签,帮助开发者更轻松地查找API;
4.2)使用步骤2.1)得到的DataSet_Answers,对DataSet_Answers做进一步处理,即从DataSet_Answers中进行数据抽取,抽取得到回答DataSet_Questions中问题的API;
4.3)使用步骤4.2)抽取得到DataSet_Questions中对应问题的API,建立关系型数据库,命名为DatabaseQA;通过数据库DatabaseQA,实现DataSet_SOAPI中DataSet_Questions和DataSet_Answers的映射,把这两个数据集联系起来,在数据库DatabaseQA中,得到某一问题中的单词,可以找到对应问题的序号和问题答案的API。
进一步,步骤4.2)的具体步骤如下:
4.2.1)对DataSet_Answers中的数据进行抽取,首先筛选出有效答案,在DataSet_SOAPI中也包含了问题项的答案项;此时判断答案项是否为空,如果是空的话,那么删除这条数据;
4.2.2)DataSet_SOAPI中的每条数据包含question属性和answer属性,在answer后面有它的引用率,选择保留引用率排名前三的回答进行保留,其余的答案则进行删除;
4.2.3)在使用步骤4.2.2)保留了部分答案之后,使用Jsoup解析器进行API的抽取,从答案中提取所有包含<code>标记的代码段,提取具有驼峰写法的Java类API。
进一步,步骤4.3)的具体步骤如下:
4.3.1)步骤3.3)得到DataSet_Question40之后,在步骤4.3)中得到的DatabaseQA中找到对应的40个问题的答案,解析DataSet_SOAPI中DataSet_Question40的答案的HTML数据;
4.3.2)在HTML中<code>标签之间的部分和DataSet_Question40的回答者引用的API帮助文档的超链接中包含有API信息,提取API信息,计算API所在的问题平均相似度得到List_RankedAPI;得到的List_RankedAPI后,在数据集DataSet_SE中找到对应的API;
4.3.3)根据需要来设定出推荐API的条数。
其中,步骤4.3.3)中,在找到了相似度较高的API之后,可以同时推荐下述内容给开发者来协助开发:
a)Query标签;
b)API帮助文档中对该API的功能描述;
c)开发者输入问题的相关问题;
d)相关的代码段。
本发明的上述技术方案的有益效果如下:
本发明的模型是几种传统的API查询方法的综合,能够给开发者带来更高效准确的API推荐。具体表现为:a、整合了多种辅助信息来进行API推荐,如本发明中使用的API帮助文档和Stack Overflow中的问答信息都可以作为这种辅助信息,信息来源的多样性可以使推荐的结果更具有适用性,更好的应用到各种场景开发当中;b、通过词嵌入技术来处理语义偏差问题,解决了开发者问题输入时可能查询不到对应API的问题,通过构建语言模型来得到最相关的问题列表和API推荐,确保每个问题都能得到最相关的内容推荐,减少了开发者的查询比较的时间;c、本发明中不仅提供了API推荐,还有包含有标签词、相关问题列表和代码段等内容,给开发者提供了API的使用说明,大大提高了开发者的在开发过程中的编程效率。
附图说明
图1为本发明的总体流程图;
图2为本发明中3个预处理流程图;
图3为本发明中两个单词的词向量表示图;
图4为本发明中节选部分数据库示意图;
图5为本发明中LSA模型处理top-50示例图;
图6为本发明实施例的最终推荐结果示意图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
本发明提供了一种基于词嵌入技术的API推荐方法,分为两大模块,其中一个是离线训练模块,另一个是在线推荐模块,其中,所述离线训练模块包括如下步骤:
步骤1、数据收集:收集两个目标数据集,其中一部分是Java SE8的API文档,另一部分是Stack Overflow上关于Java API的问答数据集;
步骤1中,收集得到的数据集Java SE8的API文档命名为DataSet_SE;StackOverflow上关于Java API的问答数据集从Stack Overflow上获取,命名为DataSet_SOAPI。
步骤2、对从Stack Overflow上获取的数据进行数据处理:将数据集拆分为问题数据集和答案数据集,收集问题数据集中的所有单词建立单词库,并预处理此单词库,对单词库中的数据进行词嵌入建模,即把所有的单词都转换成对应的词向量,生成单词模型;建立TF-IDF(Term Frequency–Inverse Document Frequency)字典,对可能包含重要信息的单词设置较高权重;
其中,步骤2的具体步骤如下:
2.1)把通过步骤1得到的问答数据集中的数据分为两个部分:问题数据集和答案数据集,分别命名为DataSet_Questions和DataSet_Answers;
2.2)收集DataSet_Questions中所有的单词建立一个单词库,并把这个单词库命名为TextCorpus,然后对处理完成的单词库进行词嵌入建模;通过使用word2vec的方法把单词库中的每一个单词转换成单词矩阵;
步骤2.2)的具体步骤如下:
2.2.1)收集问题数据集中所有的单词,需要对单词做分词、删除停词和提取词根的自然语言处理;实现步骤中的三个条件,需按照以下步骤进行:
2.2.1.1)在遍历DataSet_Questions和DataSet_Answers中的数据时,首先需要对TextCorpus数据集进行分词操作,即把TextCorpus数据集中的每一句话分成n个独立的单词存储在列表当中,把这个列表命名为List_word。需要注意的是,本发明在这一步骤同时把所有字符串中的大写字符转换为小写字符方便处理;
2.2.1.2)在2.2.1.1)结束之后,得到了一个包含所有单词的列表,使用NTLK库中的corpus包来进行删除停词的操作,当遍历列表List_words时,判断列表中的数据是否在stopwords.words('english')当中;如果存在,则删除该停词;如果不存在,则把数据存入到一个新的列表当中,命名为List_outStopWords;
2.2.1.3)在删除停词的操作结束之后,进行提取词干的操作:对通过步骤2.2.1.2)的列表List_outStopWords再次进行遍历,通过对列表中的每个元素进行词干提取操作,把处理过的新列表命名为List_StemmerWords;
2.2.1.4)得到List_StemmerWords列表之后,通过python内置的set()方法来使列表去除重复元素,在对列表中含有的特殊符号的数据进行删除,比如$、%、#、@等,最终得到单词库KeyCorpus;
2.2.2)在收集完问题数据集中的单词后,选择要建立语言模型的时候需要从两个方面考虑,第一部分是算法方面,在选择了word2vec方法训练数据集之后,该模型涉及两种算法:CBOW算法和Skip-Gram算法。因为本发明要实现的是融合各类信息进行API推荐,结合已经得到的单词库KeyCorpus,所以选择CBOW算法训练数据集;
2.2.3)确定了使用COBW算法之后,设置向量的维度。需要考虑的是向量的维度方面,向量的维度可以手动的进行设置,基于我们的数据集比较庞大,因此把word2vec方法中的size参数设置为100。这里面选择100的原因是使得单词库KeyCorpus中的数据尽可能的被唯一表示,提高推荐的精度。
2.3)生成单词的TF-IDF字典,一个单词的TF-IDF值表示这个单词在TextCorpus出现的逆频率,如果一个单词的TF-IDF的值越低,那么它在TextCorpus中出现的频率就越低,就更可能包含有重要的信息。使用TF-IDF值为计算单词的相似度加权;使用2.2)步骤得到的数据集TextCorpus计算出TextCorpus中的TF-IDF值;TF-IDF的计算又分为词频的计算和逆向文档频率的计算,其计算公式为:
Figure GDA0002366458920000121
其中,公式中ni,j表示目标词ti在语料di中的出现次数,而分母表示在语料di中所有单词的出现次数之和;D是数据集TextCorpus中的语料的总数;|{j:ti∈dj}|是包含目标词ti的数目。为了保证目标词一定存在于数据集中,即防止被除数为零,因此一般情况下使用|{j:ti∈dj}|+1。
所述在线推荐模块包括如下步骤:
步骤3、通过UI界面收集开发者输入的问题,使用步骤2得到的单词模型和TF-IDF字典对开发者输入的问题和问题数据集进行相似度计算,得到相似度较高的候选问题列表;使用LSA(Latent Semantic Analysis)模型过滤候选问题列表,排除具有语义差别的问题;
其中,步骤3的具体步骤如下:
3.1)通过UI界面收集开发者在开发过程中的提问,称为Query;然后把得到的Query通过步骤2.2.1.1)、步骤2.2.1.2)和步骤2.2.1.3)分别进行分词去重、删除停词和词根转化的处理;
3.2)得到处理过的Query后,通过步骤2.2)的词嵌入模型和步骤2.3)的TF-IDF来计算出与DataSet_Questions的相似度,并以相似度从大到小排列建立Top-N列表,问题数量为N;本发明为了避免推荐过程中因相似问题过多而的产生干扰的数据,因此把N取到50,并把这个Top-N列表命名为DataSet_Question50
3.3)在得到Top-N列表之后,使用LSA模型来排除与其他语义相差过大的问题项;使用LSA模型排除掉n条语义相差的问题,并把剩下的N-n条问题列表命名为DataSet_Question40;其中,LSA模型原理的计算公式为:
Figure GDA0002366458920000131
其中,U是m×m阶矩阵;∑是半正定m×n阶对角矩阵;VTV的共轭转置矩阵。LSA模型就是把Xm*n矩阵缩减为k维的结果。在本发明中,我们为候选问题生成单词矩阵,并通过奇异值分解来减小维数。然后我们通过计算这些问题的余弦相似度,其中cos<i,j>由以下公式计算:
Figure GDA0002366458920000132
排除了一些语义差异较大的问题。
步骤4、通过LDA(Latent Dirichlet Allocation)模型提取主题词,把这些主题词设置为开发者此次提问的标签提供给开发者;在数据库中找到对应的API,组成候选API列表;最后通过API文档进一步完善API推荐信息,并把API推荐信息输出到UI界面。
其中,步骤4的具体步骤如下:
4.1)使用LDA模型生成文档主题并将其处理为标签,帮助开发者更轻松地查找API;LDA是一种无监督的机器学习技术,它将文本信息转换为易于建模的数字信息。但是,词袋法没有考虑词与词之间的顺序。因此,本发明还需要通过计算候选问题集的词频来辅助生成标签。由LDA模型和词频统计的目标词生成的单词将被选作为这条Query的标签,显示给开发者。
4.2)使用步骤2.1)得到的DataSet_Answers,对DataSet_Answers做进一步处理,即从DataSet_Answers中进行数据抽取,抽取得到回答DataSet_Questions中问题的API;因为DataSet_Answers是以DataSet_SOAPI中创建的数据集DataSet_Questions的答案,而这部分我们需要处理的是开发者在Stack Overflow上进行提问的问题和答案。
步骤4.2)的具体步骤如下:
4.2.1)对DataSet_Answers中的数据进行抽取,首先筛选出有效答案,在DataSet_SOAPI中也包含了问题项的答案项;此时需要判断答案项是否为空,如果是空的话,那么删除这条数据;
4.2.2)在检索DataSet_SOAPI中的每条数据时发现,文本中不仅包含着question属性和answer属性,在answer后面还有它的引用率,打开Stackoverflow时,就会发现网站在对每条问题的答案提供了用户评分系统,当一个提问的答案被越多的开发者所采用时,他就越接近于正确答案,因此开发者更有可能选择该条回答是有价值的选项,从而这条回答的引用率就越高。因此选择保留引用率排名前三的回答进行保留,其余的答案则进行删除;
4.2.3)在使用步骤4.2.2)保留了部分答案之后,使用Jsoup解析器进行API的抽取,从答案中提取所有包含<code>标记的代码段。但是有些代码段可能由其他标签标记,或者没有标记信息,因此本次发明中还使用了一组正则表达式来进行辅助,提取具有驼峰写法的Java类API。
4.3)使用步骤4.2)抽取得到DataSet_Questions中对应问题的API,建立关系型数据库,命名为DatabaseQA;其中,DatabaseQA中包含的主键有DataSet_Questions中问题的序列号、问题、单词库KeyCorpus和DataSet_Answers中抽取的对应问题的API。通过数据库DatabaseQA,实现DataSet_SOAPI中DataSet_Questions和DataSet_Answers的映射,把这两个数据集联系起来。通过这种方法,在数据库DatabaseQA中,得到某一问题中的单词,可以找到对应问题的序号和问题答案的API。
步骤4.3)的具体步骤如下:
4.3.1)步骤3.3)得到DataSet_Question40之后,在步骤4.3)中得到的DatabaseQA中找到对应的40个问题的答案,解析DataSet_SOAPI中DataSet_Question40的答案的HTML数据;
4.3.2)在HTML中<code>标签之间的部分和DataSet_Question40的回答者引用的API帮助文档的超链接中包含有API信息,提取API信息,计算API所在的问题平均相似度得到List_RankedAPI;得到的List_RankedAPI后,在数据集DataSet_SE中找到对应的API;
4.3.3)根据需要来设定出推荐API的条数。在找到了相似度较高的API之后,可以同时推荐下述内容给开发者来协助开发:
a)Query标签;
b)API帮助文档中对该API的功能描述;
c)开发者输入问题的相关问题;
d)相关的代码段。
下面结合具体实施例进一步阐述本发明的技术方案:
本实施例的基于词嵌入技术的API推荐方法总体流程图如图1所示,包含如下步骤:
一、离线训练模块
在开发者输入问题之前,系统需要先进行离线的数据训练。在这个部分,处理两个数据集并且建立单词模型和TF-IDF字典。具体实现分为以下几个步骤:
1)获取数据集,其中一个是Java SE 8 API文档,这类文档网上资源较多,获取方式较为容易,可以直接从网络上下载得到,把收集得到的这个数据集命名为DataSet_SE。另外一个是StackOverflow上关于Java API的数据集,这部分数据集需要从Stackoverflow上获取,在Stackoverflow官方网站上提供了一个data dump,官方会把这些开源的数据提供给的研究者使用。本次实验使用的data dump版本便是在2017年12月份发布的。因为本次发明的目的是提供API推荐,因此本次实验从这个版本的data dump中抽取了以Java API为关键词的部分数据作为本次发明的数据集,并把这个数据集命名为DataSet_SOAPI。
2)数据处理,在得到了DataSet_SOAPI和DataSet_SE这两个数据之后需要对其中的数据做预处理,首先把DataSet_SOAPI这个数据集进行划分,通过DataSet_SOAPI中数据的question属性和answer属性的内容分别添加到两个数据集中,分别是问题数据集和答案数据集,分别命名为DataSet_Questions和DataSet_Answers。收集DataSet_Questions数据集中的所有的单词组成一个单词库TextCorpus。单词库TextCorpus要进行预处理,如图2所示。
a)在遍历单词库TextCorpus,首先需要该数据集进行分词操作,即把每一句话分成n个独立的单词存储在列表当中,把这个列表命名为List_word。使用WordPunctTokenizer()这个方法来实现分词,需要注意的是,这里也同时使用lower()方法把字符串中所有大写字符转换为小写以便于统一处理。
b)遍历列表List_words时,判断列表中的数据是否在stopwords.words('english')当中。如果存在,则删除该停词;如果不存在,把数据存入到一个新的列表当中,命名为List_outStopWords;
c)通过snowballStemmer('english').stem()方法来对列表List_outStopWords中的每个元素进行词干提取操作,把处理过的新列表命名为List_StemmerWord。最后通过python内置的set()方法来使列表去除重复元素,在对列表中含有的特殊符号的数据进行删除,最终得到预处理过的单词库命名为KeyCorpus。
对DataSet_SOAPI做进一步处理,因为DataSet_SOAPI是以Java API为关键词的数据集,而这部分我们需要处理的是开发者在Stackoverflow上进行提问的问题。因此需要从DataSet_SOAPI中进行数据抽取,把DataSet_SOAPI中所有的问题项组成问题集。Stackoverflow网站对每条问题的答案提供了用户评分系统,因此score大于等于零时对应的问题应该被保留,评分小于零的问题则被剔除。在筛选过程结束后,得到了最终的问题集DataSet_Questions。
节选数据集DataSet_Questions中的部分数据内容如下所示。
Figure GDA0002366458920000181
3)处理单词库,对单词库KeyCorpus中的数据进行词嵌入建模,即把所有的单词都转换成对应的词向量,生成单词模型。使用Gensim库,Gensim库是一个用于从文档中自动提取语义主题的Python库。所使用的word2vec的方法是来自Gensim库中的models包。用过使用word2vec方法对KeyCorpus数据集中的每一个word转换成了一个词向量。选择了word2vec方法训练数据集之后,以CBOW算法为核心建立单词模型,CBOW算法是给定上下文来预测中心词。我们测试了两个单词:Array和Value,它们的词向量表示如图3所示(节选了20维)。
建立单词的TF-IDF字典,一个单词的TF-IDF值表示这个单词在TextCorpus中出现的逆频率,如果一个单词的TF-IDF的值越低,那么它在TextCorpus中出现的频率就越低,就更可能包含有重要的信息。使用TF-IDF来来为计算单词的相似度加权。使用数据集TextCorpus,计算出TF-IDF字典。TF-IDF的计算又分为词频的计算和逆向文档频率的计算,其计算公式为:
Figure GDA0002366458920000191
其中,公式中ni,j表示目标词ti在语料di中的出现次数,而分母表示在该语料di中所有单词的出现次数之和,D是数据集TextCorpus中的语料的总数,|{j:ti∈dj}|是包含目标词ti的数目。为了保证目标词一定在数据集中,即防止被除数为零,因此一般情况下使用|{j:ti∈dj}|+1。
对答案数据集DataSet_Answers进行API抽取。本发明使用的Jsoup解析器来进行API抽取,从答案中提取所有包含<code>标记的代码段。但是有些代码段可能由其他标签标记,或者没有标记信息,因此本次发明中还使用了一组正则表达式来进行辅助,提取那些具有驼峰写法的Java类API。
结合单词库KeyCorpus和抽取得到DataSet_Questions中对应问题的API,建立一种关系型数据库,命名为DatabaseQA。其中DatabaseQA中包含的主键有DataSet_Questions中问题的序列号、问题、单词库KeyCorpus和DataSet_Answers中抽取的对应问题的API如图4所示。通过该数据库DatabaseQA,实现了DataSet_SOAPI中DataSet_Questions和DataSet_Answers的映射,把这两个数据集联系起来。通过这种方法,在数据库DatabaseQA中,得到某一问题中的单词,可以找到对应问题的序号和问题答案的API。
二、在线推荐模块
下面我们结合一个具体实例来说明在线推荐模块,通过UI界面收集开发者输入的某次问题:How to initialize an array in Java with a constant value efficiently?
首先用变量Query来保存这个问题,然后通过离线训练中第2)步的a)、b)和c)三步来对Query做类似的分词、删除停词和词干提取的处理。得到的结果如表1所示:
表1:使用3种方法对Query进行预处理的结果
Figure GDA0002366458920000211
在预处理结束Query后,利用步骤2)中已经建立好的单词模型和TF-IDF字典来计算与数据集DataSet_Questions的相似度。并按照Similarity进行排序来建立一个Top-N列表,并且取N=50,Top-50列表命名为DataSet_Question50,截取了前十条最相关问题,如表2所示:
表2:前10条候选问题集
Rank Question
1 Java Static Class Variable Initialisation Efficiency
2 Most efficient way to append a constant string to a variable string in Java?
3 How do I declare a variable with an array element?
4 How to declare an ArrayList of objects inside a class in java
5 How to assign a value to byte array?
6 Java-Efficient way to access an array
7 Initialising array names in java
8 How to initialize byte array in Java?
9 More efficient for an Java Array
10 Java How to use class object for List initialisation?
在得到Top-N这个列表之后,使用LSA模型来排除与其他语义相差过大的问题项。使用LSA模型之后排除掉了10条语义相差的问题,并把剩下的40条问题列表命名为DataSet_Question40。其中LSA模型原理的计算公式为:
Figure GDA0002366458920000212
其中,U是m×m阶矩阵;∑是半正定m×n阶对角矩阵;而VT是V的共轭转置矩阵。LSA模型就是把Xm×n缩减为k维的结果。在本发明中,我们为候选问题生成词矩阵,并通过奇异值分解来减小维数。然后我们通过计算这些问题的余弦相似度,其中cos<i,j>由以下公式计算:
Figure GDA0002366458920000221
排除了一些语义差异较大的问题。在此步骤中,我们以表2中提取的10个问题为例。通过LSA模型将这十个问题转换为向量形式。在向量空间中,通过此步骤进行了语义过滤。图5显示了LDA模型中的10个问题向量空间位置(其中D3和D5位置相近,文字有部分重叠)。D9和D1之间的向量角明显大于其他问题之间的夹角,因此我们认为D9是语义差异最大的一个,需要进行排除。在这50个问题中,我们排除了10条语义相差最大的问题,最后得到DataSet_Question40。
接着使用LDA模型生成文档主题并将其处理为标签,帮助开发者更轻松地查找API。由LDA模型和词频统计的目标词被选作我们的标签。我们筛选前5个关键词作为我们的标签提供给用户,分别是:array,initilize,string,create,value。
然后从DataSet_Question50中检索出满足开发者需要的预选API。检索数据集DataSet_Question50的答案的超链接,并从该超链接中提取出API信息。判断HTML中<code>标签之间的部分是否存在于DataSet_SE中,使用字符串匹配的方式,如果满足标签中50%的数据在DataSet_SE中,从该数据中提取API信息。
提取到的API列表,命名为List_API,结合数据库DatabaseQA中DataSet_Question50所对应的API,形成了一个新的API列表,并命名为List_APIs。得到的结果如表3所示(节选了5条API):
表3:List_APIs中的前5条候选API
Rank API
1 java.util.Arrays.fill
2 java.lang.System.arraycopy
3 java.util.Arrays.asList
4 java.util.Collections.nCopies
5 java.util.Collections.unmodifiableList
根据得到的List_APIs,可以在数据集DataSet_SE中找到对应的API。最后可以根据需要来设定推荐多少条API,本发明把推荐API的条数Rank的值设置为3,及给开发者最终推荐的是3组API。并可以同时推荐其他内容:Query标签、API的文本描述、相似问题集和部分代码段。结果最终通过UI界面推荐给开发者,完成推荐。最终Query的推荐结果如图6所示,节选了其中1个结果。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (3)

1.一种基于词嵌入技术的API推荐方法,其特征在于,分为两大模块,其中一个是离线训练模块,另一个是在线推荐模块,其中,所述离线训练模块包括如下步骤:
步骤1、数据收集:收集两个目标数据集,其中一部分是Java SE8 的API文档,另一部分是Stack Overflow上关于Java API的问答数据集;
步骤2、对从Stack Overflow上获取的数据进行数据处理:将数据集拆分为问题数据集和答案数据集,收集问题数据集中的所有单词建立单词库,并预处理此单词库,对单词库中的数据进行词嵌入建模,生成单词模型;建立TF-IDF字典,对包含重要信息的单词设置高权重;
所述在线推荐模块包括如下步骤:
步骤3、通过UI界面收集开发者输入的问题,使用步骤2 得到的单词模型和TF-IDF字典对开发者输入的问题和问题数据集进行相似度计算,得到相似度较高的候选问题列表;使用LSA模型过滤候选问题列表,排除具有语义差别的问题;
步骤4、通过LDA模型提取主题词,把主题词设置为开发者此次提问的标签提供给开发者;在数据库中找到对应的API,组成候选API列表;最后通过API文档进一步完善API推荐信息,并把API推荐信息输出到UI界面;
步骤2的具体步骤如下:
2.1)把通过步骤1得到的问答数据集中的数据分为两个部分:问题数据集和答案数据集,分别命名为DataSet_Questions和DataSet_Answers;
2.2)收集DataSet_Questions中所有的单词建立一个单词库,命名为TextCorpus,然后对处理完成的单词库进行词嵌入建模;通过使用word2vec的方法把单词库中的每一个单词转换成单词矩阵;
2.3)使用TF-IDF值为计算单词的相似度加权;使用2.2)步骤得到的数据集TextCorpus计算出TextCorpus中的TF-IDF值;TF-IDF的计算又分为词频的计算和逆向文档频率的计算,其计算公式为:
Figure 517849DEST_PATH_IMAGE001
其中,公式中
Figure 86234DEST_PATH_IMAGE002
表示目标词
Figure 771293DEST_PATH_IMAGE003
在语料
Figure 450536DEST_PATH_IMAGE004
中的出现次数,而分母表示在语料
Figure 537441DEST_PATH_IMAGE004
中所有单词的出现次数之和;D是数据集TextCorpus中的语料的总数;
Figure 276727DEST_PATH_IMAGE005
是包含目标词
Figure 449082DEST_PATH_IMAGE003
的数目;
步骤2.2)的具体步骤如下:
2.2.1)收集问题数据集中所有的单词,需要对单词做分词、删除停词和提取词根的自然语言处理;实现步骤中的三个条件,需按照以下步骤进行:
2.2.1.1)在遍历DataSet_Questions和DataSet_Answers中的数据时,首先需要对TextCorpus数据集进行分词操作,即把TextCorpus数据集中的每一句话分成n个独立的单词存储在列表当中,列表命名为List_word;
2.2.1.2)在2.2.1.1)结束之后,得到一个包含所有单词的列表,使用NTLK库中的corpus包来进行删除停词的操作,当遍历列表List_words时,判断列表中的数据是否在stopwords.words('english')当中;如果存在,则删除该停词;如果不存在,则把数据存入到一个新的列表当中,命名为List_outStopWords;
2.2.1.3)在删除停词的操作结束之后,进行提取词干的操作:对通过步骤2.2.1.2)的列表List_outStopWords再次进行遍历,通过对列表中的每个元素进行词干提取操作,把处理过的新列表命名为List_StemmerWords;
2.2.1.4)得到List_StemmerWords列表之后,通过python内置的set ( )方法来使列表去除重复元素,在对列表中含有的特殊符号的数据进行删除,最终得到单词库KeyCorpus;
2.2.2)在收集完问题数据集中的单词后,选择CBOW算法训练问题数据集;
2.2.3)确定了使用COBW算法之后,设置向量的维度;
步骤3的具体步骤如下:
3.1)通过UI界面收集开发者在开发过程中的提问,称为Query;然后把得到的Query通过步骤2.2.1.1)、步骤2.2.1.2)和步骤2.2.1.3)分别进行分词去重、删除停词和词根转化的处理;
3.2)得到处理过的Query后,通过步骤2.2)的词嵌入模型和步骤2.3)的TF-IDF来计算出与DataSet_Questions的相似度,并以相似度从大到小排列建立Top-N列表,问题数量为N;
3.3)在得到Top-N列表之后,使用LSA模型来排除与其他语义相差过大的问题项;使用LSA模型排除掉n条语义相差的问题,并把剩下的N-n条问题列表命名为DataSet_Question40;其中,LSA模型原理的计算公式为:
Figure 869699DEST_PATH_IMAGE006
其中,
Figure 139007DEST_PATH_IMAGE007
是m×m阶矩阵;
Figure 986877DEST_PATH_IMAGE008
是半正定m×n阶对角矩阵;
Figure 708845DEST_PATH_IMAGE009
Figure 933153DEST_PATH_IMAGE010
的共轭转置矩阵;
步骤4的具体步骤如下:
4.1)使用LDA模型生成文档主题并将其处理为标签,帮助开发者更轻松地查找API;
4.2)使用步骤2.1)得到的DataSet_Answers,对DataSet_Answers做进一步处理,即从DataSet_Answers中进行数据抽取,抽取得到回答DataSet_Questions中问题的API;
4.3)使用步骤4.2)抽取得到DataSet_Questions中对应问题的API,建立关系型数据库,命名为DatabaseQA;通过数据库DatabaseQA,实现DataSet_SOAPI中DataSet_Questions和DataSet_Answers的映射,把这两个数据集联系起来,在数据库DatabaseQA中,得到某一问题中的单词,可以找到对应问题的序号和问题答案的API;
步骤4.2)的具体步骤如下:
4.2.1)对DataSet_Answers中的数据进行抽取,首先筛选出有效答案,在DataSet_SOAPI中也包含了问题项的答案项;此时判断答案项是否为空,如果是空的话,那么删除这条数据;
4.2.2)DataSet_SOAPI中的每条数据包含question属性和answer 属性,在answer后面有它的引用率,选择保留引用率排名前三的回答进行保留,其余的答案则进行删除;
4.2.3)在使用步骤4.2.2)保留了部分答案之后,使用Jsoup解析器进行API的抽取,从答案中提取所有包含<code>标记的代码段,提取具有驼峰写法的Java类API;
步骤4.3)的具体步骤如下:
4.3.1)步骤3.3)得到DataSet_Question40之后,在步骤4.3)中得到的DatabaseQA中找到对应的40个问题的答案,解析DataSet_SOAPI中DataSet_Question40的答案的HTML数据;
4.3.2)在HTML中<code>标签之间的部分和DataSet_Question40的回答者引用的API帮助文档的超链接中包含有API信息,提取API信息,计算API所在的问题平均相似度得到List_RankedAPI;得到的List_RankedAPI后,在数据集DataSet_SE中找到对应的API;
4.3.3)根据需要来设定出推荐API的条数。
2.根据权利要求1所述的基于词嵌入技术的API推荐方法,其特征在于,步骤1中,收集得到的数据集Java SE8 的API文档命名为DataSet_SE;
Stack Overflow上关于Java API的问答数据集从Stack Overflow上获取,命名为DataSet_SOAPI。
3.根据权利要求1所述的基于词嵌入技术的API推荐方法,其特征在于,步骤4.3.3)中,在找到了相似度较高的API之后,同时推荐下述内容给开发者来协助开发:
a)Query标签;
b)API帮助文档中对该API的功能描述;
c)开发者输入问题的相关问题;
d)相关的代码段。
CN201911118507.6A 2019-11-15 2019-11-15 一种基于词嵌入技术的api推荐方法 Active CN110990003B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911118507.6A CN110990003B (zh) 2019-11-15 2019-11-15 一种基于词嵌入技术的api推荐方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911118507.6A CN110990003B (zh) 2019-11-15 2019-11-15 一种基于词嵌入技术的api推荐方法

Publications (2)

Publication Number Publication Date
CN110990003A CN110990003A (zh) 2020-04-10
CN110990003B true CN110990003B (zh) 2021-11-23

Family

ID=70084683

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911118507.6A Active CN110990003B (zh) 2019-11-15 2019-11-15 一种基于词嵌入技术的api推荐方法

Country Status (1)

Country Link
CN (1) CN110990003B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111813443B (zh) * 2020-07-28 2023-07-18 南京大学 一种用JavaFX进行代码样例自动填充的方法和工具
CN112214511A (zh) * 2020-10-10 2021-01-12 南通大学 一种基于wtp-wcd算法的api推荐方法
CN114297479B (zh) * 2021-12-16 2023-03-21 杭州电子科技大学 一种结合LDA主题模型和GloVe词向量技术的API推荐方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108287904A (zh) * 2018-05-09 2018-07-17 重庆邮电大学 一种基于社会化卷积矩阵分解的文档上下文感知推荐方法
CN109086463A (zh) * 2018-09-28 2018-12-25 武汉大学 一种基于区域卷积神经网络的问答社区标签推荐方法

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10354006B2 (en) * 2015-10-26 2019-07-16 International Business Machines Corporation System, method, and recording medium for web application programming interface recommendation with consumer provided content
US20170344554A1 (en) * 2016-05-31 2017-11-30 Linkedin Corporation Ideal candidate search ranking
US20180232442A1 (en) * 2017-02-16 2018-08-16 International Business Machines Corporation Web api recommendations
CN109670022B (zh) * 2018-12-13 2023-09-29 南京航空航天大学 一种基于语义相似度的Java应用程序接口使用模式推荐方法
CN109739994B (zh) * 2018-12-14 2023-05-02 复旦大学 一种基于参考文档的api知识图谱构建方法
CN109947912B (zh) * 2019-01-25 2020-06-23 四川大学 一种基于段落内部推理和联合问题答案匹配的模型方法
CN109933660B (zh) * 2019-03-25 2019-11-12 广东石油化工学院 面向自然语言形式基于讲义和网站的api信息检索方法
CN110046240B (zh) * 2019-04-16 2020-12-08 浙江爱闻格环保科技有限公司 结合关键词检索与孪生神经网络的目标领域问答推送方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108287904A (zh) * 2018-05-09 2018-07-17 重庆邮电大学 一种基于社会化卷积矩阵分解的文档上下文感知推荐方法
CN109086463A (zh) * 2018-09-28 2018-12-25 武汉大学 一种基于区域卷积神经网络的问答社区标签推荐方法

Also Published As

Publication number Publication date
CN110990003A (zh) 2020-04-10

Similar Documents

Publication Publication Date Title
CN109492077B (zh) 基于知识图谱的石化领域问答方法及系统
CN110059311B (zh) 一种面向司法文本数据的关键词提取方法及系统
CN111209738B (zh) 一种联合文本分类的多任务命名实体识别方法
US8484245B2 (en) Large scale unsupervised hierarchical document categorization using ontological guidance
US9280535B2 (en) Natural language querying with cascaded conditional random fields
CN110674252A (zh) 一种面向司法领域的高精度语义搜索系统
CN110990003B (zh) 一种基于词嵌入技术的api推荐方法
US20230136368A1 (en) Text keyword extraction method, electronic device, and computer readable storage medium
CN102663129A (zh) 医疗领域深度问答方法及医学检索系统
US20050138079A1 (en) Processing, browsing and classifying an electronic document
CN110334343B (zh) 一种合同中个人隐私信息抽取的方法和系统
CN113886604A (zh) 一种职位知识图谱生成方法和系统
CN106294733A (zh) 基于文本分析的网页检测方法
CN112307182A (zh) 一种基于问答系统的伪相关反馈的扩展查询方法
Cheng et al. A similarity integration method based information retrieval and word embedding in bug localization
CN116304347A (zh) 一种基于群智知识的Git命令推荐方法
Dawar et al. Text categorization by content using Naïve Bayes approach
CN114238735B (zh) 一种互联网数据智能采集方法
WO2022264435A1 (ja) エンティティとインテントとコーパスの自動生成装置及びプログラム
CN114298020A (zh) 一种基于主题语义信息的关键词向量化方法及其应用
MalarSelvi et al. Analysis of Different Approaches for Automatic Text Summarization
JP2001325104A (ja) 言語事例推論方法、言語事例推論装置及び言語事例推論プログラムが記録された記録媒体
Ramachandran et al. Document Clustering Using Keyword Extraction
Sati et al. Arabic text question answering from an answer retrieval point of view: A survey
Zhang et al. Rasop: an api recommendation method based on word embedding technology

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
GR01 Patent grant
GR01 Patent grant
CB03 Change of inventor or designer information
CB03 Change of inventor or designer information

Inventor after: Luo Jian

Inventor after: Wen Wanzhi

Inventor after: Zhang Bin

Inventor after: Jiang Wenxuan

Inventor after: Li Xikai

Inventor after: Gu Hui

Inventor after: Li Yuehua

Inventor before: Wen Wanzhi

Inventor before: Zhang Bin

Inventor before: Jiang Wenxuan

Inventor before: Li Xikai

Inventor before: Gu Hui

Inventor before: Li Yuehua

TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20230814

Address after: Room 204, Building 7, Xinghu 101 Square, No. 1101 Xinghu Avenue, Xinkai Street, Development Zone, Nantong City, Jiangsu Province, 226000

Patentee after: Nantong Yingsi Beiyun Information Technology Co.,Ltd.

Address before: Room 1104, Building A, Zhiyun Industrial Park, No. 13 Huaxing Road, Henglang Community, Dalang Street, Longhua District, Shenzhen City, Guangdong Province, 518100

Patentee before: Shenzhen Hongyue Information Technology Co.,Ltd.

Effective date of registration: 20230814

Address after: Room 1104, Building A, Zhiyun Industrial Park, No. 13 Huaxing Road, Henglang Community, Dalang Street, Longhua District, Shenzhen City, Guangdong Province, 518100

Patentee after: Shenzhen Hongyue Information Technology Co.,Ltd.

Address before: 226019 Jiangsu Province, Nantong City Chongchuan District sik Road No. 9

Patentee before: NANTONG University