首页 / 专利库 / 数学与统计 / 解析法 / 一种基于词嵌入技术的API推荐方法

一种基于词嵌入技术的API推荐方法

阅读:1017发布:2020-06-26

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

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.根据权利要求1所述的基于词嵌入技术的API推荐方法,其特征在于,步骤1中,收集得到的数据集Java SE8的API文档命名为DataSet_SE;
Stack Overflow上关于Java API的问答数据集从Stack Overflow上获取,命名为DataSet_SOAPI。
3.根据权利要求1所述的基于词嵌入技术的API推荐方法,其特征在于,步骤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的计算又分为词频的计算和逆向文档频率的计算,其计算公式为:
其中,公式中ni,j表示目标词ti在语料di中的出现次数,而分母表示在语料di中所有单词的出现次数之和;D是数据集TextCorpus中的语料的总数;|{j:ti∈dj}|是包含目标词ti的数目。
4.根据权利要求3所述的基于词嵌入技术的API推荐方法,其特征在于,步骤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算法之后,设置向量的维度。
5.根据权利要求1所述的基于词嵌入技术的API推荐方法,其特征在于,步骤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模型原理的计算公式为:
其中,U是m×m阶矩阵;∑是半正定m×n阶对矩阵;VT是V的共轭转置矩阵。
6.根据权利要求1所述的基于词嵌入技术的API推荐方法,其特征在于,步骤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。
7.根据权利要求6所述的基于词嵌入技术的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的抽取,从答案中提取所有包含标记的代码段,提取具有驼峰写法的Java类API。
8.根据权利要求6所述的基于词嵌入技术的API推荐方法,其特征在于,步骤4.3)的具体步骤如下:
4.3.1)步骤3.3)得到DataSet_Question40之后,在步骤4.3)中得到的DatabaseQA中找到对应的40个问题的答案,解析DataSet_SOAPI中DataSet_Question40的答案的HTML数据;
4.3.2)在HTML中标签之间的部分和DataSet_Question40的回答者引用的API帮助文档的超链接中包含有API信息,提取API信息,计算API所在的问题平均相似度得到List_RankedAPI;得到的List_RankedAPI后,在数据集DataSet_SE中找到对应的API;
4.3.3)根据需要来设定出推荐API的条数。
9.根据权利要求8所述的基于词嵌入技术的API推荐方法,其特征在于,步骤4.3.3)中,在找到了相似度较高的API之后,可以同时推荐下述内容给开发者来协助开发:
a)Query标签;
b)API帮助文档中对该API的功能描述;
c)开发者输入问题的相关问题;
d)相关的代码段。

说明书全文

一种基于词嵌入技术的API推荐方法

技术领域

[0001] 本发明属于代码推荐技术领域,具体涉及一种基于词嵌入技术的API推 荐方法。

背景技术

[0002] 随着技术的不断发展,人们对软件的功能需求日益丰富,软件的结构呈现 出复杂化和大型化的特点。在软件开发过程中,程序开发人员可能会面临很多 软件编写困难的情况,比如遗忘了API(Application Programming Interface, 应用程序接口)的作用、不熟悉某个API的返回值和参数列表或者想要知道 某些不常用的功能的具体实现方法。因此,开发人员在开发过程中查询到满足 开发需求的API尤为重要。
[0003] 当在实际开发过程中找不到合适的API情况出现时,可以采取以下几种 方法:
[0004] (1)开发者通常会选择使用搜索引擎查询需要的Java API。但是利用搜 索引擎通常需要确切的功能性描述或者关键字。这种方法在查询某一特定API 的功能时很有效,但是在查找实现某一功能的API时可能不会有很好的效果。 而且搜索结果还需要开发者进行甄选会耗费很多时间。
[0005] (2)借助Java帮助文档,以Java SE 8API文档为例。这种文档包含了Java语言常用的API规范,很多官方的介绍和类、方法、变量的解释和代码 引例。使用这种方法同样能很好的解决某个特定API的功能,而在查找实现 某一功能的API时则很难实现。
[0006] (3)通过查询Stack Overflow网站上的帖子,Stack Overflow上面收集了 世界各地开发者们的提问和解答记录,开发者可以从类似问题的答案中获取想 要的API,而这个过程需要开发者设置查询相似的问题,并且对答案要具备一 定的甄别能
[0007] (4)向有经验的开发人员咨询,这种方法建立在开发人员对这些API极 其熟悉的情况下,存在很大的主观性,同时效率也很低。
[0008] 基于上述问题,为了解决开发者在查询API时所遇到的问题。设计出一 个为开发者推荐合适API的系统就十分有意义。

