一种基于邮件列表的开源软件问答信息抽取方法与流程

文档序号:12665988阅读:283来源:国知局
一种基于邮件列表的开源软件问答信息抽取方法与流程

本发明涉及一种基于邮件列表的文档摘要方法,具体涉及一种基于邮件列表的开源软件问答信息抽取方法。



背景技术:

软件开发人员在项目开发的过程中越来越多地复用开源软件。开源项目通常会提供诸如用户手册、FAQ页面、邮件列表等文档来帮助用户更好地理解和使用开源项目。其中邮件列表中蕴含丰富的软件问答信息。软件开发人员可以到邮件列表中去检索是否有人遇到过相似的问题。但由于邮件的数量巨大,邮件内容组织繁杂等因素使得其不易于被阅读和浏览。若能从邮件列表中定位到问题句和回答句,对进一步整合问题信息以及检索答案会有很大帮助。

目前,关于问答信息抽取的相关工作主要是基于特征词(5W1H)和疑问标点的方法。但这类方法存在模型过于简单,准确性不高的问题。

因此,对邮件问答信息进行自动化分析、抽取,进而帮助开发人员高效地获取与开源项目相关的问答信息是一项亟待解决的问题,对软件开发效率的提高有重要意义。



技术实现要素:

针对目前开源软件邮件列表数量众多、不易阅读的问题,本发明提供了一种针对特定开源项目的邮件问答信息抽取方法,通过本发明提供的方法可以有效地从邮件列表中为软件开发者抽取开源软件相关的问答信息。

本发明的技术方案为:

一种基于邮件列表的开源软件问答信息抽取方法,其步骤为:

1)从邮件归档服务器上爬取目标开源软件的邮件归档文件;依据邮件头部域将所述邮件归档文件分割成多封单独的邮件;

2)将回复信息域为空的邮件设为一个会话的提问邮件,然后从步骤1)得到的邮件中查找回复信息域的域值为该提问邮件的邮件标识ID的邮件,将其加入该会话;从而将同一主题下的邮件组织成邮件对话的形式;

3)提取各邮件的正文信息并对邮件内容中代码元素进行标注;

4)从提问邮件的所述正文信息中提取问题句及其上下文信息;然后基于问题句及其上下文信息和标注的代码元素构建查询条件,在该提问邮件的会话邮件中进行检索;然后从检索结果中选取一邮件作为回答信息。

进一步的,从检索结果中选取一邮件作为回答信息的方法为:

21)选取检索结果中的前若干封邮件作为候选答案邮件;

22)根据作者权威度、邮件位置以及回复邮件的态度计算每一候选答案邮件的权重;

23)选取权重最高的候选答案邮件作为回答信息。

进一步的,所述邮件的作者分为项目开发人员、资深用户和普通用户;其中,项目开发人员的权威度>资深用户的权威度>普通用户的权威度,候选答案邮件的作者权威度越大,该候选答案邮件权重越大;根据候选答案邮件的回复时间确定邮件位置对应的权重,候选答案邮件的回复时间越早,该候选答案邮件的权重越大;在邮件会话中,若提问邮件的作者对候选答案邮件做出了肯定的回复,则增大该候选答案邮件的权重。

进一步的,所述问题句的上下文信息包括该问题句所在段落、与该问题句临近的代码和与该问题句临近的异常信息。

进一步的,根据邮件标题中的内容词、问题句中的内容词以及问题句段落的代码元素、异常文本段落的异常信息词汇构建所述查询条件。

进一步的,对步骤1)得到的邮件进行预处理,其方法为:首先对每一邮件进行分段;然后识别出邮件中的冗余文本段落、邮件引用段落、异常信息段落、代码文本段落、正文信息段落;

进一步的,所述冗余文本段落的识别方法为:检测邮件第一段落的前两句,若是问候句则将该句从当前段落移除,划分到冗余文本段落;检测邮件结尾之前的两个段落,如果只包含两个以内短句或包含人名、感谢语,则划分到冗余文本段落;所述邮件引用段落的识别方法为:如果段落的第一句匹配某人在某天写道的句式且该段以设定符合“>”开始的行数超过段落总行数的设定比例H,则该段为邮件引用段落;所述异常信息段落的识别方法为:统计段落的总行数和位于行的行数,若位于行的行数占总行数比例超过设定比例L且存在导致行和省略行,则认为该段落是异常信息段落;所述异常描述行为包含设定异常特征词语的行,所述位于行为包含堆栈信息中某个方法的行号的行,所述导致行为包含说明异常出现的原因及位置的行,所述省略行为以省略号开头、以数字后接“more”结尾的行;所述代码文本段落的识别方法为:利用语法解析器从邮件文本段落中抽取符合语法的文本块作为代码文本段落,如果文本段落中包含Java关键词的句子超过该文本段落中句子总数的一半,则判定该文本段落为代码文本段落;将该邮件剩余未识别部分作为该邮件的所述正文信息段落。

