本發(fā)明涉及一種基于郵件列表的文檔摘要方法,具體涉及一種基于郵件列表的開源軟件問答信息抽取方法。
背景技術(shù):
軟件開發(fā)人員在項(xiàng)目開發(fā)的過程中越來越多地復(fù)用開源軟件。開源項(xiàng)目通常會(huì)提供諸如用戶手冊(cè)、FAQ頁面、郵件列表等文檔來幫助用戶更好地理解和使用開源項(xiàng)目。其中郵件列表中蘊(yùn)含豐富的軟件問答信息。軟件開發(fā)人員可以到郵件列表中去檢索是否有人遇到過相似的問題。但由于郵件的數(shù)量巨大,郵件內(nèi)容組織繁雜等因素使得其不易于被閱讀和瀏覽。若能從郵件列表中定位到問題句和回答句,對(duì)進(jìn)一步整合問題信息以及檢索答案會(huì)有很大幫助。
目前,關(guān)于問答信息抽取的相關(guān)工作主要是基于特征詞(5W1H)和疑問標(biāo)點(diǎn)的方法。但這類方法存在模型過于簡單,準(zhǔn)確性不高的問題。
因此,對(duì)郵件問答信息進(jìn)行自動(dòng)化分析、抽取,進(jìn)而幫助開發(fā)人員高效地獲取與開源項(xiàng)目相關(guān)的問答信息是一項(xiàng)亟待解決的問題,對(duì)軟件開發(fā)效率的提高有重要意義。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)目前開源軟件郵件列表數(shù)量眾多、不易閱讀的問題,本發(fā)明提供了一種針對(duì)特定開源項(xiàng)目的郵件問答信息抽取方法,通過本發(fā)明提供的方法可以有效地從郵件列表中為軟件開發(fā)者抽取開源軟件相關(guān)的問答信息。
本發(fā)明的技術(shù)方案為:
一種基于郵件列表的開源軟件問答信息抽取方法,其步驟為:
1)從郵件歸檔服務(wù)器上爬取目標(biāo)開源軟件的郵件歸檔文件;依據(jù)郵件頭部域?qū)⑺鲟]件歸檔文件分割成多封單獨(dú)的郵件;
2)將回復(fù)信息域?yàn)榭盏泥]件設(shè)為一個(gè)會(huì)話的提問郵件,然后從步驟1)得到的郵件中查找回復(fù)信息域的域值為該提問郵件的郵件標(biāo)識(shí)ID的郵件,將其加入該會(huì)話;從而將同一主題下的郵件組織成郵件對(duì)話的形式;
3)提取各郵件的正文信息并對(duì)郵件內(nèi)容中代碼元素進(jìn)行標(biāo)注;
4)從提問郵件的所述正文信息中提取問題句及其上下文信息;然后基于問題句及其上下文信息和標(biāo)注的代碼元素構(gòu)建查詢條件,在該提問郵件的會(huì)話郵件中進(jìn)行檢索;然后從檢索結(jié)果中選取一郵件作為回答信息。
進(jìn)一步的,從檢索結(jié)果中選取一郵件作為回答信息的方法為:
21)選取檢索結(jié)果中的前若干封郵件作為候選答案郵件;
22)根據(jù)作者權(quán)威度、郵件位置以及回復(fù)郵件的態(tài)度計(jì)算每一候選答案郵件的權(quán)重;
23)選取權(quán)重最高的候選答案郵件作為回答信息。
進(jìn)一步的,所述郵件的作者分為項(xiàng)目開發(fā)人員、資深用戶和普通用戶;其中,項(xiàng)目開發(fā)人員的權(quán)威度>資深用戶的權(quán)威度>普通用戶的權(quán)威度,候選答案郵件的作者權(quán)威度越大,該候選答案郵件權(quán)重越大;根據(jù)候選答案郵件的回復(fù)時(shí)間確定郵件位置對(duì)應(yīng)的權(quán)重,候選答案郵件的回復(fù)時(shí)間越早,該候選答案郵件的權(quán)重越大;在郵件會(huì)話中,若提問郵件的作者對(duì)候選答案郵件做出了肯定的回復(fù),則增大該候選答案郵件的權(quán)重。
進(jìn)一步的,所述問題句的上下文信息包括該問題句所在段落、與該問題句臨近的代碼和與該問題句臨近的異常信息。
進(jìn)一步的,根據(jù)郵件標(biāo)題中的內(nèi)容詞、問題句中的內(nèi)容詞以及問題句段落的代碼元素、異常文本段落的異常信息詞匯構(gòu)建所述查詢條件。
進(jìn)一步的,對(duì)步驟1)得到的郵件進(jìn)行預(yù)處理,其方法為:首先對(duì)每一郵件進(jìn)行分段;然后識(shí)別出郵件中的冗余文本段落、郵件引用段落、異常信息段落、代碼文本段落、正文信息段落;
進(jìn)一步的,所述冗余文本段落的識(shí)別方法為:檢測郵件第一段落的前兩句,若是問候句則將該句從當(dāng)前段落移除,劃分到冗余文本段落;檢測郵件結(jié)尾之前的兩個(gè)段落,如果只包含兩個(gè)以內(nèi)短句或包含人名、感謝語,則劃分到冗余文本段落;所述郵件引用段落的識(shí)別方法為:如果段落的第一句匹配某人在某天寫道的句式且該段以設(shè)定符合“>”開始的行數(shù)超過段落總行數(shù)的設(shè)定比例H,則該段為郵件引用段落;所述異常信息段落的識(shí)別方法為:統(tǒng)計(jì)段落的總行數(shù)和位于行的行數(shù),若位于行的行數(shù)占總行數(shù)比例超過設(shè)定比例L且存在導(dǎo)致行和省略行,則認(rèn)為該段落是異常信息段落;所述異常描述行為包含設(shè)定異常特征詞語的行,所述位于行為包含堆棧信息中某個(gè)方法的行號(hào)的行,所述導(dǎo)致行為包含說明異常出現(xiàn)的原因及位置的行,所述省略行為以省略號(hào)開頭、以數(shù)字后接“more”結(jié)尾的行;所述代碼文本段落的識(shí)別方法為:利用語法解析器從郵件文本段落中抽取符合語法的文本塊作為代碼文本段落,如果文本段落中包含Java關(guān)鍵詞的句子超過該文本段落中句子總數(shù)的一半,則判定該文本段落為代碼文本段落;將該郵件剩余未識(shí)別部分作為該郵件的所述正文信息段落。
進(jìn)一步的,所述郵件歸檔文件為Unix mbox格式的郵件歸檔文件。
進(jìn)一步的,對(duì)郵件內(nèi)容中代碼元素進(jìn)行標(biāo)注的方法為:將郵件內(nèi)容中的代碼元素與目標(biāo)開源軟件的代碼元素列表進(jìn)行比對(duì),將郵件內(nèi)容中的代碼元素分為目標(biāo)開源軟件的代碼元素和其他項(xiàng)目的代碼元素;然后對(duì)目標(biāo)開源軟件的代碼元素進(jìn)行標(biāo)注:從目標(biāo)開源軟件的代碼元素中抽取出類、方法、接口代碼元素;對(duì)郵件內(nèi)容去除停用詞后,將剩余單詞與抽取的代碼元素進(jìn)行匹配標(biāo)注。
本發(fā)明的方法如圖1所示,包括如下步驟:
1.一種郵件收集整理模塊。該模塊從郵件歸檔服務(wù)器上爬取指定開源項(xiàng)目Unix mbox格式的郵件歸檔文件,并進(jìn)行解析。包括以下子模塊:
1.1. mbox文件的獲取
使用HttpClient訪問Web網(wǎng)頁資源,使用Http的Get方法獲取網(wǎng)頁內(nèi)容,對(duì)其中的超鏈接進(jìn)行分析,將鏈接到mbox文件的超鏈接加入需要下載的隊(duì)列,獲取時(shí)對(duì)下載隊(duì)列中的文件進(jìn)行爬取。配置一個(gè)多線程的爬蟲框架,該爬蟲分配裝置包括:
爬蟲控制中心:對(duì)爬蟲進(jìn)行初始化設(shè)置,如設(shè)置子線程數(shù)目、添加種子鏈接(seed link)等;
任務(wù)隊(duì)列:保存當(dāng)前正在爬取的任務(wù)以及等待被爬取的任務(wù);
主爬蟲:根據(jù)給定的種子鏈接解析出子任務(wù)并添加到隊(duì)列中,同時(shí)啟動(dòng)多個(gè)子爬蟲;
子爬蟲:完成具體的爬取任務(wù);
1.2. mbox文件的解析
郵件的原始文本是一種半結(jié)構(gòu)化信息,包括頭部域和正文域。頭部域是結(jié)構(gòu)化的信息,以鍵值對(duì)的形式表現(xiàn),正文域是非結(jié)構(gòu)化信息,以自然語言文本的形式表現(xiàn)??梢愿鶕?jù)頭部域?qū)︵]件進(jìn)行拆分、解析。步驟如下:
步驟一:依據(jù)郵件頭部域?qū)box文件分割成多封單獨(dú)的郵件;
步驟二:解析每一封郵件,將其保存為郵件實(shí)體類;
步驟三:對(duì)于每一封“InReplyTo”域(回復(fù)信息域)為空的郵件,將其設(shè)為一個(gè)會(huì)話的提問郵件,然后從mbox的其他郵件中查找“InReplyTo”域值為該提問郵件“MessageID”(郵件標(biāo)識(shí)ID)的郵件,將其加入會(huì)話;
步驟四:對(duì)新加入的郵件執(zhí)行步驟三,將“InReplyTo”域?yàn)樵撪]件的“MessageID”的郵件加入會(huì)話;
步驟五:重復(fù)步驟四直到?jīng)]有新郵件加入會(huì)話。
經(jīng)過上述五個(gè)步驟,將同一主題下的郵件組織成郵件對(duì)話的形式。
2.郵件內(nèi)容預(yù)處理
2.1.郵件內(nèi)容的分類
開源項(xiàng)目郵件內(nèi)容繁雜,郵件內(nèi)容可以分為:冗余文本段落、郵件引用段落、異常信息段落、代碼文本段落、正文信息段落。對(duì)郵件分段后,逐步分類。分段步驟為:
步驟一:從數(shù)據(jù)庫中讀取郵件內(nèi)容,按換行符“\n”將內(nèi)容分割為多個(gè)行;
步驟二:忽略郵件頭部的多個(gè)空行;
步驟三:從第一個(gè)非空行開始為一個(gè)段落的開始,直到遇到下一個(gè)空行;
步驟四:重復(fù)步驟三直到郵件末尾;
2.1.1.冗余文本段落識(shí)別
分為兩個(gè)步驟:
步驟一:檢測郵件第一段落的前兩句,如句子簡短,包含“Hi”,“Hello”等問候詞匯。若是問候句則將該句從當(dāng)前段落移除,劃分到冗余文本段落。
步驟二:郵件結(jié)尾之前的兩個(gè)段落如果只包含兩個(gè)以內(nèi)短句(單詞數(shù)目不超過5的句子被視為短句)或包含人名(以大寫開頭的單詞)、感謝語,則劃分到冗余文本段落。
2.1.2.郵件引用段落識(shí)別
分為兩個(gè)步驟:
步驟一:正則匹配段落的第一句,看是否匹配“On[Date][somebody]wrote:”(某人在某天寫道)的句式;
步驟二:判斷以“>”開始的行數(shù)是否超過段落總行數(shù)的80%;
如果兩個(gè)步驟中判斷均為是,則劃分到郵件引用段落。
2.1.3.異常信息段落識(shí)別
Java程序的異常信息有一些固定的模式,以行為單位,可將Java的異常信息分為以下四類:
1.異常描述行,位于異常文本的開始,是對(duì)異常信息進(jìn)行描述的行,該行的特征是包含“exception”或者“error”等詞語;
2.位于行,是以“at”開始的行,表明堆棧信息中某個(gè)方法的行號(hào);
3.導(dǎo)致行,是以“caused by:”開始的行,通常是說明異常出現(xiàn)的原因及位置;
4.省略行,省略過多的非關(guān)鍵異常信息,以省略號(hào)開頭,以數(shù)字后接“more”結(jié)尾。
異常信息段落識(shí)別步驟如下:
步驟一:統(tǒng)計(jì)總行數(shù)和位于行的行數(shù);
步驟二:查找導(dǎo)致行和省略行;
步驟三:若位于行的行數(shù)占總行數(shù)比例超過70%且存在導(dǎo)致行和省略行,則認(rèn)為該段落是異常信息段落。
2.1.4.代碼文本段落識(shí)別
主要有三個(gè)步驟:
步驟一:使用antlr提供的語法解析器,自定義java代碼塊語法,從郵件文本段落中抽取符合語法的文本塊作為代碼文本段落;
步驟二:對(duì)于未被步驟一識(shí)別為代碼段落的文本段落中的每一句話,判斷是否包含Java關(guān)鍵詞,如果包含Java關(guān)鍵詞的句子超過該段落句子總數(shù)的一半,則判定該段落為代碼文本段落;
步驟三:對(duì)連續(xù)的代碼文本段落進(jìn)行整合,以保證代碼文本的完整性。
2.1.5.正文信息段落識(shí)別
剩余未識(shí)別部分即為正文信息段落。
2.2.郵件內(nèi)容中代碼元素的標(biāo)注
通過與當(dāng)前開源項(xiàng)目的代碼元素列表比對(duì),可以將開源項(xiàng)目郵件中的代碼元素按照來源分為兩類,一類是屬于當(dāng)前項(xiàng)目的代碼元素;一類是屬于其他項(xiàng)目的代碼元素。對(duì)當(dāng)前項(xiàng)目代碼元素的識(shí)別分為兩個(gè)步驟:
步驟一:對(duì)項(xiàng)目源碼進(jìn)行解析,抽取出其中的類、方法、接口等代碼元素;
步驟二:對(duì)郵件內(nèi)容去除停用詞后,將剩余單詞與之前抽取的代碼元素進(jìn)行匹配標(biāo)注;
對(duì)其他項(xiàng)目的代碼元素識(shí)別,按照java中變量命名的camelCase原則進(jìn)行識(shí)別。
3.提問郵件中問題信息的抽取
采取基于序列模式挖掘的問題句式挖掘方法。分為問題句式抽取,問題句選取,問題信息整合三個(gè)子模塊。
3.1.問題句式抽取
分為三個(gè)步驟:
步驟一:人工標(biāo)注郵件列表中的問題句;
步驟二:采用Stanford Tagger對(duì)問題句進(jìn)行詞性標(biāo)注;
步驟三:用SPMF實(shí)現(xiàn)的PrefixSpan算法挖掘問題句詞性序列中頻繁的序列作為問題句式的模式;
3.2.問題句選取
在抽取出問題句模式的基礎(chǔ)上,對(duì)提問郵件中的句子進(jìn)行評(píng)分,評(píng)分規(guī)則如下:
規(guī)則一:每匹配一個(gè)模式,加1分;
規(guī)則二:以問號(hào)結(jié)尾,加1分;
規(guī)則三:候選句中出現(xiàn)郵件標(biāo)題詞或代碼元素,加1分;
評(píng)分結(jié)束后,選取評(píng)分最高的句子作為問題句。
3.3.問題信息整合
單一的問題句通常很難表達(dá)提問者的所有信息,本文選取以下三類信息作為問題句的上下文:
信息一:問題句前后文本。問題句通常是簡短的一句話,其前后文本會(huì)對(duì)問題的場景等信息進(jìn)行較詳細(xì)的描述。本文將問題句所在的段落視為問題句的前后文本。
信息二:與問題句臨近的代碼文本段落。開發(fā)人員在提問時(shí)通常會(huì)附上出現(xiàn)問題的代碼片段。與問題句臨近的代碼文本段落可以進(jìn)一步明確問題來源。
信息三:與問題句臨近的異常信息段落。異常文本信息可以幫助專業(yè)人士高效得地定位和解決問題,與問題句臨近的異常信息段落是提問者對(duì)異常的描述,應(yīng)當(dāng)歸為問題信息。
4.郵件會(huì)話中答案信息的抽取
答案信息抽取實(shí)質(zhì)是一個(gè)檢索的過程,即在郵件會(huì)話的眾多郵件中定位到最滿意的答案郵件。分為基于內(nèi)容特征查找候選答案郵件,基于非內(nèi)容特征核算權(quán)值兩個(gè)子模塊。最后選取權(quán)重得分最高的郵件作為回答信息。
4.1.基于內(nèi)容特征查找候選答案郵件
根據(jù)提問郵件中的問題信息構(gòu)造查詢后,選擇檢索模型查找候選答案郵件。
4.1.1.構(gòu)造查詢
選擇問題信息中的三類詞匯作為查詢:
一:郵件標(biāo)題中的內(nèi)容詞;
二:問題句中的內(nèi)容詞以及問題句段落的代碼元素;
三:異常文本段落的異常信息詞匯;
4.1.2.文本檢索
在提問郵件的所有回復(fù)郵件中進(jìn)行檢索,檢索使用開源工具Lucene的向量空間模型(VSM),選取檢索結(jié)果中的前三封郵件作為三個(gè)候選答案郵件。
4.2.基于非內(nèi)容特征核算權(quán)值
選取作者權(quán)威度、郵件位置以及回復(fù)郵件的態(tài)度三種特征輔助回答信息的選取。三種特征的量化說明如下:
作者權(quán)威度:將郵件作者分為項(xiàng)目開發(fā)人員、資深用戶和普通用戶三類,項(xiàng)目開發(fā)人員的郵件權(quán)重加1,資深用戶的郵件權(quán)重加0.5,普通用戶的郵件權(quán)重加0;根據(jù)項(xiàng)目開發(fā)人員名單確定作者是否為項(xiàng)目開發(fā)人員,凡是回復(fù)郵件數(shù)量大于100的人員都記為資深人員,其他的為普通用戶;
郵件位置:對(duì)三個(gè)候選答案郵件進(jìn)行比較,根據(jù)回復(fù)時(shí)間從后往前郵件的權(quán)重分值依次加{1,0.5,0};
回應(yīng)郵件的態(tài)度:在郵件會(huì)話中,若提問郵件作者對(duì)答復(fù)郵件做出了肯定的回復(fù),答復(fù)郵件權(quán)重加0.5分;若提問郵件對(duì)答復(fù)郵件提出了質(zhì)疑,答復(fù)郵件權(quán)重減0.5分。哈佛大學(xué)的GI(General Inquirer)評(píng)價(jià)詞典收錄了近2000個(gè)褒義詞和2000個(gè)貶義詞,本發(fā)明根據(jù)該詞典,若回復(fù)郵件中的最后一句中出現(xiàn)正性詞匯(如good,cool)次數(shù)較多,則視為肯定;若負(fù)性詞匯較多,則視為否定。
與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:
依據(jù)序列模式挖掘的問題句提取方法相較于傳統(tǒng)的基于疑問詞的問題句提取方法在準(zhǔn)確率上有明顯提高。本發(fā)明在驗(yàn)證時(shí)人工標(biāo)注了300封來自開源項(xiàng)目Lucene和Tomcat的郵件的問題句,分別與上述兩種方法提取的問題句進(jìn)行了比較?;谝蓡栐~的傳統(tǒng)方法準(zhǔn)確率為78.64%,本發(fā)明使用的基于序列模式挖掘的方法可以取得88.17%的準(zhǔn)確率,有顯著提升。
附圖說明
圖1為軟件問答信息抽取工具示意圖。
圖2為多線程mbox文件爬取框架。
圖3為郵件內(nèi)容分段算法流程圖。
圖4為郵件內(nèi)容分類流程圖。
圖5為冗余文本段落識(shí)別流程圖。
圖6為郵件引用段落識(shí)別流程圖。
圖7為異常信息段落識(shí)別流程圖。
圖8為提問郵件問題句標(biāo)注流程圖。
圖9為郵件會(huì)話答案信息抽取流程圖。
具體實(shí)施方式
實(shí)施例:通過本方法的處理,由一個(gè)郵件對(duì)話實(shí)例得到的問答信息如表1所示。
表1為問答信息
具體實(shí)施步驟如下:
步驟1:參照?qǐng)D2,從郵件歸檔服務(wù)器上爬取Unix mbox格式的郵件歸檔文件。
步驟2:解析爬取的郵件,解析包括以下子步驟:
步驟2.1:依據(jù)頭部域?qū)box文件分割成多封單獨(dú)的郵件;
步驟2.2:解析每一封郵件,將其保存為郵件實(shí)體類;
步驟2.3:對(duì)于每一封“InReplyTo”域(回復(fù)信息域)為空的郵件,將其設(shè)為一個(gè)會(huì)話的提問郵件,然后從mbox的其他郵件中查找“InReplyTo”域值為該提問郵件“MessageID”(郵件標(biāo)識(shí)ID)的郵件,將其加入會(huì)話;
步驟2.4:對(duì)新加入的郵件執(zhí)行步驟2.3,將“InReplyTo”域?yàn)樵撪]件的“MessageID”的郵件加入會(huì)話;
步驟2.5:重復(fù)步驟2.4直到?jīng)]有新郵件加入會(huì)話。
經(jīng)過上述五個(gè)步驟,將同一主題下的郵件組織成郵件對(duì)話的形式。
步驟3:對(duì)郵件內(nèi)容進(jìn)行分段。分段包括以下子步驟:
步驟3.1:從數(shù)據(jù)庫中讀取郵件內(nèi)容,按換行符“\n”將內(nèi)容分割為多個(gè)行;
步驟3.2:忽略郵件頭部的多個(gè)空行;
步驟3.3:從第一個(gè)非空行開始為一個(gè)段落的開始,直到遇到下一個(gè)空行;
步驟3.4:重復(fù)步驟3.3直到郵件末尾;
完成郵件內(nèi)容的分段后需要根據(jù)郵件內(nèi)容的不同屬性把郵件內(nèi)容分為:冗余文本段落、郵件引用段落、異常信息段落、代碼文本段落、正文信息段落,共五種段落。識(shí)別方法為依次識(shí)別前四種,剩下的內(nèi)容即為正文信息段落。具體的識(shí)別步驟如下:
步驟4:冗余文本段落識(shí)別。包括2個(gè)子步驟:
步驟4.1:檢測郵件第一段落的前兩句,如句子簡短,包含“Hi”,“Hello”等問候詞匯。若是問候句則將該句從當(dāng)前段落移除,劃分到冗余文本段落。
步驟4.2:郵件結(jié)尾之前的兩個(gè)段落如果只包含兩個(gè)以內(nèi)短句(單詞數(shù)目不超過5的句子被視為短句)或包含人名(以大寫開頭的單詞)、感謝語,則劃分到冗余文本段落。
步驟5:郵件引用段落識(shí)別,包括3個(gè)子步驟:
步驟5.1:正則匹配段落的第一句,看是否匹配“On[Date][somebody]wrote:”(某人在某天寫道)的句式;
步驟5.2:判斷以“>”開始的行數(shù)是否超過段落總行數(shù)的80%;
步驟5.3:如果兩個(gè)步驟中判斷均為是,則劃分到郵件引用段落。
步驟6:異常信息段落識(shí)別。Java程序的異常信息有一些固定的模式,以行為單位,可將Java的異常信息分為以下四類:
(1)異常描述行,位于異常文本的開始,是對(duì)異常信息進(jìn)行描述的行,該行的特征是包含“exception”或者“error”等詞語;
(2)位于行,是以“at”開始的行,表明堆棧信息中某個(gè)方法的行號(hào);
(3)導(dǎo)致行,是以“caused by:”開始的行,通常是說明異常出現(xiàn)的原因及位置;
(4)省略行,省略過多的非關(guān)鍵異常信息,以省略號(hào)開頭,以數(shù)字后接“more”結(jié)尾。
異常信息段落識(shí)別包括3個(gè)子步驟:
步驟6.1:統(tǒng)計(jì)總行數(shù)和位于行的行數(shù);
步驟6.2:查找導(dǎo)致行和省略行;
步驟6.3:若位于行的行數(shù)占總行數(shù)比例超過70%且存在導(dǎo)致行和省略行,則認(rèn)為該段落是異常信息段落。
步驟7:代碼文本段落識(shí)別,包括3個(gè)子步驟:
步驟7.1:使用antlr提供的語法解析器,自定義java代碼塊語法,從郵件文本段落中抽取符合語法的文本塊;
步驟7.2:對(duì)于文本段落中的每一句話,判斷是否包含Java關(guān)鍵詞,如果包含Java關(guān)鍵詞的句子超過總數(shù)的一半,如果超過一半則判定為代碼文本段落;
步驟7.3:對(duì)連續(xù)的代碼文本段落進(jìn)行整合,以保證代碼文本的完整性;
步驟8:郵件內(nèi)容中代碼元素的標(biāo)注。根據(jù)開源項(xiàng)目的代碼元素列表,可以把開源項(xiàng)目郵件中的代碼元素按照來源分為兩類,一類是屬于當(dāng)前項(xiàng)目的代碼元素;一類是屬于其他項(xiàng)目的代碼元素。對(duì)當(dāng)前項(xiàng)目代碼元素的識(shí)別分為兩個(gè)步驟:
步驟8.1:對(duì)項(xiàng)目源碼進(jìn)行解析,抽取出其中的類、方法、接口等代碼元素;
步驟8.2:對(duì)郵件內(nèi)容去除停用詞后,將剩余單詞與之前抽取的代碼元素進(jìn)行匹配標(biāo)注;
對(duì)其他項(xiàng)目的代碼元素識(shí)別,按照java中變量命名的camelCase原則進(jìn)行識(shí)別。
提問郵件中問題信息的抽取采取基于序列模式挖掘的問題句式挖掘方法。分為問題句式抽取,問題句選取,問題信息整合三個(gè)步驟。
步驟9:問題句式抽取,包括三個(gè)子步驟:
步驟9.1:人工標(biāo)注郵件列表中的問題句;
步驟9.2:采用Stanford Tagger對(duì)問題句進(jìn)行詞性標(biāo)注;
步驟9.3:用PrefixSpan算法挖掘問題句詞性序列中頻繁的序列作為問題句式的模式;
步驟10:問題句選取,在抽取出問題句模式的基礎(chǔ)上,對(duì)提問郵件中的句子進(jìn)行評(píng)分,評(píng)分規(guī)則如下:
規(guī)則一:每匹配一個(gè)模式,加1分;
規(guī)則二:以問號(hào)結(jié)尾,加1分;
規(guī)則三:候選句中出現(xiàn)郵件標(biāo)題詞或代碼元素,加1分;
評(píng)分結(jié)束后,選取評(píng)分最高的句子作為問題句。
步驟11:問題信息整合。單一的問題句通常很難表達(dá)提問者的所有信息本文選取以下三類信息作為問題句的上下文:
信息一:問題句前后文本。問題句通常是簡短的一句話,其前后文本會(huì)對(duì)問題的場景等信息進(jìn)行較詳細(xì)的描述。本文將問題句所在的段落視為問題句的前后文本。
信息二:與問題句臨近的代碼文本段落。開發(fā)人員在提問時(shí)通常會(huì)附上出現(xiàn)問題的代碼片段。與問題句臨近的代碼文本段落可以進(jìn)一步明確問題來源。
信息三:與問題句臨近的異常信息段落。異常文本信息可以幫助專業(yè)人士高效得地定位和解決問題,與問題句臨近的異常信息段落是提問者對(duì)異常的描述,應(yīng)當(dāng)歸為問題信息。
完成提問信息的抽取后,進(jìn)行郵件會(huì)話中答案信息的抽取答案信息抽取實(shí)質(zhì)是一個(gè)檢索的過程,即在郵件會(huì)話的眾多郵件中定位到最滿意的答案郵件。分為基于內(nèi)容特征查找候選答案郵件,基于非內(nèi)容特征核算權(quán)值兩個(gè)步驟。最后選取權(quán)重得分最高的郵件作為回答信息。
步驟12:基于內(nèi)容特征查找候選答案郵件。根據(jù)提問郵件中的問題信息構(gòu)造查詢后,選擇檢索模型查找候選答案郵件。分為以下兩個(gè)子步驟:
步驟12.1:構(gòu)造查詢。選擇問題信息中的三類詞匯作為查詢:郵件標(biāo)題中的內(nèi)容詞、問題句中的內(nèi)容詞以及問題句段落的代碼元素、異常文本段落的異常信息詞匯;
步驟12.2:文本檢索。在提問信息所在郵件的所有回復(fù)郵件中進(jìn)行檢索,檢索使用開源工具Lucene的向量空間模型(VSM),選取檢索結(jié)果中的前三封郵件作為三個(gè)候選答案郵件。
步驟13:基于非內(nèi)容特征核算權(quán)值。選取作者權(quán)威度、郵件位置以及回復(fù)郵件的態(tài)度三種特征輔助回答信息的選取。從三封候選答復(fù)郵件中選取特征得分最高的一封郵件作為回答信息。三種特征的量化說明如下:
作者權(quán)威度:將郵件作者分為項(xiàng)目開發(fā)人員、資深用戶和普通用戶三類,項(xiàng)目開發(fā)人員的郵件權(quán)重加1,,資深用戶的郵件權(quán)重加0.5,普通用戶的郵件權(quán)重加0;
郵件位置:對(duì)三個(gè)候選答案郵件進(jìn)行比較,根據(jù)回復(fù)時(shí)間從后往前郵件的權(quán)重分值依次加{1,0.5,0};
回應(yīng)郵件的態(tài)度:在郵件會(huì)話中,若提問郵件作者對(duì)答復(fù)郵件做出了肯定的回復(fù),答復(fù)郵件權(quán)重加0.5分;若提問郵件對(duì)答復(fù)郵件提出了質(zhì)疑,答復(fù)郵件權(quán)重減0.5分。
步驟14:將步驟10得到的問題句和步驟13得到的回復(fù)信息整合在一起,得到一封郵件的問答信息。
本文中所描述的具體實(shí)施例僅僅是對(duì)本發(fā)明精神作舉例說明。本發(fā)明所屬技術(shù)領(lǐng)域的技術(shù)人員可以對(duì)所描述的具體實(shí)施例做各種各樣的修改或補(bǔ)充或采用類似的方式替代,但并不會(huì)偏離本發(fā)明的精神。