基于扩展查询和自然语言处理的代码检索技术探讨

论文价格:150元/篇 论文用途:硕士毕业论文 Master Thesis 编辑:硕博论文网 点击次数:
论文字数:28566 论文编号:sb2022062016460248570 日期:2022-06-26 来源:硕博论文网

本文是一篇软件工程论文,本文 BERT 模型基于多层 Transformer 构建而成,该模型既能处理自然语言又能处理程序语言,它可以捕捉自然语言和程序语言间的语义连接,从而实现自然语言检索代码片段。
第一章 绪论
1.1研究背景及意义
在软件开发过程中,开发人员通常会被分配到各种编程任务,例如使用 Lucene 建立索引库以及数据库查询等。一个开发人员遇到的编程任务可能已经被其他开发人员遇到[1],所以遇到类似的问题开发人员通常会向其他开发人员寻求帮助,以便寻求潜在的解决方案,通常为用于说明如何实现编程任务的代码示例。为了从广大开发人员社区中获得潜在的解决方案,开发人员经常在开放问答社区中提出编程问题(例如 Stack  Overflow、CSDN),并且此类问题大多以自然语言的形式呈现,所以通过自然语言检索代码示例就显得尤为重要。一个项目的开发通常会遇到不同编程任务,并且有些任务的解决方案需要多位开发人员的共同协作完成,开发人员通常会遇到需要调用其他开发人员编写的代码,所以在软件开发过程中通过自然语言检索当前代码仓库中的代码示例同样显得十分重要,可以帮助开发人员获得当前代码仓库中潜在的解决方案。在项目交接过程中需要理解项目源代码的功能,通过自然语言检索代码片段可以更快的定位并理解源代码的功能,加快了运维人员理解代码的速度[2],降低了项目维护的难度。
为了解决上述问题,缓解开发人员在软件开发过程中完成不同编程任务的压力,现有研究人员通过信息检索、自然语言处理等方式来实现自然语言检索代码示例。现有自然语言检索代码示例的方法有很多,通过信息检索技术来实现代码示例检索是最常见的方法[3]。信息检索组成部分主要有:预处理查询、构建文档集合、计算查询与文档的相关度、展示排序结果。其中查询与文档的匹配性计算可以公式化为马可夫决策过程[4],将隐式的用户反馈(例如点击次数,停留时间)作为排名的奖励,并且通过强化学习算法动态调整特征权重,最终进行加权计算排序。但是如果用户反馈不准确时,无法获取用户真实意图;还有通过扩展语义相似的 API 类名来进行代码示例检索,首先应用连续袋词模型来学习 API 类名的向量表示,然后使用学习到的术语向量来计算初始查询和 API 类名之间的语义距离,最后选择与语义最相关的 API 类名以扩展初始查询。但是这种方法会产生干扰查询的 API 类名[5],同时这两种方法都是通过自然语言检索代码示例,开发人员检索到了代码示例还需要花费时间将其应用到项目中,如果直接在当前项目或者其他类似的代码仓库中检索相似编程任务提交的代码,将会帮助开发人员获取更加完整且可用的代码示例。
.........................
1.2国内外研究现状
在软件开发过程中,开发人员可以通过在 Stack Overflow、CSDN 等开放问答社区中检索编程问题,也可以使用 Bing 和 Koders 这两个代码搜索引擎,直接检索给定关键字的源代码片段,但这些关键字通常是类和方法名称这样的标识符,例如在 Bing 上搜索“How  to  use   math  function  of  R”,便会得到 R 语言相关代码[7]。目前已经提出了许多方法[8-10]来帮助开发人员搜索相关的代码示例,在现代各种代码示例检索方式和方法的情况下,研究代码检索先得探讨一个问题:什么是代码检索?这样的问题该如何去定义。Sadowski[11]等人针对软件开发人员的开发习惯通过跟踪开发人员的检索行为以及分析系统查询日志等方式进行研究。根据开发人员在代码检索时提出了什么样的问题和使用何种搜索模式进行检索,将代码检索相关研究描述为多个研究问题并给出了相应的结论,本文结合其中的三个问题进行研究:开发人员为什么进行代码检索、代码检索的发展历程以及代码检索研究框架。
开发者为什么进行代码检索。按照信息需求的不同将代码检索分为搜寻代码示例、搜寻解释文档、搜寻错误信息、浏览或者阅读代码和识别代码信息五种情况。搜寻代码示例,开发人员遇到编程任务后需要寻求潜在的解决方案,通常为用于说明如何实现编程任务的代码示例。代码示例一般为某种程序语言的库函数、模块、包、API 或者某项算法等等;搜寻解释文档,已知完成编程任务需要用到某种算法,但是对于此类算法的参数及应用缺乏必要的了解,所以开发人员需要针对算法、API 相关文档进行检索;搜寻错误信息,在完成编程任务后,开发人员通常需要进行测试,此时可能会遇到编译器报出的各种错误信息,为了排查错误信息解决相关问题,开发人员往往会对相关错误信息进行检索;浏览或者阅读代码,在软件开发过程中,开发者需要对类、方法以及变量的定义、初始化、使用跟释放位置进行定位,从而更好的了解软件项目的整体架构,方便开发人员后期的 BUG 修改和项目维护;识别代码信息,在软件开发过程中,需要对代码进行同行互审和代码修改的责任划分,因此有必要在代码提交历史中进行搜索和跟踪,以促进项目管理。综上所述,开发人员在实际软件开发活动中不可避免地会使用到代码检索,而且这个过程并不只是简单的 Ad-hoc(点对点)式的,我们需要根据开发人员的实际需求构建一个代码搜索引擎。
..............................
第二章 相关背景知识介绍
2.1代码仓库
Git 目前最流行的分布式版本控制系统是 Git [21]。Git 的特点是采用分布式版本库管理,而不需要服务器端软件的支持,这样使得源代码的发布和交流的过程极大的简化了。在分布式版本库管理下,可以通过镜像出来的本地仓库恢复远程的代码仓库来解决代码仓库发生故障的问题。分布式版本控制系统中的每次提交操作都会进行一次备份[22],此外相对独立的版本控制系统之间可以相互通信,从而一定程度上解决了离线提交和单一节点故障等问题。下面将详细介绍 Git 中的 PR 开发模式和本文中使用的代码仓库分析工具 JGit。
2.1.1 Fork 与 Pull Request 开发模式
Git 中的工程项目开发最常用的方式为 Fork 与 PR 模式[23]。Fork 与 PR 开发模式的特点是开发者不需要向项目维护者申请提交权限,而是先在自己的托管空间中派生(Fork)当前工程项目,Git 中项目的派生是项目可能正在壮大的体现。其中派生项目都会指向原始项目,派生项目中没有相应的缺陷追踪系统(ISSUE),所以需要利用开发人员自己项目中的缺陷追踪系统,可以通过使用 Git 的 PR 工具向原始项目的维护者发起 PR 请求。