发明内容

[0009] 本发明要解决的技术问题是提供一种基于词嵌入技术的API推荐方法, 能够给开发者推荐出较为准确的API信息,,大大提高了开发者的在开发过程 中的编程效率。
[0010] 为解决上述技术问题,本发明的实施例提供一种基于词嵌入技术的API 推荐方法,分为两大模,其中一个是离线训练模块,另一个是在线推荐模块, 其中,所述离线训练模块包括如下步骤:
[0011] 步骤1、数据收集:收集两个目标数据集,其中一部分是Java SE8的API 文档,另一部分是Stack Overflow上关于Java API的问答数据集;
[0012] 步骤2、对从Stack Overflow上获取的数据进行数据处理:将数据集拆分 为问题数据集和答案数据集,收集问题数据集中的所有单词建立单词库,并预 处理此单词库,对单词库中的数据进行词嵌入建模,生成单词模型;建立 TF-IDF字典,对包含重要信息的单词设置高权重;
[0013] 所述在线推荐模块包括如下步骤:
[0014] 步骤3、通过UI界面收集开发者输入的问题,使用步骤2得到的单词模 型和TF-IDF字典对开发者输入的问题和问题数据集进行相似度计算,得到相 似度较高的候选问题列表;使用LSA模型过滤候选问题列表,排除具有语义 差别的问题;
[0015] 步骤4、通过LDA模型提取主题词,把主题词设置为开发者此次提问的 标签提供给开发者;在数据库中找到对应的API,组成候选API列表;最后通 过API文档进一步完善API推荐信息,并把API推荐信息输出到UI界面。
[0016] 其中,步骤(1)中,收集得到的数据集Java SE8的API文档命名为 DataSet_SE;
[0017] Stack Overflow上关于Java API的问答数据集从Stack Overflow上获取, 命名为DataSet_SOAPI。
[0018] 其中,步骤2的具体步骤如下:
[0019] 2.1)把通过步骤1得到的问答数据集中的数据分为两个部分:问题数据 集和答案数据集,分别命名为DataSet_Questions和DataSet_Answers;
[0020] 2.2)收集DataSet_Questions中所有的单词建立一个单词库,命名为 TextCorpus,然后对处理完成的单词库进行词嵌入建模;通过使用word2vec 的方法把单词库中的每一个单词转换成单词矩阵;
[0021] 2.3)使用TF-IDF值为计算单词的相似度加权;使用2.2)步骤得到的数 据集TextCorpus计算出TextCorpus中的TF-IDF值;TF-IDF的计算又分为词 频的计算和逆向文档频率的计算,其计算公式为:
[0022]
[0023] 其中,公式中ni,j表示目标词ti在语料di中的出现次数,而分母表示在语料 di中所有单词的出现次数之和;D是数据集TextCorpus中的语料的总数; |{j:ti∈dj}|是包含目标词ti的数目。
[0024] 其中,步骤2.2)的具体步骤如下:
[0025] 2.2.1)收集问题数据集中所有的单词,需要对单词做分词、删除停词和提 取词根的自然语言处理;实现步骤中的三个条件,需按照以下步骤进行:
[0026] 2.2.1.1)在遍历DataSet_Questions和DataSet_Answers中的数据时,首先 需要对TextCorpus数据集进行分词操作,即把TextCorpus数据集中的每一句 话分成n个独立的单词存储在列表当中,列表命名为List_word;
[0027] 2.2.1.2)在2.2.1.1)结束之后,得到一个包含所有单词的列表,使用NTLK 库中的corpus包来进行删除停词的操作,当遍历列表List_words时,判断列 表中的数据是否在stopwords.words('english')当中;如果存在,则删除该停词; 如果不存在,则把数据存入到一个新的列表当中,命名为List_outStopWords;
[0028] 2.2.1.3)在删除停词的操作结束之后,进行提取词干的操作:对通过步骤 2.2.1.2)的列表List_outStopWords再次进行遍历,通过对列表中的每个元素进 行词干提取操作,把处理过的新列表命名为List_StemmerWords;
[0029] 2.2.1.4)得到List_StemmerWords列表之后,通过python内置的set()方 法来使列表去除重复元素,在对列表中含有的特殊符号的数据进行删除,最终 得到单词库KeyCorpus;
[0030] 2.2.2)在收集完问题数据集中的单词后,选择CBOW算法训练问题数据 集;
[0031] 2.2.3)确定了使用COBW算法之后,设置向量的维度。
[0032] 其中,步骤3的具体步骤如下:
[0033] 3.1)通过UI界面收集开发者在开发过程中的提问,称为Query;然后把 得到的Query通过步骤2.2.1.1)、步骤2.2.1.2)和步骤2.2.1.3)分别进行分词 去重、删除停词和词根转化的处理;
[0034] 3.2)得到处理过的Query后,通过步骤2.2)的词嵌入模型和步骤2.3) 的TF-IDF来计算出与DataSet_Questions的相似度,并以相似度从大到小排列 建立Top-N列表,问题数量为N;
[0035] 3.3)在得到Top-N列表之后,使用LSA模型来排除与其他语义相差过大 的问题项;使用LSA模型排除掉n条语义相差的问题,并把剩下的N-n条问 题列表命名为DataSet_Question40;其中,LSA模型原理的计算公式为:
[0036]
[0037] 其中,U是m×m阶矩阵;∑是半正定m×n阶对矩阵;VT是V的共轭转 置矩阵。
[0038] 其中,步骤4的具体步骤如下:
[0039] 4.1)使用LDA模型生成文档主题并将其处理为标签,帮助开发者更轻松 地查找API;
[0040] 4.2)使用步骤2.1)得到的DataSet_Answers,对DataSet_Answers做进一 步处理,即从DataSet_Answers中进行数据抽取,抽取得到回答 DataSet_Questions中问题的API;
[0041] 4.3)使用步骤4.2)抽取得到DataSet_Questions中对应问题的API,建立 关系型数据库,命名为DatabaseQA;通过数据库DatabaseQA,实现 DataSet_SOAPI中DataSet_Questions和DataSet_Answers的映射,把这两个数 据集联系起来,在数据库DatabaseQA中,得到某一问题中的单词,可以找到 对应问题的序号和问题答案的API。
[0042] 进一步,步骤4.2)的具体步骤如下:
[0043] 4.2.1)对DataSet_Answers中的数据进行抽取,首先筛选出有效答案,在 DataSet_SOAPI中也包含了问题项的答案项;此时判断答案项是否为空,如果 是空的话,那么删除这条数据;
[0044] 4.2.2)DataSet_SOAPI中的每条数据包含question属性和answer属性, 在answer后面有它的引用率,选择保留引用率排名前三的回答进行保留,其 余的答案则进行删除;
[0045] 4.2.3)在使用步骤4.2.2)保留了部分答案之后,使用Jsoup解析器进行 API的抽取,从答案中提取所有包含标记的代码段,提取具有驼峰写法 的Java类API。
[0046] 进一步,步骤4.3)的具体步骤如下:
[0047] 4.3.1)步骤3.3)得到DataSet_Question40之后,在步骤4.3)中得到的 DatabaseQA中找到对应的40个问题的答案,解析DataSet_SOAPI中 DataSet_Question40的答案的HTML数据;
[0048] 4.3.2)在HTML中标签之间的部分和DataSet_Question40的回答 者引用的API帮助文档的超链接中包含有API信息,提取API信息,计算API 所在的问题平均相似度得到List_RankedAPI;得到的List_RankedAPI后,在 数据集DataSet_SE中找到对应的API;
[0049] 4.3.3)根据需要来设定出推荐API的条数。
[0050] 其中,步骤4.3.3)中,在找到了相似度较高的API之后,可以同时推荐 下述内容给开发者来协助开发:
[0051] a)Query标签;
[0052] b)API帮助文档中对该API的功能描述;
[0053] c)开发者输入问题的相关问题;
[0054] d)相关的代码段。
[0055] 本发明的上述技术方案的有益效果如下:
[0056] 本发明的模型是几种传统的API查询方法的综合,能够给开发者带来更 高效准确的API推荐。具体表现为:a、整合了多种辅助信息来进行API推荐, 如本发明中使用的API帮助文档和Stack Overflow中的问答信息都可以作为这 种辅助信息,信息来源的多样性可以使推荐的结果更具有适用性,更好的应用 到各种场景开发当中;b、通过词嵌入技术来处理语义偏差问题,解决了开发 者问题输入时可能查询不到对应API的问题,通过构建语言模型来得到最相 关的问题列表和API推荐,确保每个问题都能得到最相关的内容推荐,减少 了开发者的查询比较的时间;c、本发明中不仅提供了API推荐,还有包含有 标签词、相关问题列表和代码段等内容,给开发者提供了API的使用说明, 大大提高了开发者的在开发过程中的编程效率。附图说明
[0057] 图1为本发明的总体流程图
[0058] 图2为本发明中3个预处理流程图;
[0059] 图3为本发明中两个单词的词向量表示图;
[0060] 图4为本发明中节选部分数据库示意图;
[0061] 图5为本发明中LSA模型处理top-50示例图;
[0062] 图6为本发明实施例的最终推荐结果示意图。

