一种函数调用序列生成方法和系统与流程

文档序号:14474782阅读:311来源:国知局
一种函数调用序列生成方法和系统与流程
本发明涉及机器学习领域,更具体地,涉及一种函数调用序列生成方法和系统。
背景技术
:随着人工智能的快速发展,机器学习与深度学习研究的持续火热,越来越多的工作集中在机器代码生成领域。机器代码的自动生成,一直是计算机科学和人工智能研究者们追求的目标。虽然目前的很多研究,取得了一定成果,但是还是面临着一些局限,这些局限具体体现在:生成的代码只能解决简单的问题(比如:冒泡排序,加减法等),还难以应对真实的应用需求。大部分的研究集中于领域特定语言的研究中,即大部分的研究者都采用自定义的简单编程语言,让机器学习这些简单单元的统计组合规则,从而实现代码的自动生成。这样带来的局限在于:多样的源代码库没有得到有效利用,然而实际生活中人们开发的程序又是最与实际应用需求相关的。技术实现要素:本发明提供一种克服上述问题的一种函数调用序列生成方法和系统。根据本发明的一个方面,提供一种函数调用序列生成方法,包括:将入口函数输入训练好的序列生成模型中,获取所述入口函数的函数调用序列;其中,所述训练好的序列生成模型通过下述步骤获取:从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图;根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列;将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列;获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。优选地,所述序列生成模型由多个长短时间记忆网络构成,是以时刻和层为维度的二维模型;所述序列生成模型每层的长度相等,每一时刻的长度相等;所述序列生成模型在任一时刻任一层上设有一个长短时间记忆网络。优选地,所述将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列进一步包括:将所述函数表中的任一入口函数输入待训练的序列生成模型,获取一个或多个所述任一入口函数的第一函数调用序列;通过下式获取每一所述一个或多个所述任一入口函数的第一函数调用序列的生成概率:p(s)=p(w1,w2,…wk)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wk|w1,w2,…wk-1)其中,p(s)为生成函数序列s的概率,p(w1,w2,…wk)表示为一个由w1,w2...wk构成的序列的概率,w1,w2,…wk为第k个函数,p(wi|wi-1)为在函数wi-1生成的情况下生成函数wi的概率;将生成概率最大的第一函数调用序列作为所述任一入口函数的训练函数调用序列。优选地,所述从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图进一步包括:根据文档生成工具获取所述开源代码库的帮助文档;提取所述帮助文档中的函数表和所述函数表中多个函数的函数调用关系图;其中,所述函数表中包括多个函数和所述多个函数对应的多个函数信息,所述函数调用关系图用于描述所述多个函数之间的调用关系。优选地,所述函数调用关系图为有向图,所述函数调用关系图中任一节点为所述函数表中的任一函数。优选地,所述文档生成工具为doxygen。优选地,所述入口函数的函数调用序列长度为预设值。根据本发明的另一个方面,提供一种函数调用序列生成系统,包括:获取序列模块,用于将入口函数输入训练好的序列生成模型中,获取所述入口函数的函数调用序列;其中,所述训练好的序列生成模型通过下述子模块获取:代码库获取子模块,用于从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图;对比序列获取子模块,用于基于深度优先搜索的方法,根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列;训练序列获取子模块,用于将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列;获取训练好模型子模块,用于获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。根据本发明的再一个方面,提供一种用于函数调用序列生成的电子设备,包括存储器和处理器,所述处理器和所述存储器通过总线完成相互间的通信;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如上述任一项所述的生成方法。根据本发明的还一个方面,提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行如上述任一项所述的生成方法。本发明提供的一种函数调用序列生成方法和系统,通过设置从开源代码库中获取函数表和函数调用关系图,能够利用多样的代码库提供的数据,使得本发明提供的函数调用序列生成方法更具有实用性。通过深度优先搜索的方法获取对比函数调用序列,能够使得训练好的序列生成模型生成的函数调用序列反映函数间的调用关系。附图说明图1为本发明实施例中的训练好的序列生成模型获取流程图;图2为本发明实施例中的一种函数调用关系图的结构示意图;图3为本发明实施例中的一种通过深度优先搜索构建对比函数调用序列的示意图;图4为本发明实施例中的一种序列生成模型的结构示意图;图5为本发明实施例中的一种从开源代码库中获取相关信息的示意图;图6是示出本发明实施例中的一种用于函数调用序列生成的电子设备的结构框图。具体实施方式下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。本发明实施例基于上述现有技术的问题,提出了一种函数调用序列生成方法。直接从现有的开源代码库出发构建训练集,探索直接基于源代码的机器代码生成任务。同时,考虑到函数作为日常编程中最频繁使用的基本单元,本发明实施例首先从源代码里面的函数入手,通过源代码里面函数间的自动调用组合来实现机器代码生成的任务。本发明实施例提供一种函数调用序列生成方法,包括:将入口函数输入训练好的序列生成模型中,获取所述入口函数的函数调用序列。图1为本发明实施例中的训练好的序列生成模型获取流程图,如图1所示,其中,所述训练好的序列生成模型通过下述步骤获取:从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图;根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列;将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列;获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。具体地,开源代码库优选为github平台。需要说明的是,用于实施本发明实施例中的数据是具有完整性的,完整性指的是整个选定的github平台中的开源项目的代码都用于产生序列生成模型的训练集。利用广域的互联网开源代码资源,可以任意丰富训练集。进一步地,开源代码库里面的函数考虑了各个函数间的功能结构,而这些功能结构能够体现各个函数之间的相互调用关系。可以说,函数直接的内在功能结构决定了函数之间的相互调用关系,而函数间的相互调用关系又能够很好的反映出函数之间的功能结构。具体来说为了学习函数间的内在功能结构,应从开源代码库出发,将这些代码库里面的函数作为基本处理单元,开源代码库是由里面包含的函数通过相互调用组合而成的,那么学习开源代码库里面函数的内在结构,其实就是学习函数间的相互调用关系。函数间的调用关系,可以用有向的函数调用图来简化表示,虽然这种表示省略了一些分支判断和循环信息,但是函数调用图还是能直观的反映出函数间的纯粹调用关系,我们可以通过开源代码库里面函数的函数调用图来学习开源代码里面函数的内在结构。图2为本发明实施例中的一种函数调用关系图的结构示意图,如图2所示,函数调用关系图反应的函数的调用关系是较为复杂的。具体地,开源代码库里面的函数调用关系,虽然可以用函数调用关系图来简化表示,但计算机直接处理这种图结构也还是比较困难的。因此,为了简化计算机处理的难度,本发明实施例首先从函数调用关系图出发,构建函数的调用序列,让计算机通过处理这种函数调用序列来学习函数调用图结构。本发明的实施例中,采用不同的搜索方法,根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列。通过图学习序列,不同的搜索方法包括深度优先,广度优先以及随机游走的方式,不同的方式能够反映函数间的不同调用关系。在本实施例中采用的方式是深度优先搜索的方法,但是理论上本实列支持可使用任意的搜索方式构建。对于深度优先搜索的方法,是从一个函数出发,反应该函数与其他函数的调用关系,可以理解为调用的深度。图3为本发明实施例中的一种通过深度优先搜索构建对比函数调用序列的示意图,本实施例也请参考图3。进一步地,在本实施例提供的函数调用序列生成方法中,所述获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。这一步骤是序列生成模型不断训练的过程,直至对比函数调用序列和训练函数调用序列之间的差距达到预设差距阈值。具体的实施方式是通过损失函数获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距,利用反向传播算法对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。本步骤是在机器学习领域进行模型不断训练的常规方式。本发明提供的一种函数调用序列生成方法,通过设置从开源代码库中获取函数表和函数调用关系图,能够利用多样的代码库提供的数据,使得本发明提供的函数调用序列生成方法更具有实用性。通过深度优先搜索的方法获取对比函数调用序列,能够使得训练好的序列生成模型生成的函数调用序列反映函数间的调用关系。作为一个优选实施例,本发明还可采用广度优先搜索的方法或综合深度广度的随机游走的方法构建对比函数调用序列。对于广度优先搜索,该种搜索方式表现的是从一个函数出发,该函数调用了哪些函数,可以理解为调用的广度。深度上出发,遍历所有的路径,那么所有路径的集合从某种程度上来说也包含了广度上的信息。上述实施例中提出了序列生成模型,本实施例对于序列生成模型做出进一步地解释说明。图4为本发明实施例中的一种序列生成模型的结构示意图,本实施例请参见图4。所述序列生成模型由多个长短时间记忆网络构成,是以时刻和层为维度的二维模型;所述序列生成模型每层的长度相等,每一时刻的长度相等;所述序列生成模型在任一时刻任一层上设有一个长短时间记忆网络。为解决序列问题的数据中序列长度有差距的问题,本领域的技术人员设计了循环神经网络(recurrentneuralnetwork,rnn)来处理序列问题。但是普通的rnn存在两个问题。一是长距离依赖,二是梯度消失和梯度爆炸,这种问题在处理长序列的时候尤为明显。为了解决以上问题,本领域的技术人员提出了长短时间记忆网络(longshort-termmemory,lstm)。这种rnn架构专门用于解决rnn模型的梯度消失和梯度爆炸问题。由三个乘法门控制记忆块的激活状态:输入门(inputgate)、输出门(outputgate)、忘记门又称遗忘门(forgetgate)。这种结构可以使之前输入的信息保存在网络中,并一直向前传递,输入门打开时新的输入才会改变网络中保存的历史状态,输出门打开时保存的历史状态会被访问到,并影响之后的输出,忘记们用于清空之前保存的历史信息。具体地,图4中每一小矩形为一个长短时间记忆网络,本实施例中的序列生成模型优选为两层。序列生成模型的输入量是入口函数。基于上述实施例,所述将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列进一步包括:将所述函数表中的任一入口函数输入待训练的序列生成模型,获取一个或多个所述任一入口函数的第一函数调用序列。通过下式获取每一所述一个或多个所述任一入口函数的第一函数调用序列的生成概率:p(s)=p(w1,w2,…wk)=p(w1)p(w2|w1)p(w3|w1,w2)…p(wk|w1,w2,…wk-1)其中,p(s)为生成函数序列s的概率,p(w1,w2,…wk)表示一个由w1,w2...wk构成的序列的概率,w1,w2,…wk为第k个函数,p(wi|wi-1)为在函数wi-1生成的情况下生成函数wi的概率;将生成概率最大的第一函数调用序列作为所述任一入口函数的训练函数调用序列。基于上述实施例,所述从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图进一步包括:根据文档生成工具获取所述开源代码库的帮助文档;提取所述帮助文档中的函数表和所述函数表中多个函数的函数调用关系图;其中,所述函数表中包括多个函数和所述多个函数对应的多个函数信息,所述函数调用关系图用于描述所述多个函数之间的调用关系。进一步地,所述文档生成工具为doxygen。具体地,doxygen是一种开源跨平台的,以类似javadoc风格描述的文档系统,完全支持c、c++、java、objective-c和idl语言,部分支持php、c#。注释的语法与qt-doc、kdoc和javadoc兼容。doxygen可以从一套归档源文件开始,生成html格式的在线类浏览器,或离线的latex、rtf参考手册。图5为本发明实施例中的一种从开源代码库中获取相关信息的示意图,本实施例请参考图5。图5中表示获取的信息见下表1。表1获取的信息表数据集函数库数目序列数目otb464196286qgis21324256871基于上述实施例,所述函数调用关系图为有向图,所述函数调用关系图中任一节点为所述函数表中的任一函数。举例来说,如果存在节点1指向节点2的边,那么则说明在函数1里面调用了函数2。基于上述实施例,所述入口函数的函数调用序列长度为预设值。下面以一个具体的例子来进一步说明本发明提供的一种函数调用序列生成方法。首先进行数据准备,利用otb的深度优先序列,以及随机游走序列。分别将这两种基础序列数据分为20%的验证数据,20%的测试数据,60%的训练数据,进行本发明实施例提供的函数调用序列生成方法。下面提出两个概念,一是模型生成的平均精度,二是困惑度。其中,模型生成的平均精度的计算公式如下:其中,p表示生成准确的个数,即目标值(targets)与预测值(predictions)对应位置处相同的个数,sum表示总个数,accuracy_mean为模型生成的平均精度。困惑度可以用来衡量序列生成模型的好坏,一般来说,困惑度越小,就表示训练出的模型越好。在我们的实验中,困惑度由下式给出:其中,perplexity为困惑度衡量的模型生成的序列与训练集原有序列的相似程度,n为序列长度,为第i个目标函数出现的概率。获得的本发明实施例中的序列生成模型的模型生成的平均精度和困惑度见下表2:表2模型生成的平均精度和困惑度表数据集合模型生成的平均精度困惑度qgis48.25%85.18otb65.78%14.51序列生成模型训练完成后,生成了三个文本文件:输入值(inputs)、目标标签值(targets)和预测值(predicctions)。部分结果见下表:表3输入值表、目标标签值表和生成值表输入值表22172531915261513224202314943611042314913534261513209436781109436784248411526151322420151322420121104367810311716201836781022172516201819152615132242目标标签值表1725319152615132242023149436704231491353426151320943678100943678424841152615132242012132242012110436781031171620182267810221725162018191526151322420生成值表1725161912129151322420112894367023328912134261513224114367810023436781041411212915132242011132020111109367810311725201822678103117251620183612129151322420对应于上述三个表中的数据,对三个表中的值进行还原,得到入口函数的函数调用序列。输入值:wrt_imwrt_apwrt_hwrt_lossimplugins::details::len<unk>x_rsnegetdimenprint_nes_wsnex_wsnenl_donewrecx_wsnel_writelwrt_adonewreclwrt_ilwrt_lwrt_lwrt_alwrt_cl_writelwrt_llwrt_adonewreclwrt_i<unk>getnamegetnumgetdimenprint_nes_wsnex_wsnel_writelwrt_ilwrt_lwrt_lwrt_awrt_awwrt_glwrt_cl_writelwrt_ilwrt_lwrt_lwrt_awrt_awwrt_gwrt_ewrt_fsignbit_f2c<unk>x_rsnegetdimenprint_nes_wsnex_wsnenl_donewrecx_wsnel_writeprint_nes_wsnex_wsnenl_donewrecx_wsnel_writelwrt_flwrt_cl_writelwrt_lwrt_lwrt_awrt_awwrt_gw_edw_nedwrt_apmv_curwrt_zwrt_iwrt_lwrt_awrt_awwrt_gw_edwrt_imwrt_apwrt_hmv_curwrt_zwrt_iossimplugins::details::len<unk>x_rsnegetdimenprint_nes_wsnex_wsnenl_donewrecx_wsne目标标签值:wrt_apwrt_hwrt_lossimplugins::details::len<unk>x_rsnegetdimenprint_nes_wsnex_wsnenl_donewrecx_wsnel_writelwrt_adonewreclwrt_ilwrt_lwrt_lwrt_awrt_awl_writelwrt_llwrt_adonewreclwrt_i<unk>getnamegetnumgetdimenprint_nes_wsnex_wsnel_writelwrt_ilwrt_lwrt_lwrt_awrt_awwrt_gw_edl_writelwrt_ilwrt_lwrt_lwrt_awrt_awwrt_gwrt_ewrt_fsignbit_f2c<unk>x_rsnegetdimenprint_nes_wsnex_wsnenl_donewrecx_wsnel_writelwrt_fs_wsnex_wsnenl_donewrecx_wsnel_writelwrt_flwrt_cl_writelwrt_lwrt_lwrt_awrt_awwrt_gw_edw_nedwrt_apmv_curwrt_zwrt_iwrt_imwrt_awrt_awwrt_gw_edwrt_imwrt_apwrt_hmv_curwrt_zwrt_iossimplugins::details::len<unk>x_rsnegetdimenprint_nes_wsnex_wsnenl_donewrecx_wsnel_write生成值:wrt_apwrt_hmv_curossimplugins::details::len<unk>e_rslis_rsneprint_nes_wsnex_wsnenl_donewrecx_wsnel_writelwrt_cl_glwrt_ilwrt_lwrt_lwrt_awrt_awl_writelwrt_awrt_ll_glwrt_i<unk>e_rsligetnumgetdimenprint_nes_wsnex_wsnenl_donewreclwrt_clwrt_lwrt_lwrt_awrt_awwrt_gw_edl_writelwrt_alwrt_lwrt_lwrt_awrt_awwrt_gw_edsignbit_f2csignbit_f2c<unk>e_rslis_rsneprint_nes_wsnex_wsnenl_donewrecx_wsnel_writelwrt_cs_wsnex_wsnel_writex_wsnel_writelwrt_clwrt_cl_writelwrt_iwrt_lwrt_awrt_awwrt_gw_edw_nedwrt_apwrt_hwrt_zwrt_iwrt_imwrt_awrt_awwrt_gw_edw_nedwrt_apwrt_hmv_curwrt_zwrt_if__icvt<unk>e_rslis_rsneprint_nes_wsnex_wsnenl_donewrecx_wsnel_write基于上述实施例,本实施例提供一种函数调用序列生成系统,包括:获取序列模块,用于将入口函数输入训练好的序列生成模型中,获取所述入口函数的函数调用序列;其中,所述训练好的序列生成模型通过下述子模块获取:代码库获取子模块,用于从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图;对比序列获取子模块,用于基于深度优先搜索的方法,根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列;训练序列获取子模块,用于将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列;获取训练好模型子模块,用于获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。基于上述实施例,图6是示出本发明实施例中的一种用于函数调用序列生成的电子设备的结构框图。参照图6,所述电子设备包括:处理器(processor)601、存储器(memory)602和总线604;其中,所述处理器601和所述存储器602通过所述总线604完成相互间的通信;所述处理器601用于调用所述存储器602中的程序指令,以执行上述各生成方法实施例所提供的方法,例如包括:将入口函数输入训练好的序列生成模型中,获取所述入口函数的函数调用序列;其中,所述训练好的序列生成模型通过下述步骤获取:从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图;基于深度优先搜索的方法,根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列;将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列;获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。基于上述实施例,本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:将入口函数输入训练好的序列生成模型中,获取所述入口函数的函数调用序列;其中,所述训练好的序列生成模型通过下述步骤获取:从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图;基于深度优先搜索的方法,根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列;将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列;获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。基于上述实施例,本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:将入口函数输入训练好的序列生成模型中,获取所述入口函数的函数调用序列;其中,所述训练好的序列生成模型通过下述步骤获取:从开源代码库中获取函数表和所述函数表中多个函数的函数调用关系图;基于深度优先搜索的方法,根据所述函数调用关系图构建所述函数表中每一入口函数的对比函数调用序列;将所述函数表中的任一入口函数输入待训练的序列生成模型,获取所述任一入口函数的训练函数调用序列;获取所述任一入口函数的训练函数调用序列与所述任一入口函数的对比函数调用序列之间的差距,并基于所述差距对所述序列生成模型的输入量进行更新,循环执行上一步骤,直至所述差距低于预设差距阈值,获取所述训练好的序列生成模型。本发明提供的一种函数调用序列生成方法和系统,通过设置从开源代码库中获取函数表和函数调用关系图,能够利用多样的代码库提供的数据,使得本发明提供的函数调用序列生成方法更具有实用性。通过深度优先搜索的方法获取对比函数调用序列,能够使得训练好的序列生成模型生成的函数调用序列反映函数间的调用关系。最后,本发明的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1