一种缺陷报告与邮件列表语义关联挖掘方法与流程

文档序号:11155305阅读:324来源:国知局
一种缺陷报告与邮件列表语义关联挖掘方法与制造工艺
本发明用于软件复用过程中,挖掘缺陷报告与邮件列表语义关联关系,降低开发人员搜索、阅读及学习负担。
背景技术
:软件开发过程中,软件复用希望能够充分利用过去应用系统开发中积累的知识和经验,避免重复劳动,并将开发的重点集中于应用的特有的构成成分,提高软件开发效率和质量。近年来,互联网涌现出大量的开源项目托管站点,越来越多的优质软件出现在开发视野当中。在这些项目中,不仅仅给我们提供了丰富的代码资源,同时,一些优秀的、成熟开源项目产生了大量的、多种形式的文档。缺陷报告和邮件列表就是其中的两种。这些文档不仅仅是项目开发人员的开发记录和交流方式,更为其他开发人员提供了学习、复用这些项目的途径。作为常见的两种项目文档:缺陷报告和邮件列表,为软件开发人员提供了宝贵的复用资源的同时,也讨论并记录了开发人员遇到的问题。然而,随着开源项目规模的增大,开发人员遇到的问题也日益复杂化,问题的答案已经不能够通过单一类型文档找到答案。例如,根据邮件列表中的讨论了解问题场景以及社区成员的建议,根据缺陷报告中的补丁查看解决问题的方法与受影响的代码模块等。缺陷报告与邮件列表蕴含着丰富的软件项目信息,给开发人员带来了极大的便利。但这些文档的一些特点,也给开发人员带了学习、复用的障碍,主要有:一、缺陷报告与邮件列表数量巨大。二、缺陷报告与邮件列表内容繁杂。三、缺陷报告与邮件列表关联复杂。因此,为了帮助开发人员更好地理解与复用软件资源,需要挖掘缺陷报告与邮件列表的关联关系,并提供基于二者关联关系的文档检索接口。综上所述,缺陷报告与邮件列表蕴含丰富的软件项目信息,但这些信息数量巨大,内容繁杂,并且关联复杂,人工整理需要耗费大量的时间与精力,且跨文档定位开发者所关注的信息十分困难。因此,为了帮助开发人员更好地复用开源项目资源,需要提供一种基于缺陷报告与邮件列表的语义关联挖掘工具。技术实现要素:针对现有技术中存在的技术问题,本发明的目的在于提供一种缺陷报告与邮件列表语义关联挖掘方法。本发明的技术方案为:一种缺陷报告与邮件列表语义关联挖掘方法,其步骤为:1)对获取的目标项目的缺陷报告与邮件列表进行解析,得到缺陷报告的堆栈信息、代码片段、正文文本和邮件列表的堆栈信息、代码片段、正文文本;2)文档显式语义关联挖掘单元根据解析结果识别缺陷报告和邮件列表之间的显式语义关联,包括引用关联和共同代码元素关联;3)文档隐式语义关联挖掘单元根据解析结果识别缺陷报告和邮件列表之间的隐式语义关联,包括相似关联和潜在语义关联。进一步的,所述引用关联包括缺陷报告引用的关联和邮件引用的关联。进一步的,获取所述缺陷报告引用的关联的方法为:对邮件列表的正文文本进行模式匹配,判断是否包含对缺陷报告的引用链接或缺陷报告的关键名;若包含,则识别关键名或提取引用链接中的关键名信息;然后根据关键名定位相应的缺陷报告,并建立引用关联。进一步的,获取所述邮件引用的关联的方法为:对缺陷报告的正文文本进行模式匹配,判断是否包含对邮件的引用信息;若包含,则提取引用链接中的Message-ID信息;然后根据Message-ID定位相应的邮件,并建立引用关联。进一步的,若一封邮件的正文文本中与一缺陷报告的正文文本中存在相同的代码元素,即认为两者存在所述共同代码元素关联。进一步的,根据代码元素的来源挖掘所述共同代码元素关联;首先对代码元素进行解析,其中,如果代码元素来源为目标项目的代码元素,且为长代码元素,则:1)将该长代码元素解析成AST;2)遍历AST节点,读取节点上的元素;3)对每个节点,提取其所在包名信息并连接,则得到长代码元素集合;如果代码元素来源为目标项目的代码元素,且为短代码元素,则1)采用将该短代码元素解析成AST;2)遍历AST节点,读取节点上的元素,得到初始代码元素集合;3)对该初始代码元素集合中的元素去重,并过滤停用词;如果代码元素来源为其他项目的代码元素,则采用命名规则的方法进行解析;然后根据上述解析结果,判定封邮件的正文文本中与缺陷报告的正文文本中是否存在共同代码元素关联。进一步的,挖掘所述隐式语义关联的方法为:1)根据邮件和缺陷报告中的堆栈信息,计算邮件和缺陷报告的相似度SIM1;2)根据邮件和缺陷报告的正文文本,计算邮件和缺陷报告的相似度SIM2;3)基于相似度SIM1和SIM2,得到邮件和缺陷报告的综合相似度SIM;然后根据综合相似度SIM确定存在相似关联的邮件和缺陷报告;4)获取每一文档的查询向量;其中,第i个文档的查询向量为Vi=<Wi,1,Wi,2,...,Wi,k,...,Wi,n>,n为所有文档出现词汇总数,Wi,k指第k个词汇在该文档i中出现的次数;所述文档包括邮件和缺陷报告;5)按照文档i对应的查询向量,计算文档i与其他所有文档的余弦相似度,并按照降序进行排序;然后取排序结果前若干个文档为与文档i存在潜在语义关联的文档。进一步的,利用公式计算查询向量Vi=<Wi,1,Wi,2,...,Wi,n>和文档j的查询向量Vj=<Wj,1,Wj,2,...,Wj,n>的余弦相似度Similarituy(Vi,Vj)。进一步的,采用图数据Neo4j表现挖掘出的缺陷报告与邮件列表之间的语义关联。进一步的,对缺陷报告与邮件列表进行解析的方法为:21)首先过滤掉缺陷报告与邮件列表中的冗余文本内容;22)根据堆栈信息特征,从步骤21)处理后的缺陷报告与邮件列表中提取堆栈信息;23)从步骤22)处理后的缺陷报告与邮件列表中提取代码片段;然后将剩余文本为正文文本。本发明涉及的主要内容包括:一、获取、解析缺陷报告与邮件列表;二、挖掘缺陷报告与邮件列表中存在的显式语义关联;三、挖掘缺陷报告与邮件列表中存在的隐式语义关联。本文缺陷报告与邮件列表语义关联挖掘方法包含四个子单元:文档获取解析单元、文档显式语义关联挖掘单元、文档隐式语义关联挖掘单元和文档检索单元。优化的,在缺陷报告与邮件列表语义关联挖掘方法中,文档获取解析单元,工作流程主要包含以下步骤:步骤1:确定文档资源网络地址,采取定点式爬取,获取缺陷报告与邮件列表文档资源。步骤2:确定获取文档的数据格式,其中缺陷报告为JSON格式;邮件列表为mbox格式。步骤3:按照文档格式,利用工具org.json,解析格式为JSON缺陷报告;利用ApacheJames(JavaApacheMailEnterpriseServer)的Mime4J类库中的MimeStreamParser解析器处理单独的邮件,并存储解析出的文本(包括邮件和缺陷报告两种类型,并按照其类型存储)。步骤4:从步骤3中解析出的邮件和缺陷报告两种类型文本中识别以下内容:a).代码片段。缺陷报告与邮件列表中的代码片段经常不是完整的可编译单元,给代码识别带了一定困难。本方法针对java语法,实现了基于人工规则的代码片段识别工具,识别过程如下:1.将类定义、方法定义、条件判断、赋值语句等具有程序特性的关键词作为集合K={class,if,else,for,while,switch,“=”,……},利用正则表达式描述方法定义的基本文法格式F。2.对每个文本段逐行分析,若此行包含Java关键字或Java语言的特有符号(集合K),或符合方法定义F中的文法格式,则判定为代码行。3.若以“//”开始或以“/*”开始,“*/”结束,则判定为注释部分。统计注释行数。4.若代码行数加注释行数超过文本段总行数的一半,并且段落中出现了大括号或小括号,则判定此段落为代码片段。b).堆栈信息。指的是程序执行出错时断点的堆栈调用信息报告。堆栈信息主要通过以下特征文本行进行判定:1.异常声明行:位于文本段开头,包括“java.lang....exception:”等词。2.位于行:以“at”开头,指明出错是的断点位置,位于文本段的主体部分。3.省略行:由于有的堆栈信息特别长,但是实际引起出错的只是顶部的几个方法因此经常将过长的堆栈信息用省略号“…”表示,以“more”结尾,跟在“at”语句后面。4.导致行:以“causedby:”开头,后跟一系列“at”语句。若文本段落上述特征行出现超过一定的阈值,则判定此段落为堆栈信息。c).冗余文本。主要出现在邮件中,多为邮件开始和结束的问候语、致谢和邮件签名。若是回复邮件,则还包含对原邮件的引用内容。d).正文文本。除上述三种,其余内容均被视为正文文本类型。识别顺序按照冗余文本→堆栈信息→代码片段→正文文本。即,首先过滤冗余文本内容,减少噪音的影响。之后,根据堆栈信息特征,提取堆栈信息。然后,提取代码片段。最后剩余文本为正文文本。其中,堆栈信息、代码片段、正文文本作为三种有效文本,进行下述解析。优化的,在缺陷报告与邮件列表语义关联挖掘方法中,文档显式语义关联挖掘单元,主要用于识别缺陷报告和邮件列表之间的显式语义关联,包括引用关联和共同代码元素关联。工作流程主要包含以下步骤:步骤1:挖掘引用关联。缺陷报告与邮件列表经常相互引用内容,以补充说明问题信息。挖掘引用关联,即指挖掘两者间的引用关系,分为引用缺陷报告和引用邮件,建立关联方法如下:a).引用缺陷报告。正文文本可通过关键名与链接两种方式引用缺陷报告。首先,缺陷报告的关键名包含大写的开源项目名简称与数字,并以连字符相接,如“LUCENE-352”。其次,缺陷跟踪系统中的每个缺陷报告都对应一个特定的链接,链接模式如下:[网络协议]://[报告类型].[社区站点]/[缺陷跟踪系统名]/[查看方式]/[关键名]例如,对Lucene的一封缺陷报告的引用链接如下:http://issues.apache.org/jira/browse/LUCENE-352基于以上模式特征,缺陷报告引用的关联挖掘分为以下几个步骤:1)对邮件列表的正文文本以模式匹配的方式判断是否包含对缺陷报告的引用链接或缺陷报告的关键名;2)若包含,则直接识别关键名,或提取引用链接中的关键名信息;3)根据关键名定位相应的缺陷报告,并建立引用关联。b).引用邮件。邮件的唯一标识符Message-ID的形式为<local-part@domian>。其中local-part是邮件ID,domian是指定这个ID的主机域名。ID的唯一性由指定ID的主机负责,并无规定要如何产生。观察可知,由于邮件的Message-ID不如缺陷报告的关键名直观简洁,如“<c68e39170909240919g11492b52qc65667ac4c5431d5@mail.gmail.com>”。因此,对邮件的引用通常只使用链接的方式。每封邮件对应一个特定的链接,链接的模式如下:[网络协议]://[归档服务器名].[社区站点]/[归档格式]/[邮件列表名]/[归档文件名]/[邮件ID]例如,对Lucene的一封邮件的引用链接如下:http://mail-archives.apache.org/mod_mbox/lucene-java-user/200808.mbox/<48a3076a.2679420a.1c53.ffffa5c4%40mx.google.com>基于以上模式特征,邮件引用的关联挖掘分为以下几个步骤:1)对缺陷报告的正文文本以模式匹配的方式判断是否包含对邮件的引用信息,即引用链接;2)若包含,则提取引用链接中的Message-ID信息;3)根据Message-ID定位相应的邮件,并建立引用关联。步骤2:挖掘共同代码元素关联。若一封邮件和一个缺陷报告文件的文本中存在相同的代码元素,即认为两者存在共同代码元素关联。根据关联的代码元素的来源,可以分为两种:本项目(Lucene)代码元素和其他项目(非Lucene)代码元素。针对这两种情况分别采用源码解析与命名规则的方法进行解析,解析过程如下:a).源码解析,用于解析本项目中代码元素。以Lunene4.0为例,由于源码中有很多的类名、方法名都是自然语言的常用词,会对关联挖掘产生噪音,为避免这种情况,本方法将代码元素分为长代码元素和短代码元素进行解析,解析过程如下:长代码元素,不仅包括类名与方法名等,还包括该类或方法所在的完整包名,如:org.apache.lucene.analysis.CachingTokenFilter。具体分为以下步骤:1)采用EclipseJDT提供的ASTParser将java源码解析成AST;2)遍历AST节点,读取节点上的类、方法、接口等元素;3)对每个节点,提取其所在包名信息,以“.”连接,则得到长代码元素集合。短代码元素,仅包含AST当前结点的名字,如CashingTokenFilter。为了消除很多方法名都是自然语言常用词的影响,需要进一步过滤。具体步骤如下:1)采用EclipseJDT提供的ASTParser将java源码解析成AST;2)遍历AST节点,读取节点上的类、方法等元素,得到初始代码元素集合;3)对集合元素去重,并过滤集合中的停用词;4)人工筛选,删除意义不大的词语,如get、size、value等元素。b).命名规则识别,用于解析其他项目代码元素。在Java语言中,变量名遵循“骆驼拼写法”命名规则以增强其可读性,具体有以下三种:1、小驼峰式拼写法。第一个词首字母小写,其后每个词首字母大写,如:firstName。2、大驼峰式拼写法。第一个词以及后面每个词的首字母均大写,例如:FirstName。3、非标准的驼峰式字符串,即带有连续大写字母与数字,如UPPER2000UPPER、hasABREVIATIONEmbedded、Client2Server2012。针对Java变量的“骆驼拼写法”命名规则,采用正则表达式"?<!(^|[A-Z0-9]))(?=[A-Z0-9])|(?<!(^|[^A-Z]))(?=[0-9])|(?<!(^|[^0-9]))(?=[A-Za-z])|(?<!^)(?=[A-Z][a-z])",即可识别全部该方法定义的变量名。当两个文档提取出相同的代码元素时,即判定两个文档存在共同代码元素关联。优化的,在缺陷报告与邮件列表语义关联挖掘方法中,文档隐式语义关联挖掘单元,主要用于识别缺陷报告和邮件列表之间的隐式语义关联,主要包括相似关联和潜在语义关联工作流程主要包含以下步骤:步骤1:挖掘邮件和缺陷报告的相似关联。步骤1.1:分别提取邮件和缺陷报告中的堆栈信息,包括异常类型名与出错位置的函数签名,计算其相似度SIM1。步骤1.2:结合自然语言的多样性,计算正文文本的相似度SIM2。步骤1.3:基于两种相似度SIM1和SIM2,采用启发式规则,计算文档的综合相似度;然后根据综合相似度SIM确定存在相似关联的邮件和缺陷报告。步骤2:挖掘潜在语义关联。挖掘已解决的缺陷报告的补丁信息对语义关联的贡献度。步骤2.1:建立索引。对所有的缺陷报告与邮件列表建立倒排索引。步骤2.2:获取查询向量。假设所有文档出现词汇共n个,并进行编号。则第i个文档(邮件或缺陷报告)经过处理后的查询向量为Vi=<Wi,1,Wi,2,...,Wi,n>,Wi,k指第k个词汇在文档i中出现的次数。缺陷报告的总结往往能够突出文档的中心思想,而补丁文件则解决了此缺陷所需修改的代码信息。因此本方法结合缺陷报告的总结和补丁文件中的代码元素,进行单词切分、停用词过滤、词干提取处理后,获得该缺陷报告的查询向量。步骤2.3:建立潜在关联。按照文档对应的查询向量,计算文档D与其他所有文档的余弦相似度,并按照降序进行排序。取排序结果前3个文档,判断与文档D存在潜在语义关联。循环建立所有文档的潜在语义关联。其中,计算查询向量Vi=<Wi,1,Wi,2,...,Wi,n>和Vj=<Wj,1,Wj,2,...,Wj,n>余弦相似度的方法如下:优化的,在缺陷报告与邮件列表语义关联挖掘方法中,文档检索单元,采用图数据Neo4j,直观表现挖掘出的缺陷报告与邮件列表之间的语义关联。同时对外提供检索接口,方便获取缺陷报告与邮件列表。方法采用搜索引擎的PageRank算法,将算法的图数据结构中的文档结点类比网页,语义关联边类比超链接,根据文档之间的语义关联关系对检索结果进行重排序。由于缺陷报告与邮件文档数量巨大,为了提高重排序效率,本文仅对信息检索的前100个结果进行重排序工作。与现有技术相比,本发明的积极效果为:以项目Lucene为例,通过以下实验,对比于现有的技术,本方法对搜索效率带来的提升。首先从stackoverflow上删除出Lucene相关的问题集Sq,筛选原则为:问题带有Lucene标签、问题投票数为正、问题答案中提及缺陷报告或邮件列表链接。然后,根据本方法建立的语义关联图,返回相关缺陷报告与邮件列表集合Ba,作为搜索结果。最后计算两个值,衡量本方法的优劣,两个值分别为:召回率(Recall)和平均倒数排名(MRR)。两个值得计算方法如下:1.召回率的计算评估基于语义关联的检索结果是否包含最佳答案涉及的文档,即MC:定义Recall如下:MCi为第i个文档2.平均倒数排名的计算采用平均倒数排名MRR指标来衡量检索效果。即把最佳答案涉及的缺陷报告或邮件列表在检索系统中的排序取倒数作为它的准确度,再对所有问题的结果取平均值。MRR值计算公式如下:|Q|为检索结果文档的个数,ranki为文档i的排名实验一共有三组,一组对照组,两组实验组。对照组是使用SVM文本检索方法的Base组;实验组一使用基于已分类文档的SVM检索方法选取出候选答案,实验组二在实验组一的基础上再考虑语义关联对候选答案的影响,对结果进行重排序。两个实验组分别是Base+Classification组、Base+Classification+Relationship组。每一组的任务相同,即根据问题集Sq中的问题从所有缺陷报告与邮件文档中检索相关的文档。实验结果如表1:表1为实验结果表方法RecallMRRBase22.22%8.05%Base+Classification26.98%13.27%Base+Classifcation+Relationship39.68%19.95%从实验结果可以看出,引入语义关联关系后,系统对文档的检索召回率相比于Base方法有了较大的提升。在检索结果的排名上,Base方法的MRR值很低,即相关文档的排名太靠后,对开发人员的帮助不大。经过文本分类处理与语义关联挖掘后,MRR值由有明显提高,有利于高效地定位相关的缺陷报告与邮件列表,帮助开发人员更好地复用软件资源。附图说明图1为挖掘相似关联工作流程。图2为挖掘潜在语义关联工作流程。具体实施方式本实施实例中,挖掘项目Lucene的缺陷报告和邮件列表的语义关联,并利用图数据库Neo4j,存储和查询关联,以验证方法的效果。按照前文的叙述,方法将按照顺序获取资源→挖掘显式语义→挖掘隐式语义→查询文档执行。文档获取解析单元执行步骤如下:步骤1:构造文件地址,如“http://mail-archives.apache.org/mod_mbox/lucene-general/201509.mbox”,按照地址分别对两类文档进行爬取。步骤2:按照Json格式,解析项目缺陷报告,并将解析文本按照种类,存储在数据库Neo4j中。步骤3:按照MIME4J格式,解析项目邮件列表,将解析文本按照种类,存储在数据库Neo4j中。文档显示语义关联挖掘单元执行步骤如下:步骤1:识别文档中的引用链接,挖掘引用关联。包括缺陷报告内容引用邮件列表和邮件列表引用缺陷报告两种引用关联。步骤2:识别文档中的代码元素关联,采用源码解析方法识别项目Lucene的代码元素;采用命名规则的方法识别非Lucene代码元素,过程如下:步骤2.1:源码解析。主要用于识别项目Lucene的代码元素,包括对长代码元素和段代码元素的识别。.长代码元素。使用EclipseJDTAST对项目源码进行解析,识别源码中的长代码元素(包含该类或方法所在的完整包名),如org.apache.lucene.analysis.CachingTokenFilter。短代码元素。用EclipseJDTAST对项目源码进行解析,别源码中的长代码元素(仅含类或方法名),如CachingTokenFilter。步骤2.2:利用命名规则方法识别非Lucene项目的代码元素。按照“骆驼法”命名规则,识别符合该种命名规则的变量名。步骤2.3:若文中中包含相同的代码元素,则判定两个文档之间存在代码关联,并在Neo4j数据中,建立文档对应节点之间的关联。文档隐式语义关联挖掘单元,主要用于:一、挖掘相似关联,主要包括以下步骤(工作流程图如图1所示):步骤1:计算堆栈信息相似度。提取文档i的堆栈信息的异常类型名和出错位置的函数签名,组成集合STi。则文档i和文档j(两个文档分别为邮件和缺陷报告)的堆栈信息相似度为:步骤2:计算正文文本相似度。经过对文本内容进行单词切分、停用词过滤、词干提取处理后。按照公式:计算文档D、Q的相似度。其中q1至qn为文档Q处理后的关键字;f(qi,D)为文档Q中的第i个分词qi在文档D中词频;avgdl为文档集合中的平均文档长度;其中,N是所有文档的数量,n(qi)为包含关键词qi的文档数量;k1和b为调节参数。步骤3:计算综合相似度。去文档D,按照上述步骤1与步骤2中的方法,分别计算文档D与其余所有文档的堆栈信息相似度和正文文本相似度,取两者的平均值作为文档D与其他文档的综合相似度,并进行降序排列。取前10个文档,判定与文档D存在相似关联,并在Neo4j数据中,建立文档对应结点之间的关联。二、挖掘潜在语义关联,主要包括以下步骤(工作流程图如图2所示):步骤1:为Lucene项目的缺陷报告和邮件列表建立倒排索引。步骤2:根据缺陷报告的总结和补丁文件的代码查询,检索文档。步骤3:计算文档D与其他所有文档的相似度。计算公式为:其中Vi、Vj分别为文档i、j的查询向量。之后按照相似度大小降序排序,取排名前3个文档,判定它们与文档D存在潜在语义关联,并在Neo4j数据库中,建立文档所对应节点之间的关联。文档检索单元,用于验证方法建立关联的效果。验证的方式为:从Stackoverflow上选取相关问题,利用Neo4j,检索文档,对比问题原有答案,确定是否能够解决问题。主要包括以下步骤:步骤1:筛选问题集。筛选的原则是:问题带有Lucene标签、问题投票数为正、问题答案中提及缺陷报告或邮件列表链接。步骤2:利用数据Neo4j,根据问题,构造查询,获取结果。步骤3:根据检索结果,计算召回率(Recall)和平均倒数排名(MRR)。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1