进一步的,所述邮件归档文件为Unix mbox格式的邮件归档文件。

进一步的,对邮件内容中代码元素进行标注的方法为:将邮件内容中的代码元素与目标开源软件的代码元素列表进行比对,将邮件内容中的代码元素分为目标开源软件的代码元素和其他项目的代码元素;然后对目标开源软件的代码元素进行标注:从目标开源软件的代码元素中抽取出类、方法、接口代码元素;对邮件内容去除停用词后,将剩余单词与抽取的代码元素进行匹配标注。

本发明的方法如图1所示,包括如下步骤:

1.一种邮件收集整理模块。该模块从邮件归档服务器上爬取指定开源项目Unix mbox格式的邮件归档文件,并进行解析。包括以下子模块:

1.1. mbox文件的获取

使用HttpClient访问Web网页资源,使用Http的Get方法获取网页内容,对其中的超链接进行分析,将链接到mbox文件的超链接加入需要下载的队列,获取时对下载队列中的文件进行爬取。配置一个多线程的爬虫框架,该爬虫分配装置包括:

爬虫控制中心:对爬虫进行初始化设置,如设置子线程数目、添加种子链接(seed link)等;

任务队列:保存当前正在爬取的任务以及等待被爬取的任务;

主爬虫:根据给定的种子链接解析出子任务并添加到队列中,同时启动多个子爬虫;

子爬虫:完成具体的爬取任务;

1.2. mbox文件的解析

邮件的原始文本是一种半结构化信息,包括头部域和正文域。头部域是结构化的信息,以键值对的形式表现,正文域是非结构化信息,以自然语言文本的形式表现。可以根据头部域对邮件进行拆分、解析。步骤如下:

步骤一:依据邮件头部域将mbox文件分割成多封单独的邮件;

步骤二:解析每一封邮件,将其保存为邮件实体类;

步骤三:对于每一封“InReplyTo”域(回复信息域)为空的邮件,将其设为一个会话的提问邮件,然后从mbox的其他邮件中查找“InReplyTo”域值为该提问邮件“MessageID”(邮件标识ID)的邮件,将其加入会话;

步骤四:对新加入的邮件执行步骤三,将“InReplyTo”域为该邮件的“MessageID”的邮件加入会话;

步骤五:重复步骤四直到没有新邮件加入会话。

经过上述五个步骤,将同一主题下的邮件组织成邮件对话的形式。

2.邮件内容预处理

2.1.邮件内容的分类

开源项目邮件内容繁杂,邮件内容可以分为:冗余文本段落、邮件引用段落、异常信息段落、代码文本段落、正文信息段落。对邮件分段后,逐步分类。分段步骤为:

步骤一:从数据库中读取邮件内容,按换行符“\n”将内容分割为多个行;

步骤二:忽略邮件头部的多个空行;

步骤三:从第一个非空行开始为一个段落的开始,直到遇到下一个空行;

步骤四:重复步骤三直到邮件末尾;

2.1.1.冗余文本段落识别

分为两个步骤:

步骤一:检测邮件第一段落的前两句,如句子简短,包含“Hi”,“Hello”等问候词汇。若是问候句则将该句从当前段落移除,划分到冗余文本段落。

步骤二:邮件结尾之前的两个段落如果只包含两个以内短句(单词数目不超过5的句子被视为短句)或包含人名(以大写开头的单词)、感谢语,则划分到冗余文本段落。

2.1.2.邮件引用段落识别

分为两个步骤:

步骤一:正则匹配段落的第一句,看是否匹配“On[Date][somebody]wrote:”(某人在某天写道)的句式;

步骤二:判断以“>”开始的行数是否超过段落总行数的80%;

如果两个步骤中判断均为是,则划分到邮件引用段落。

2.1.3.异常信息段落识别

Java程序的异常信息有一些固定的模式,以行为单位,可将Java的异常信息分为以下四类:

1.异常描述行,位于异常文本的开始,是对异常信息进行描述的行,该行的特征是包含“exception”或者“error”等词语;

2.位于行,是以“at”开始的行,表明堆栈信息中某个方法的行号;

3.导致行,是以“caused by:”开始的行,通常是说明异常出现的原因及位置;