软件工程论文怎么写
软件工程论文怎么写

......................
2.2自然语言处理
语义表示是自然语言处理的基础,先将文本数据转换为计算机理解的语义表示,再将其应用到自然语言处理任务中。表示学习可以自动的从大规模数据中挖掘数据的语义特征,不像传统方法需要人工构建特征,支持机器学习的训练以及预测。表示学习可以对大规模的文本及图像等无结构数据的语义进行表示,其中文本表示方法主要分为离散表示和分布式表示。由于深度学习在自然语言处理任务中表现出色,基于神经网络的代码检索模型得到越来越多的关注和研究。
2.2.1 文本离散表示
One-hot 编码是自然语言处理中最常用、最传统的词特征表示方法,使用二进制方式对文本内容进行编码,即每一个词特征都被表示成一个很长的向量,其长度等于词表大小,当前词对应位置为 1,其他位置为 0。不难看出,One-hot 编码只能反映每个词是否出现,但无法突出词之间重要性的区别,并且不同的词之间总是正交的,无法衡量不同词之间的相似关系。
词袋模型则将字符串视为一个装满词语的袋子,并且袋子内的词语是随意摆放的,通过比较它们重合的词以及相关分布来判断两个袋子的相似程度[26]。词袋模型的准确率往往较低,在文本中出现的词都一视同仁,无法体现出不同词在一句话中重要性的不同,并且无法关注词语之间的顺序关系,这是便是词袋模型的最大的缺点。
TF-IDF 对词袋模型进行改进,不仅考虑词语是否出现,还考虑词语出现的次数或者频率,通过对词的频率针对整个文本长度来进行归一化,然后计算词在整个文本中所占的比例得到词频(Term  Frequency,  TF)。假设如果一个词语在不同的文档中频繁地出现,例如“我们”、“那么”、“他”之类副词、人称代词,并不能从这些高频词中提取某一文本特征,这类词对于识别该文本并不重要。因此需要针对词的出现情况,在整个文本集合对词进行归一化,降低文本中都存在的且不具有文本特征的常用词权重,即逆文档频率(Inverse  Document Frequency, IDF)。
............................
第三章  基于扩展查询和 CBOW 模型的代码检索 ........................... 13
3.1研究动机 ........................................ 13
3.2基于扩展查询和 CBOW 模型的代码检索方法 .......................... 14 
第四章  基于扩展查询和 BERT 模型的代码检索 .............................. 29
4.1研究动机 .................................... 29
4.2基于扩展查询和 BERT 模型的代码检索方法 ............. 29
第五章  代码检索系统..................................... 35
5.1需求分析 ................................ 35
5.2系统总体设计.......................... 35
第五章 代码检索系统
5.1需求分析
在软件开发的过程中,项目中的开发人员通常会面临无从下手的开发任务,此时开发人员往往会去开源社区提问或者借鉴其它项目中此类任务的具体代码实现,由此可见代码检索的研究对实际软件开发有着重大的意义,实现代码检索系统不仅可以检验本文相关研究的成果,还能为开发人员提供一个能够为编程任务提供潜在解决方案。