具体实施方式

[0063] 为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附 图及具体实施例进行详细描述。
[0064] 本发明提供了一种基于词嵌入技术的API推荐方法,分为两大模块,其 中一个是离线训练模块,另一个是在线推荐模块,其中,所述离线训练模块包 括如下步骤:
[0065] 步骤1、数据收集:收集两个目标数据集,其中一部分是Java SE8的API 文档,另一部分是Stack Overflow上关于Java API的问答数据集;
[0066] 步骤1中,收集得到的数据集Java SE8的API文档命名为DataSet_SE; Stack Overflow上关于Java API的问答数据集从Stack Overflow上获取,命名 为DataSet_SOAPI。
[0067] 步骤2、对从Stack Overflow上获取的数据进行数据处理:将数据集拆分 为问题数据集和答案数据集,收集问题数据集中的所有单词建立单词库,并预 处理此单词库,对单词库中的数据进行词嵌入建模,即把所有的单词都转换成 对应的词向量,生成单词模型;建立TF-IDF(Term Frequency–Inverse Document Frequency)字典,对可能包含重要信息的单词设置较高权重;
[0068] 其中,步骤2的具体步骤如下:
[0069] 2.1)把通过步骤1得到的问答数据集中的数据分为两个部分:问题数据 集和答案数据集,分别命名为DataSet_Questions和DataSet_Answers;
[0070] 2.2)收集DataSet_Questions中所有的单词建立一个单词库,并把这个单 词库命名为TextCorpus,然后对处理完成的单词库进行词嵌入建模;通过使用 word2vec的方法把单词库中的每一个单词转换成单词矩阵;
[0071] 步骤2.2)的具体步骤如下:
[0072] 2.2.1)收集问题数据集中所有的单词,需要对单词做分词、删除停词和提 取词根的自然语言处理;实现步骤中的三个条件,需按照以下步骤进行:
[0073] 2.2.1.1)在遍历DataSet_Questions和DataSet_Answers中的数据时,首先 需要对TextCorpus数据集进行分词操作,即把TextCorpus数据集中的每一句 话分成n个独立的单词存储在列表当中,把这个列表命名为List_word。需要 注意的是,本发明在这一步骤同时把所有字符串中的大写字符转换为小写字符 方便处理;
[0074] 2.2.1.2)在2.2.1.1)结束之后,得到了一个包含所有单词的列表,使用 NTLK库中的corpus包来进行删除停词的操作,当遍历列表List_words时,判 断列表中的数据是否在stopwords.words('english')当中;如果存在,则删除该停 词;如果不存在,则把数据存入到一个新的列表当中,命名为 List_outStopWords;
[0075] 2.2.1.3)在删除停词的操作结束之后,进行提取词干的操作:对通过步骤 2.2.1.2)的列表List_outStopWords再次进行遍历,通过对列表中的每个元素进 行词干提取操作,把处理过的新列表命名为List_StemmerWords;
[0076] 2.2.1.4)得到List_StemmerWords列表之后,通过python内置的set()方 法来使列表去除重复元素,在对列表中含有的特殊符号的数据进行删除,比如 $、%、#、@等,最终得到单词库KeyCorpus;
[0077] 2.2.2)在收集完问题数据集中的单词后,选择要建立语言模型的时候需要 从两个方面考虑,第一部分是算法方面,在选择了word2vec方法训练数据集 之后,该模型涉及两种算法:CBOW算法和Skip-Gram算法。因为本发明要 实现的是融合各类信息进行API推荐,结合已经得到的单词库KeyCorpus,所 以选择CBOW算法训练数据集;
[0078] 2.2.3)确定了使用COBW算法之后,设置向量的维度。需要考虑的是向 量的维度方面,向量的维度可以手动的进行设置,基于我们的数据集比较庞大, 因此把word2vec方法中的size参数设置为100。这里面选择100的原因是使 得单词库KeyCorpus中的数据尽可能的被唯一表示,提高推荐的精度
[0079] 2.3)生成单词的TF-IDF字典,一个单词的TF-IDF值表示这个单词在 TextCorpus出现的逆频率,如果一个单词的TF-IDF的值越低,那么它在 TextCorpus中出现的频率就越低,就更可能包含有重要的信息。使用TF-IDF 值为计算单词的相似度加权;使用2.2)步骤得到的数据集TextCorpus计算出 TextCorpus中的TF-IDF值;TF-IDF的计算又分为词频的计算和逆向文档频率 的计算,其计算公式为:
[0080]
[0081] 其中,公式中ni,j表示目标词ti在语料di中的出现次数,而分母表示在语料 di中所有单词的出现次数之和;D是数据集TextCorpus中的语料的总数; |{j:ti∈dj}|是包含目标词ti的数目。为了保证目标词一定存在于数据集中,即防 止被除数为零,因此一般情况下使用|{j:ti∈dj}|+1。
[0082] 所述在线推荐模块包括如下步骤:
[0083] 步骤3、通过UI界面收集开发者输入的问题,使用步骤2得到的单词模 型和TF-IDF字典对开发者输入的问题和问题数据集进行相似度计算,得到相 似度较高的候选问题列表;使用LSA(Latent Semantic Analysis)模型过滤候 选问题列表,排除具有语义差别的问题;
[0084] 其中,步骤3的具体步骤如下:
[0085] 3.1)通过UI界面收集开发者在开发过程中的提问,称为Query;然后把 得到的Query通过步骤2.2.1.1)、步骤2.2.1.2)和步骤2.2.1.3)分别进行分词 去重、删除停词和词根转化的处理;
[0086] 3.2)得到处理过的Query后,通过步骤2.2)的词嵌入模型和步骤2.3) 的TF-IDF来计算出与DataSet_Questions的相似度,并以相似度从大到小排列 建立Top-N列表,问题数量为N;本发明为了避免推荐过程中因相似问题过多 而的产生干扰的数据,因此把N取到50,并把这个Top-N列表命名为 DataSet_Question50
[0087] 3.3)在得到Top-N列表之后,使用LSA模型来排除与其他语义相差过大 的问题项;使用LSA模型排除掉n条语义相差的问题,并把剩下的N-n条问 题列表命名为DataSet_Question40;其中,LSA模型原理的计算公式为:
[0088]
[0089] 其中,U是m×m阶矩阵;∑是半正定m×n阶对角矩阵;VT是V的共轭转 置矩阵。LSA模型就是把Xm*n矩阵缩减为k维的结果。在本发明中,我们为 候选问题生成单词矩阵,并通过奇异值分解来减小维数。然后我们通过计算这 些问题的余弦相似度,其中cos由以下公式计算: 排除 了一些语义差异较大的问题。
[0090] 步骤4、通过LDA(Latent Dirichlet Allocation)模型提取主题词,把这些 主题词设置为开发者此次提问的标签提供给开发者;在数据库中找到对应的 API,组成候选API列表;最后通过API文档进一步完善API推荐信息,并把API推荐信息输出到UI界面。
[0091] 其中,步骤4的具体步骤如下:
[0092] 4.1)使用LDA模型生成文档主题并将其处理为标签,帮助开发者更轻松 地查找API;LDA是一种无监督的机器学习技术,它将文本信息转换为易于 建模的数字信息。但是,词袋法没有考虑词与词之间的顺序。因此,本发明还 需要通过计算候选问题集的词频来辅助生成标签。由LDA模型和词频统计的 目标词生成的单词将被选作为这条Query的标签,显示给开发者。
[0093] 4.2)使用步骤2.1)得到的DataSet_Answers,对DataSet_Answers做进一 步处理,即从DataSet_Answers中进行数据抽取,抽取得到回答 DataSet_Questions中问题的API;因为DataSet_Answers是以DataSet_SOAPI 中创建的数据集DataSet_Questions的答案,而这部分我们需要处理的是开发 者在Stack Overflow上进行提问的问题和答案。
[0094] 步骤4.2)的具体步骤如下:
[0095] 4.2.1)对DataSet_Answers中的数据进行抽取,首先筛选出有效答案,在 DataSet_SOAPI中也包含了问题项的答案项;此时需要判断答案项是否为空, 如果是空的话,那么删除这条数据;
[0096] 4.2.2)在检索DataSet_SOAPI中的每条数据时发现,文本中不仅包含着 question属性和answer属性,在answer后面还有它的引用率,打开 Stackoverflow时,就会发现网站在对每条问题的答案提供了用户评分系统,当 一个提问的答案被越多的开发者所采用时,他就越接近于正确答案,因此开发 者更有可能选择该条回答是有价值的选项,从而这条回答的引用率就越高。因 此选择保留引用率排名前三的回答进行保留,其余的答案则进行删除;
[0097] 4.2.3)在使用步骤4.2.2)保留了部分答案之后,使用Jsoup解析器进行 API的抽取,从答案中提取所有包含标记的代码段。但是有些代码段可 能由其他标签标记,或者没有标记信息,因此本次发明中还使用了一组正则表 达式来进行辅助,提取具有驼峰写法的Java类API。
[0098] 4.3)使用步骤4.2)抽取得到DataSet_Questions中对应问题的API,建立 关系型数据库,命名为DatabaseQA;其中,DatabaseQA中包含的主键有 DataSet_Questions中问题的序列号、问题、单词库KeyCorpus和 DataSet_Answers中抽取的对应问题的API。通过数据库DatabaseQA,实现 DataSet_SOAPI中DataSet_Questions和DataSet_Answers的映射,把这两个数 据集联系起来。通过这种方法,在数据库DatabaseQA中,得到某一问题中的 单词,可以找到对应问题的序号和问题答案的API。
[0099] 步骤4.3)的具体步骤如下:
[0100] 4.3.1)步骤3.3)得到DataSet_Question40之后,在步骤4.3)中得到的 DatabaseQA中找到对应的40个问题的答案,解析DataSet_SOAPI中 DataSet_Question40的答案的HTML数据;
[0101] 4.3.2)在HTML中标签之间的部分和DataSet_Question40的回答 者引用的API帮助文档的超链接中包含有API信息,提取API信息,计算API 所在的问题平均相似度得到List_RankedAPI;得到的List_RankedAPI后,在 数据集DataSet_SE中找到对应的API;
[0102] 4.3.3)根据需要来设定出推荐API的条数。在找到了相似度较高的API 之后,可以同时推荐下述内容给开发者来协助开发:
[0103] a)Query标签;
[0104] b)API帮助文档中对该API的功能描述;
[0105] c)开发者输入问题的相关问题;
[0106] d)相关的代码段。
[0107] 下面结合具体实施例进一步阐述本发明的技术方案:
[0108] 本实施例的基于词嵌入技术的API推荐方法总体流程图如图1所示,包 含如下步骤:
[0109] 一、离线训练模块
[0110] 在开发者输入问题之前,系统需要先进行离线的数据训练。在这个部分, 处理两个数据集并且建立单词模型和TF-IDF字典。具体实现分为以下几个步 骤:
[0111] 1)获取数据集,其中一个是Java SE 8API文档,这类文档网上资源较多, 获取方式较为容易,可以直接从网络上下载得到,把收集得到的这个数据集命 名为DataSet_SE。另外一个是StackOverflow上关于Java  API的数据集,这部  分数据集需要从Stackoverflow上获取,在Stackoverflow官方网站上提供了一 个data dump,官方会把这些开源的数据提供给的研究者使用。本次实验使用 的data dump版本便是在2017年12月份发布的。因为本次发明的目的是提供 API推荐,因此本次实验从这个版本的data dump中抽取了以Java API为关键 词的部分数据作为本次发明的数据集,并把这个数据集命名为 DataSet_SOAPI。
[0112] 2)数据处理,在得到了DataSet_SOAPI和DataSet_SE这两个数据之后需 要对其中的数据做预处理,首先把DataSet_SOAPI这个数据集进行划分,通过 DataSet_SOAPI中数据的question属性和answer属性的内容分别添加到两个数 据集中,分别是问题数据集和答案数据集,分别命名为DataSet_Questions和 DataSet_Answers。收集DataSet_Questions数据集中的所有的单词组成一个单 词库TextCorpus。单词库TextCorpus要进行预处理,如图2所示。
[0113] a)在遍历单词库TextCorpus,首先需要该数据集进行分词操作,即把每 一句话分成n个独立的单词存储在列表当中,把这个列表命名为List_word。  使用WordPunctTokenizer()这个方法来实现分词,需要注意的是,这里也同时 使用lower()方法把字符串中所有大写字符转换为小写以便于统一处理。
[0114] b)遍历列表List_words时,判断列表中的数据是否在 stopwords.words('english')当中。如果存在,则删除该停词;如果不存在,把数 据存入到一个新的列表当中,命名为List_outStopWords;
[0115] c)通过snowballStemmer('english').stem()方法来对列表List_outStopWords 中的每个元素进行词干提取操作,把处理过的新列表命名为 List_StemmerWord。最后通过python内置的set()方法来使列表去除重复元素, 在对列表中含有的特殊符号的数据进行删除,最终得到预处理过的单词库命名 为KeyCorpus。
[0116] 对DataSet_SOAPI做进一步处理,因为DataSet_SOAPI是以Java API为 关键词的数据集,而这部分我们需要处理的是开发者在Stackoverflow上进行 提问的问题。因此需要从DataSet_SOAPI中进行数据抽取,把DataSet_SOAPI 中所有的问题项组成问题集。Stackoverflow网站对每条问题的答案提供了用户 评分系统,因此score大于等于零时对应的问题应该被保留,评分小于零的问 题则被剔除。在筛选过程结束后,得到了最终的问题集DataSet_Questions。
[0117] 节选数据集DataSet_Questions中的部分数据内容如下所示。
[0118]
[0119] 3)处理单词库,对单词库KeyCorpus中的数据进行词嵌入建模,即把所 有的单词都转换成对应的词向量,生成单词模型。使用Gensim库,Gensim库 是一个用于从文档中自动提取语义主题的Python库。所使用的word2vec的方 法是来自Gensim库中的models包。用过使用word2vec方法对KeyCorpus数 据集中的每一个word转换成了一个词向量。选择了word2vec方法训练数据集 之后,以CBOW算法为核心建立单词模型,CBOW算法是给定上下文来预测 中心词。我们测试了两个单词:Array和Value,它们的词向量表示如图3所示 (节选了20维)。
[0120] 建立单词的TF-IDF字典,一个单词的TF-IDF值表示这个单词在 TextCorpus中出现的逆频率,如果一个单词的TF-IDF的值越低,那么它在 TextCorpus中出现的频率就越低,就更可能包含有重要的信息。使用TF-IDF 来来为计算单词的相似度加权。使用数据集TextCorpus,计算出TF-IDF字典。 TF-IDF的计算又分为词频的计算和逆向文档频率的计算,其计算公式为:
[0121]
[0122] 其中,公式中ni,j表示目标词ti在语料di中的出现次数,而分母表示在该语 料di中所有单词的出现次数之和,D是数据集TextCorpus中的语料的总数, |{j:ti∈dj}|是包含目标词ti的数目。为了保证目标词一定在数据集中,即防止被 除数为零,因此一般情况下使用|{j:ti∈dj}|+1。
[0123] 对答案数据集DataSet_Answers进行API抽取。本发明使用的Jsoup解析器 来进行API抽取,从答案中提取所有包含标记的代码段。但是有些代 码段可能由其他标签标记,或者没有标记信息,因此本次发明中还使用了一组 正则表达式来进行辅助,提取那些具有驼峰写法的Java类API。
[0124] 结合单词库KeyCorpus和抽取得到DataSet_Questions中对应问题的API, 建立一种关系型数据库,命名为DatabaseQA。其中DatabaseQA中包含的主键 有DataSet_Questions中问题的序列号、问题、单词库KeyCorpus和 DataSet_Answers中抽取的对应问题的API如图4所示。通过该数据库 DatabaseQA,实现了DataSet_SOAPI中DataSet_Questions和DataSet_Answers 的映射,把这两个数据集联系起来。通过这种方法,在数据库DatabaseQA中, 得到某一问题中的单词,可以找到对应问题的序号和问题答案的API。
[0125] 二、在线推荐模块
[0126] 下面我们结合一个具体实例来说明在线推荐模块,通过UI界面收集开发者 输入的某次问题:How to initialize an array in Java with a constant  value efficiently?
[0127] 首先用变量Query来保存这个问题,然后通过离线训练中第2)步的a)、b) 和c)三步来对Query做类似的分词、删除停词和词干提取的处理。得到的结 果如表1所示:
[0128] 表1:使用3种方法对Query进行预处理的结果
[0129]
[0130] 在预处理结束Query后,利用步骤2)中已经建立好的单词模型和TF-IDF 字典来计算与数据集DataSet_Questions的相似度。并按照Similarity进行排序 来建立一个Top-N列表,并且取N=50,Top-50列表命名为
[0131] DataSet_Question50,截取了前十条最相关问题,如表2所示:
[0132] 表2:前10条候选问题集
[0133] Rank Question1 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?
[0134] 在得到Top-N这个列表之后,使用LSA模型来排除与其他语义相差过大 的问题项。使用LSA模型之后排除掉了10条语义相差的问题,并把剩下的 40条问题列表命名为DataSet_Question40。其中LSA模型原理的计算公式为:
[0135]
[0136] 其中,U是m×m阶矩阵;∑是半正定m×n阶对角矩阵;而VT是V的共轭 转置矩阵。LSA模型就是把Xm*n缩减为k维的结果。在本发明中,我们为候选 问题生成词矩阵,并通过奇异值分解来减小维数。然后我们通过计算这些问题 的余弦相似度,其中cos由以下公式计算: 排除了一些语义 差异较大的问题。在此步骤中,我们以表2中提取的10个问题为例。通过LSA 模型将这十个问题转换为向量形式。在向量空间中,通过此步骤进行了语义过 滤。图5显示了LDA模型中的10个问题向量空间位置(其中D3和D5位置 相近,文字有部分重叠)。D9和D1之间的向量角明显大于其他问题之间的 夹角,因此我们认为D9是语义差异最大的一个,需要进行排除。在这50个 问题中,我们排除了10条语义相差最大的问题,最后得到DataSet_Question40。
[0137] 接着使用LDA模型生成文档主题并将其处理为标签,帮助开发者更轻松 地查找API。由LDA模型和词频统计的目标词被选作我们的标签。我们筛选 前5个关键词作为我们的标签提供给用户,分别是:array,initilize,string,create, value。
[0138] 然后从DataSet_Question50中检索出满足开发者需要的预选API。检索数 据集DataSet_Question50的答案的超链接,并从该超链接中提取出API信息。 判断HTML中标签之间的部分是否存在于DataSet_SE中,使用字符串 匹配的方式,如果满足标签中50%的数据在DataSet_SE中,从该数据中提取API信息。
[0139] 提取到的API列表,命名为List_API,结合数据库DatabaseQA中 DataSet_Question50所对应的API,形成了一个新的API列表,并命名为 List_APIs。得到的结果如表3所示(节选了5条API):
[0140] 表3:List_APIs中的前5条候选API
[0141]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
[0142] 根据得到的List_APIs,可以在数据集DataSet_SE中找到对应的API。最 后可以根据需要来设定推荐多少条API,本发明把推荐API的条数Rank的值 设置为3,及给开发者最终推荐的是3组API。并可以同时推荐其他内容:Query 标签、API的文本描述、相似问题集和部分代码段。结果最终通过UI界面推 荐给开发者,完成推荐。最终Query的推荐结果如图6所示,节选了其中1 个结果。
[0143] 以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技 术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰, 这些改进和润饰也应视为本发明的保护范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