4.省略行,省略过多的非关键异常信息,以省略号开头,以数字后接“more”结尾。

异常信息段落识别步骤如下:

步骤一:统计总行数和位于行的行数;

步骤二:查找导致行和省略行;

步骤三:若位于行的行数占总行数比例超过70%且存在导致行和省略行,则认为该段落是异常信息段落。

2.1.4.代码文本段落识别

主要有三个步骤:

步骤一:使用antlr提供的语法解析器,自定义java代码块语法,从邮件文本段落中抽取符合语法的文本块作为代码文本段落;

步骤二:对于未被步骤一识别为代码段落的文本段落中的每一句话,判断是否包含Java关键词,如果包含Java关键词的句子超过该段落句子总数的一半,则判定该段落为代码文本段落;

步骤三:对连续的代码文本段落进行整合,以保证代码文本的完整性。

2.1.5.正文信息段落识别

剩余未识别部分即为正文信息段落。

2.2.邮件内容中代码元素的标注

通过与当前开源项目的代码元素列表比对,可以将开源项目邮件中的代码元素按照来源分为两类,一类是属于当前项目的代码元素;一类是属于其他项目的代码元素。对当前项目代码元素的识别分为两个步骤:

步骤一:对项目源码进行解析,抽取出其中的类、方法、接口等代码元素;

步骤二:对邮件内容去除停用词后,将剩余单词与之前抽取的代码元素进行匹配标注;

对其他项目的代码元素识别,按照java中变量命名的camelCase原则进行识别。

3.提问邮件中问题信息的抽取

采取基于序列模式挖掘的问题句式挖掘方法。分为问题句式抽取,问题句选取,问题信息整合三个子模块。

3.1.问题句式抽取

分为三个步骤:

步骤一:人工标注邮件列表中的问题句;

步骤二:采用Stanford Tagger对问题句进行词性标注;

步骤三:用SPMF实现的PrefixSpan算法挖掘问题句词性序列中频繁的序列作为问题句式的模式;

3.2.问题句选取

在抽取出问题句模式的基础上,对提问邮件中的句子进行评分,评分规则如下:

规则一:每匹配一个模式,加1分;

规则二:以问号结尾,加1分;

规则三:候选句中出现邮件标题词或代码元素,加1分;

评分结束后,选取评分最高的句子作为问题句。

3.3.问题信息整合

单一的问题句通常很难表达提问者的所有信息,本文选取以下三类信息作为问题句的上下文:

信息一:问题句前后文本。问题句通常是简短的一句话,其前后文本会对问题的场景等信息进行较详细的描述。本文将问题句所在的段落视为问题句的前后文本。

信息二:与问题句临近的代码文本段落。开发人员在提问时通常会附上出现问题的代码片段。与问题句临近的代码文本段落可以进一步明确问题来源。

信息三:与问题句临近的异常信息段落。异常文本信息可以帮助专业人士高效得地定位和解决问题,与问题句临近的异常信息段落是提问者对异常的描述,应当归为问题信息。

4.邮件会话中答案信息的抽取

答案信息抽取实质是一个检索的过程,即在邮件会话的众多邮件中定位到最满意的答案邮件。分为基于内容特征查找候选答案邮件,基于非内容特征核算权值两个子模块。最后选取权重得分最高的邮件作为回答信息。

4.1.基于内容特征查找候选答案邮件

根据提问邮件中的问题信息构造查询后,选择检索模型查找候选答案邮件。

4.1.1.构造查询

选择问题信息中的三类词汇作为查询:

一:邮件标题中的内容词;

二:问题句中的内容词以及问题句段落的代码元素;

三:异常文本段落的异常信息词汇;

4.1.2.文本检索

在提问邮件的所有回复邮件中进行检索,检索使用开源工具Lucene的向量空间模型(VSM),选取检索结果中的前三封邮件作为三个候选答案邮件。

4.2.基于非内容特征核算权值

选取作者权威度、邮件位置以及回复邮件的态度三种特征辅助回答信息的选取。三种特征的量化说明如下:

作者权威度:将邮件作者分为项目开发人员、资深用户和普通用户三类,项目开发人员的邮件权重加1,资深用户的邮件权重加0.5,普通用户的邮件权重加0;根据项目开发人员名单确定作者是否为项目开发人员,凡是回复邮件数量大于100的人员都记为资深人员,其他的为普通用户;

邮件位置:对三个候选答案邮件进行比较,根据回复时间从后往前邮件的权重分值依次加{1,0.5,0};