软件工程论文参考
软件工程论文参考

代码检索系统需求主要由架构设计需求和运行环境需求构成。架构设计需求包括了代码检系统设计中的部分需求的制定,设计并实现自然语言检索程序语言的代码检索系统,基于浏览器/服务器(B/S)架构[50],前端对用户输入的自然语言进行并处理传输给后端,后端对自然语言进行检索并将结果以 Json 格式返回给前端,由于 Json 格式的代码片段不方便开发人员审阅,所以前端需要以开发人员习惯的代码格式对 Json 格式的代码片段进行格式化渲染。系统所面向的用户主要为软件开发人员,所以在软件设计时需要有友好的交互界面并且要保证在不同的 PC 端的浏览器上都能正常访问,但是由于数据库中的代码片段数量较多,所以响应请求的时间会有一点延迟是可以接受的。系统运行需求主要有系统开发成本、系统开发部署环境以及故障容忍时间。系统部署在结合 Java 和 Python 版本的 Linux 系统中,并结合Elasticsearch、Lucene 等支持性应用程序实现检索系统后端,而前端则是通过 Webpage 打包并配置 Nginx 服务器进行前端静态资源的访问,并使用 Nginx 做反向代理将请求发送给后端进行数据交互。本节针对码检索系统的架构设计需求和运行环境需求进行总结与分析,接下来将详细描述代码检索系统的设计与实现。
.........................
第六章 总结与展望
6.1总结
本文研究了基于扩展查询和自然语言处理的代码检索方法,首先介绍在代码检索领域的研究工作,结合代码检索的发展历程,针对软件工程阶段、信息检索阶段以及深度学习阶段进行描述。然后介绍了本文所使用的技术,主要包含 Git 中 Fork 与 PR 开发模式、JGit 分析工具、自然语言处理技术。最后详细介绍了从代码仓库提取 PR 信息并进行预处理的过程,通过提取 PR 信息向量表示、扩展自然语言查询、执行查询这三个步骤来具体描述基于扩展查询和 CBOW 模型的代码检索方法。本文将神经网络语言模型和代码仓库数据预处理相结合,扩展具有语义相关的 PR 信息的自然语言查询。将每次完成编程任务成功提交的代码片段作为类似编程任务潜在的解决方案,避免了代码质量良莠不齐的问题,而且开发人员可以直接将其应用到项目中,减少了人工筛选所花费的时间。
接下来介绍一种基于扩展查询和 BERT 模型的代码检索方法,提出一种 BERT 预处理模型,进行遮蔽语言建模、替换令牌检测以及微调,将 BERT 应用到自然语言检索代码片段的任务上。本文 BERT 模型基于多层 Transformer 构建而成,该模型既能处理自然语言又能处理程序语言,它可以捕捉自然语言和程序语言间的语义连接,从而实现自然语言检索代码片段。
最后介绍了代码检索系统,本文在代码检索研究框架的基础上开发了具有一定可用性的代码检索系统。其中代码检索系统主要包含数据源采集与预处理、自然语言查询与意图识别、自然语言查询与代码片段特征抽取、自然语言查询与代码片段的匹配性计算以及加权排序和交互反馈等五个模块。本文从系统环境、前端设计、后端设计、数据库设计等四个方面对代码检索系统设计进行详细描述。
参考文献(略)


如果您有论文相关需求,可以通过下面的方式联系我们
点击联系客服
QQ 1429724474 电话 18964107217