[发明专利]一种基于抽象语法树节点变更抽取的Python代码变更提示方法有效
申请号: | 201510555635.2 | 申请日: | 2015-09-01 |
公开(公告)号: | CN105159715B | 公开(公告)日: | 2018-07-20 |
发明(设计)人: | 陈林;林薇;陈芝菲;徐宝文 | 申请(专利权)人: | 南京大学 |
主分类号: | G06F9/445 | 分类号: | G06F9/445;G06F17/30 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 210023 江苏*** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | 本发明提供一种基于抽象语法树节点变更抽取的Python代码变更提示方法,包括下列步骤:1)获取同一软件不同版本程序的源代码;2)生成两个版本的源程序对应的抽象语法树;3)匹配抽象语法树获取变更节点,结合变更节点上下文信息标记节点变更类型;4)将变更元组聚集为事务,构造训练集;5)利用数据挖掘技术,挖掘变更元组中的关联关系;6)根据挖掘出的关联关系,提示开发人员程序中可能出现变更的位置和可能的变更类型。本发明解决了目前存在的缺乏针对Python语言的软件演化分析、无法提示可能的代码变更类型等问题,进而指导软件生命周期的管理,提高软件演化的可控性,从而能更好地控制软件产品的质量。 | ||
搜索关键词: | 一种 基于 抽象 语法 节点 变更 抽取 python 代码 提示 方法 | ||
【主权项】:
1.一种基于抽象语法树节点变更抽取的Python代码变更提示方法,其特征在于,从软件版本控制系统中获取同一Python软件两个不同版本的源程序代码,生成两个版本源程序对应的抽象语法树,匹配抽象语法树,寻找发生变更的节点并获取其上下文信息,结合对变更节点执行的插入、删除和更新三种基本树编辑操作,标记节点变更类型,并利用变更信息构造训练集,通过数据挖掘技术挖掘变更信息间的关联规则,根据节点的关联关系及变更类型间的关联关系为程序变更提供辅助信息;该方法包括下列步骤:1)获取同一软件不同版本程序的源代码;CVS版本控制系统中保存了一个程序所有版本的提交,根据文件名和版本号,从软件版本控制系统中获取同一软件不同版本程序的源代码;定义1:文件名和版本号是软件版本控制系统中用于区分不同软件或同一软件不同版本的标识;2)生成软件两个版本源程序对应的抽象语法树;对步骤1)中已经收集好的同一软件不同版本程序的源代码进行词法分析和语法分析,利用Python标准库中的ast模块生成两个版本程序对应的抽象语法树,并对每个节点设置label和value,标识节点类型和内容,同时设置节点标识符;定义1:抽象语法树是源代码抽象语法结构的树状表现形式,每个节点代表源代码中的一种结构;定义2:Python标准库随Python语言一起发行,包含了诸多能提供系统级功能访问的内建模块;定义3:ast模块是Python标准库中的一个模块,帮助解析Python抽象语法;定义4:label表示抽象语法树中节点的类型,类型信息来自Python抽象语法;定义5:value表示节点的内容,中间节点的value依赖于其label,叶子节点的value即语句的文本表示;定义6:节点标识符用于唯一标识节点,每个节点不同;3)匹配抽象语法树获取变更节点,结合变更节点上下文信息标记变更类型;后序遍历步骤2)中生成的两个版本源程序的抽象语法树,依次匹配各个对应节点,寻找其中发生变更的节点,获取变更节点上下文信息,并结合对变更节点执行的基本树编辑操作,标记节点的变更类型,对于每一个发生变更的节点,用元组δ=(节点标识符,变更类型)记录其变更情况;定义1:匹配叶子节点时,当且仅当两个叶子节点的label相同且value的字符串相似度大于阈值f时,两个节点匹配成功,否则匹配失败,记录对该节点执行的基本树编辑操作类型;本发明采用2‑Grams字符串相似性度量方法计算value的相似性,设定的阈值f为0.6;定义2:中间节点可以看作子树的根节点,匹配中间节点时,计算以该中间节点为根的子树中,匹配成功的叶子节点数占叶子节点总数的比例σ及中间节点value的相似度siminner,当σ大于阈值t且siminner大于阈值f时,中间节点匹配成功,否则匹配失败,记录对该节点执行的基本树编辑操作类型;阈值f的大小设定为0.6,阈值t的大小随着子树规模动态调整:n>4时,t=0.6,n≤4时,t=0.4,其中n为子树包含的叶子节点数;定义3:源代码被转化为抽象语法树,因此其变更操作对应了基本的树编辑操作;定义4:基本树编辑操作是指对树形结构进行的基本操作,包括插入、删除和更新;定义5:变更节点上下文信息包括变更节点自身的label及其父节点的label;定义6:标记节点变更类型时,根据获取的变更节点上下文信息,并结合对变更节点执行的基本树编辑操作,得出对节点变更的描述;变更节点的label或者变更节点父节点的label用于标记代码的变更类型;4)将变更元组聚集为事务,生成训练集;元组δ=(节点标识符,变更类型)记录了程序中的变更信息,将记录两个版本间变更情况的元组序列聚集为一个事务Δ,保存在数据库中,构造训练集a和b;定义1:元组序列C={δ1,δ2,...,δn}记录了程序的两个版本pi和pi+1间的变更,将元组序列C聚集为事务,有其中,运算符表示变更操作,n表示两个版本间变更的次数,i表示版本序列;定义2:利用事务集合T={Δ1,Δ2,...,Δn},构造训练集a,Δi是其中的一条训练数据,其中n为事务个数,1≤i≤n;定义3:获取多个Python程序的训练集{a1,a2,...,an},对于ai中的一条训练数据,抽取其中包含的变更类型信息,得到序列C′={变更类型1,变更类型2,...,变更类型m},将序列C′聚集为事务Δ′,利用事务集合T′={Δ1′,Δ2′,...,Δn′}构造新的训练数据集b,其中n为训练数据条数,m为一条训练数据的变更个数;5)利用数据挖掘技术,挖掘变更元组集合中的频繁项集,由此生成关联规则;扫描训练集a和b,采用FP‑growth算法挖掘变更元组集合中的频繁项集,根据频繁项集生成变更元组间的关联规则及变更类型间的关联规则,从而从程序变更的历史信息中得出关联代码和关联变更类型;定义1:FP‑growth算法是数据挖掘领域一种著名的用于挖掘频繁项集的模式增长方法,由长度为1的频繁模式开始构造条件模式基,然后构造它的条件FP树,递归地在该树上进行挖掘,从而发现频繁项集;定义2:关联规则是形如的蕴含式,对于程序中所有项个数m,项的集合I={I1,I2,...,Im},并且定义3:根据挖掘出的频繁项集,产生满足最小支持度和最小置信度的强关联规则;对于置信度可以用如下公式计算:条件概率P(A|B)用项集的支持度计数表示,其中,support_count(A∪B)是包含项集A∪B的事务数,而support_count(A)是包含项集A的事务数。根据该式,关联规则可以产生如下:●对于每个频繁项集l,产生l的所有非空子集;●对于l的每个非空子集s,如果则输出规则其中,l‑s包含了l中除s外的所有项集,min_conf是最小置信度阈值。定义4:我们认为常常同时发生变更的节点是关联的;定义5:我们认为常常同时发生的变更类型是关联的;6)根据挖掘出的关联代码和关联变更类型,提示开发人员程序中可能出现变更的位置和可能的变更类型;对于变更历史信息包含在训练样本中的待测Python程序,根据挖掘出的变更元组间的关联关系,当程序发生新的变更时,提示与此变更相关联的可能的变更位置及变更类型;对于变更历史信息未包含在训练样本中的待测Python程序,根据挖掘出的变更类型之间的关联关系,当程序发生新的变更时,提示与此变更相关联的可能的变更类型。
下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京大学,未经南京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/patent/201510555635.2/,转载请声明来源钻瓜专利网。