回应邮件的态度:在邮件会话中,若提问邮件作者对答复邮件做出了肯定的回复,答复邮件权重加0.5分;若提问邮件对答复邮件提出了质疑,答复邮件权重减0.5分。哈佛大学的GI(General Inquirer)评价词典收录了近2000个褒义词和2000个贬义词,本发明根据该词典,若回复邮件中的最后一句中出现正性词汇(如good,cool)次数较多,则视为肯定;若负性词汇较多,则视为否定。

与现有技术相比,本发明的积极效果为:

依据序列模式挖掘的问题句提取方法相较于传统的基于疑问词的问题句提取方法在准确率上有明显提高。本发明在验证时人工标注了300封来自开源项目Lucene和Tomcat的邮件的问题句,分别与上述两种方法提取的问题句进行了比较。基于疑问词的传统方法准确率为78.64%,本发明使用的基于序列模式挖掘的方法可以取得88.17%的准确率,有显著提升。

附图说明

图1为软件问答信息抽取工具示意图。

图2为多线程mbox文件爬取框架。

图3为邮件内容分段算法流程图。

图4为邮件内容分类流程图。

图5为冗余文本段落识别流程图。

图6为邮件引用段落识别流程图。

图7为异常信息段落识别流程图。

图8为提问邮件问题句标注流程图。

图9为邮件会话答案信息抽取流程图。

具体实施方式

实施例:通过本方法的处理,由一个邮件对话实例得到的问答信息如表1所示。

表1为问答信息

具体实施步骤如下:

步骤1:参照图2,从邮件归档服务器上爬取Unix mbox格式的邮件归档文件。

步骤2:解析爬取的邮件,解析包括以下子步骤:

步骤2.1:依据头部域将mbox文件分割成多封单独的邮件;

步骤2.2:解析每一封邮件,将其保存为邮件实体类;

步骤2.3:对于每一封“InReplyTo”域(回复信息域)为空的邮件,将其设为一个会话的提问邮件,然后从mbox的其他邮件中查找“InReplyTo”域值为该提问邮件“MessageID”(邮件标识ID)的邮件,将其加入会话;

步骤2.4:对新加入的邮件执行步骤2.3,将“InReplyTo”域为该邮件的“MessageID”的邮件加入会话;

步骤2.5:重复步骤2.4直到没有新邮件加入会话。

经过上述五个步骤,将同一主题下的邮件组织成邮件对话的形式。

步骤3:对邮件内容进行分段。分段包括以下子步骤:

步骤3.1:从数据库中读取邮件内容,按换行符“\n”将内容分割为多个行;

步骤3.2:忽略邮件头部的多个空行;

步骤3.3:从第一个非空行开始为一个段落的开始,直到遇到下一个空行;

步骤3.4:重复步骤3.3直到邮件末尾;

完成邮件内容的分段后需要根据邮件内容的不同属性把邮件内容分为:冗余文本段落、邮件引用段落、异常信息段落、代码文本段落、正文信息段落,共五种段落。识别方法为依次识别前四种,剩下的内容即为正文信息段落。具体的识别步骤如下:

步骤4:冗余文本段落识别。包括2个子步骤:

步骤4.1:检测邮件第一段落的前两句,如句子简短,包含“Hi”,“Hello”等问候词汇。若是问候句则将该句从当前段落移除,划分到冗余文本段落。

步骤4.2:邮件结尾之前的两个段落如果只包含两个以内短句(单词数目不超过5的句子被视为短句)或包含人名(以大写开头的单词)、感谢语,则划分到冗余文本段落。

步骤5:邮件引用段落识别,包括3个子步骤:

步骤5.1:正则匹配段落的第一句,看是否匹配“On[Date][somebody]wrote:”(某人在某天写道)的句式;

步骤5.2:判断以“>”开始的行数是否超过段落总行数的80%;

步骤5.3:如果两个步骤中判断均为是,则划分到邮件引用段落。

步骤6:异常信息段落识别。Java程序的异常信息有一些固定的模式,以行为单位,可将Java的异常信息分为以下四类:

(1)异常描述行,位于异常文本的开始,是对异常信息进行描述的行,该行的特征是包含“exception”或者“error”等词语;

(2)位于行,是以“at”开始的行,表明堆栈信息中某个方法的行号;

(3)导致行,是以“caused by:”开始的行,通常是说明异常出现的原因及位置;

(4)省略行,省略过多的非关键异常信息,以省略号开头,以数字后接“more”结尾。

异常信息段落识别包括3个子步骤:

步骤6.1:统计总行数和位于行的行数;

