一种获取开源代码库中函数的向量的方法和系统与流程

文档序号:11432100阅读:178来源:国知局
一种获取开源代码库中函数的向量的方法和系统与流程
本发明涉及通信
技术领域
,更具体地,涉及获取开源代码库中函数的向量的方法和系统。
背景技术
:目前空间信息服务正处于高速发展的时期,基于多源空间信息的服务已经逐渐深入到人们的日常生活中,同时各种基于空间信息的服务软件,开源项目在近年来也是层出不穷。至今为止,各行各业的人们在开源社区都为空间信息服务的系统或软件贡献了自己的力量,在互联网上形成了活跃的开发社区,同时也构建了丰富的开源代码库。这些开源的代码库,他们的规模大小不一,开发语言不同,应用的范围也不同。开源社区的发展极大的推动了空间信息服务的蓬勃发展,大部分应用都是基于上述的开源代码库来进行开发并构建自己的系统,大家在进行开发时必须要考虑的问题就是如何选取合适的api来构建自己的服务系统,要实现某种功能需要调用哪些函数,这些函数的调用序列,调用关系是怎样的?如果能够解决这些问题,基于现有的强大的开源代码库,人们就能够很轻松的构建出自己想要的空间信息服务。如何根据现有的函数调用关系和应用需求,做到源程序里面函数的自动的组合用以实现本发明的功能需求,是目前急需解决的问题。技术实现要素:本发明提供一种克服上述问题或者至少部分地解决上述问题的获取开源代码库中函数的向量的方法和系统。根据本发明的一个方面,提供一种获取开源代码库中函数的向量的方法,包括:s1、提取开源代码库中的函数调用图,所述函数调用图用于描述各函数间的调用关系;s2、基于随机漫步模型,获得所述函数调用图中各函数的函数调用序列;以及s3、将所述函数调用序列作为嵌入模型的输入项,获得各函数的向量。根据本发明的另一个方面,提供一种获取开源代码库中函数的向量的系统,包括:调用图模块,用于提取开源代码库中的函数调用图,所述函数调用图用于描述各函数间的调用关系;调用序列模型,用于基于随机漫步模型,获得所述函数调用图中各函数的函数调用序列;以及向量模块,用于将所述函数调用序列作为嵌入模型的输入项,获得各函数的向量。本申请提出通过开源代码学习出函数的有效向量表示,通过引入该种嵌入表达,能够有效的提升目前机器自动代码生成模型的通用性和实用性。附图说明图1为根据本发明实施例的获取开源代码库中函数的向量的流程示意图;图2为根据本发明实施例的函数向量可视化示意图。具体实施方式下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。图1示出了本发明实施例的获取开源代码库中函数的向量的流程示意图,如图可知,包括以下三个步骤:s1、提取开源代码库中的函数调用图,所述函数调用图用于描述各函数间的调用关系;s2、基于随机漫步模型,获得所述函数调用图中各函数的函数调用序列;以及s3、将所述函数调用序列作为嵌入模型的输入项,获得各函数的向量。本发明通过开源代码学习出函数的有效向量表示,通过引入该种嵌入表达,能够有效的提升目前机器自动代码生成模型的通用性和实用性。由于开源代码库里面包括了源代码和注释信息,从源代码里面可以提取出函数的调用图等信息,其数据量大,信息丰富,成本低廉,以及现势性强的特点使其蕴含着极大的发展潜力与应用价值。在一个实施例中,基于文档生成工具,获得所述开源代码库的帮助信息文档,所述帮助信息文档中包括函数信息、函数调用图信息以及函数注释信息。在一个实施例中,所述文档生成工具为doxygen文档生成器。函数的调用关系可以用一个有向图来表示,图的特征表示不同于自然语言的单词序列,后者可以理解为一维的序列,而对于图不同的搜索方式会生成不同的序列,他包括深度和广度两个维度的特征。node2vec的工作采用随机漫步的方式综合了图的这两个维度的特征,word2vec是自然语言处理的一个方法,他能有效的捕获单词序列间的关系,学习出有效的单词向量表示。由于函数调用图的深度优先和广度优先搜索方式会构建完全不同的序列,而这势必会影响后续步骤的准确度,因此,本发明通过随机漫步方法获得函数调用序列。通过随机漫步能够综合有向图结构里面的深度和广度两个方向的特征,由此得到的函数调用序列更能表达函数调用图结构的特征。在一个实施例中,随机漫步方法具有以下形式:其中,ci表示第i个节点,x和v分别表示函数调用图中的x函数和v函数,p(ci=x|ci-1=v)表示最终计算出的相邻两个时刻节点由v函数转移至x函数的概率,πvx表示随机漫步下,相邻两个时刻节点由v函数转移至x函数的概率,e表示节点边的结合,z是固定的常数。函数调用序列中的第一个节点即为函数调用图中的起始点,随后的每一个节点,均为对前一个节点而言转移概率最大的节点,当漫步长度满足要求时,即完成函数调用序列的构建。对于πvx,满足:πvx=αpq(t,x)·wvx,该等式中wvx表示节点v到节点x的边(v,x)的权重,由于本发明中的节点边没有权重,因此所有的权重均为1。αpq(t,x)表示节点由v函数转移至x函数的概率。αpq(t,x)满足:dtx表示节点t与x之间的最短距离l∈{0,1,2},p与q是人为设定的参数,其中参数p为抽样参数,参数p的大小可以控制回溯(从节点t转移到v再从v转移回t)的概率,将参数p设置为高值(≥max(q,1))可以确保本发明不大可能在接下来的步骤中对已访问的节点进行抽样(鼓励探索),反之取低值(≤min(q,1))的话则可能出现回溯(访问已访问过的节点)。当p设置为高值的话,那么这个公式的第一项1/p的值就小,那么就是它对应的概率低,就是dtx=0的节点被访问的概率低,而dtx=0的节点就是已经访问过的。参数q为回溯参数,用于控制游走偏向于深度优先还是广度优先的。dtx=1指的是广度优先的节点,dtx=2指的是深度优先的节点,dtx=0指的是回溯的节点。如果q>1,则显然第二项(1)大于第一项(1/p),即dtx=1的节点转移概率大于dtx=2的节点,即广度优先的概率大于深度优先的节点。反正如果q<1,则第三项(1/q)大于第二项(1),即深度优先的节点概率比广度优先的节点高在一个实施例中,对于已获得的函数调用序列,采用sgns(skip-gramwithnegativesampling)模型获得每个函数和它的上下文之间的关系。给定一个长度为k的单词序列,wi表示序列中的第i个函数,所有函数构成的词库为w,则sgns模型是为了将下式最大化:上式中,c表示上下文窗口的一半大小,例如,在函数调用序列中取一个函数的前、后各5个函数,则上下文窗口为10,c为5。p(wj|wi)的计算公式为:本发明采用负采样(negativesampling)的方式计算p(wj|wi),p(wj|wi)中(wi,wj)这个数据对称之为一个样本,指的是在wi的上下文是wj概率,n表示负采样的数目,pn(w)表示噪声分布(noisedistribution),噪声分布为负样本的概率分布,在训练sgns模型时,目的是增大正样本出现的概率(即的概率),同时减少负样本的概率(即的概率),通过最大化上式,本发明训练模型,得到函数的向量。为了验证本发明的准确性,结合实施例对本发明进行描述。实施例1实验说明主要是从函数的功能以及函数间的调用关系两方面对得到的函数向量进行评价。本发明的实验主要是回答两个问题:一是函数的向量表示是否具有潜在的函数功能表达;二是函数的向量表示能否(多大程度上)体现函数之间的调用关系。从otb,qgis,以及orfeotoolbox(orfeotoolbox包括了otb以及一些其他的工具,如)等开源代码库出发,利用文档生成工具获取其函数名与函数调用图信息,分别用上述模型产生对应库的函数向量。接下来分别从验证功能潜在表达与函数调用分析两个方面来阐述。对于功能潜在表达方面基于otb的开源代码,得到otb的函数向量之后,利用t-sne进行降维可视化。根据可视化的结果本发明选取了三块‘聚类’比较明显的区域,分别从这三块区域里面,随机选取10个函数,打印出他的函数名,验证每个区域内的函数是不是具有相同或者相似的功能。图2示出了根据本发明实施例获得的函数向量可视化图,横、纵坐标的含义都是这函数向量的坐标,每个函数都用一个128维的向量来表示,通过t-sne的可视化技术来将128维的向量降为2维,横纵坐标表示的就是函数向量的x坐标和y坐标,如图可知,不同的区域里面的函数的主要功能也是不同的,比如中部大方框中函数主要是一些参数设置方法,上部的圆框中函数的主要功能是数据初始转换,下部小方块主要是一些图像处理的方法。由此,本发明的嵌入表示能够将功能相近的函数‘聚集’在一块儿,换句话说本发明的函数向量表示具有潜在的功能表达。对于函数调用分析方面为了分析向量表示对函数调用关系的反映程度,针对嵌入后的函数和与其向量距离最近的函数,主要考虑三个问题:1、他们在调用关系和‘上下文’方面有没有相应联系。即距离近的函数对,他们之间相互调用概率如何?2、他们被相同函数调用的概率如何(邻域)?3、他们之间的包含有相同(不全相等)调用‘上下文’的概率如何?针对上述考虑的三个问题,本发明设计了三个实验指标:1、distant_c:如果数据中存在从函数id1至函数id2的调用路径,或者存在从函数id2到id1的调用路径那么distant+=1,即统计id1与id2之间存在调用或被调用关系的频次(深度)。2、neighbor_l:统计数据中邻域同时包含节点id1和id2的节点的数目,邻域的定义指的是所有与这个节点直接连接的节点。即统计函数id1与id2被同一个函数调用的频次(广度)。3、neighbor_contain_l:节点id1与id2的邻域如果存在相同的节点,那么negihbor_contain_l+=1,即统计节点id1与id2的‘上下文’包含有相同节点的频次。即探究聚在一起的函数有没有相同上下文。其中id1指的是从函数库里面随机选取的函数,id2指的是根据嵌入训练后得到的函数向量表示计算出来的与id1最相似的几个函数(top_5或者top_2)。具体来说本发明每一批次都从函数库里面随机选取50个函数id1,分别计算距其距离最近的5个函数(top_5注:top_2为2个函数)id2(只选取相似度>0.92的)每一个id1对应着10个id2,那么一共有:50*5=250个id1至id2的序列对(top_5)50*2=100个id1至id2的序列对(top_2)每次实验都进行10个批次,每一个数据进行10次实验。实验数据包括otb,qgis与orfeotoolbox的嵌入后的函数向量。实验结果如下:top_2平均精度对比,如表1所示:精度计算方式为指标数值除以节点对的个数(50*2)表1top_2平均精度对比表otbqgisorfeotoolboxdistant_c20.84%19.28%35.70%neighbor_l8.67%9.4%7.9%neighbor_contain_l38.82%39.78%32.42%top_5平均精度对比,如表2所示:精度计算方式为指标数值除以节点对的个数(50*5)表2top_5平均精度对比表otbqgisorfeotoolboxdistant_c19.67%17.20%33.80%neighbor_l4.50%4%4.1%neighbor_contain_l36.70%35.80%29.83%由以上结果可以看出,指标distance_c在otb与qgis库里面都偏低平均只有18%,但是在orfeotoolbox里却达到了33.80%,可能的原因是orfeotoolbox(https://github.com/orfeotoolbox)里面是otb与otb的一些应用工具的集合(如:otbexternalmoduletemplate,ice,monteverdi等)里面函数间调用关系比较强;通过上述分析,发现得到的向量表示在一定程度上能够表达出函数之间的调用关系。其中他们之间相互调用的概率接近与20%,被相同函数调用的概率top_5在4%-5%之间,top_2在8%到10%之间,包含有相同但是不全相等的调用‘上下文’的概率平均在33%左右。neighbor_contain_l指标相对其他指标都较高,说明此方法对邻域信息捕获得较强。总的来说,top_5的精度要比top_2的略低,说明top_5的话会带来信息的冗余。反之top_2的精度高于top_5某种程度上也说明距离越近,指标精度越高。根据本发明的另一个方面,提供一种获取开源代码库中函数的向量的系统,包括:调用图模块,用于提取开源代码库中的函数调用图,所述函数调用图用于描述各函数间的调用关系;调用序列模型,用于基于随机漫步模型,获得所述函数调用图中各函数的函数调用序列;以及向量模块,用于将所述函数调用序列作为嵌入模型的输入项,获得各函数的向量。最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1