步骤6.2:查找导致行和省略行;

步骤6.3:若位于行的行数占总行数比例超过70%且存在导致行和省略行,则认为该段落是异常信息段落。

步骤7:代码文本段落识别,包括3个子步骤:

步骤7.1:使用antlr提供的语法解析器,自定义java代码块语法,从邮件文本段落中抽取符合语法的文本块;

步骤7.2:对于文本段落中的每一句话,判断是否包含Java关键词,如果包含Java关键词的句子超过总数的一半,如果超过一半则判定为代码文本段落;

步骤7.3:对连续的代码文本段落进行整合,以保证代码文本的完整性;

步骤8:邮件内容中代码元素的标注。根据开源项目的代码元素列表,可以把开源项目邮件中的代码元素按照来源分为两类,一类是属于当前项目的代码元素;一类是属于其他项目的代码元素。对当前项目代码元素的识别分为两个步骤:

步骤8.1:对项目源码进行解析,抽取出其中的类、方法、接口等代码元素;

步骤8.2:对邮件内容去除停用词后,将剩余单词与之前抽取的代码元素进行匹配标注;

对其他项目的代码元素识别,按照java中变量命名的camelCase原则进行识别。

提问邮件中问题信息的抽取采取基于序列模式挖掘的问题句式挖掘方法。分为问题句式抽取,问题句选取,问题信息整合三个步骤。

步骤9:问题句式抽取,包括三个子步骤:

步骤9.1:人工标注邮件列表中的问题句;

步骤9.2:采用Stanford Tagger对问题句进行词性标注;

步骤9.3:用PrefixSpan算法挖掘问题句词性序列中频繁的序列作为问题句式的模式;

步骤10:问题句选取,在抽取出问题句模式的基础上,对提问邮件中的句子进行评分,评分规则如下:

规则一:每匹配一个模式,加1分;

规则二:以问号结尾,加1分;

规则三:候选句中出现邮件标题词或代码元素,加1分;

评分结束后,选取评分最高的句子作为问题句。

步骤11:问题信息整合。单一的问题句通常很难表达提问者的所有信息本文选取以下三类信息作为问题句的上下文:

信息一:问题句前后文本。问题句通常是简短的一句话,其前后文本会对问题的场景等信息进行较详细的描述。本文将问题句所在的段落视为问题句的前后文本。

信息二:与问题句临近的代码文本段落。开发人员在提问时通常会附上出现问题的代码片段。与问题句临近的代码文本段落可以进一步明确问题来源。

信息三:与问题句临近的异常信息段落。异常文本信息可以帮助专业人士高效得地定位和解决问题,与问题句临近的异常信息段落是提问者对异常的描述,应当归为问题信息。

完成提问信息的抽取后,进行邮件会话中答案信息的抽取答案信息抽取实质是一个检索的过程,即在邮件会话的众多邮件中定位到最满意的答案邮件。分为基于内容特征查找候选答案邮件,基于非内容特征核算权值两个步骤。最后选取权重得分最高的邮件作为回答信息。

步骤12:基于内容特征查找候选答案邮件。根据提问邮件中的问题信息构造查询后,选择检索模型查找候选答案邮件。分为以下两个子步骤:

步骤12.1:构造查询。选择问题信息中的三类词汇作为查询:邮件标题中的内容词、问题句中的内容词以及问题句段落的代码元素、异常文本段落的异常信息词汇;

步骤12.2:文本检索。在提问信息所在邮件的所有回复邮件中进行检索,检索使用开源工具Lucene的向量空间模型(VSM),选取检索结果中的前三封邮件作为三个候选答案邮件。

步骤13:基于非内容特征核算权值。选取作者权威度、邮件位置以及回复邮件的态度三种特征辅助回答信息的选取。从三封候选答复邮件中选取特征得分最高的一封邮件作为回答信息。三种特征的量化说明如下:

作者权威度:将邮件作者分为项目开发人员、资深用户和普通用户三类,项目开发人员的邮件权重加1,,资深用户的邮件权重加0.5,普通用户的邮件权重加0;

邮件位置:对三个候选答案邮件进行比较,根据回复时间从后往前邮件的权重分值依次加{1,0.5,0};

回应邮件的态度:在邮件会话中,若提问邮件作者对答复邮件做出了肯定的回复,答复邮件权重加0.5分;若提问邮件对答复邮件提出了质疑,答复邮件权重减0.5分。

步骤14:将步骤10得到的问题句和步骤13得到的回复信息整合在一起,得到一封邮件的问答信息。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1