阮書(shū)鶴 鐘林輝 高榮錦 祝艷霞 陳浩然 盧騰駿 夏子豪
摘 要:Stack Overflow是一個(gè)計(jì)算機(jī)領(lǐng)域的IT技術(shù)問(wèn)答網(wǎng)站,為了獲取問(wèn)答網(wǎng)站中的專(zhuān)家示例并將其應(yīng)用于A(yíng)PI挖掘中。首先采用Scrapy爬蟲(chóng)框架技術(shù)獲取Stack Overflow問(wèn)答網(wǎng)站中的結(jié)構(gòu)化數(shù)據(jù),并存儲(chǔ)在關(guān)系模式中;再使用本體建模工具Protégé構(gòu)建本體,然后使用D2RQ工具實(shí)現(xiàn)對(duì)關(guān)系數(shù)據(jù)庫(kù)的知識(shí)抽取,將關(guān)系模式轉(zhuǎn)換為三元組形式的本體模型;同時(shí),提出了一個(gè)面向?qū)<沂纠淖颖倔w抽取算法,用于從原本體中抽取出專(zhuān)家示例推理相關(guān)的子本體,并提出了若干條專(zhuān)家示例推理規(guī)則,能推導(dǎo)出專(zhuān)家所編寫(xiě)的代碼示例。實(shí)驗(yàn)結(jié)果證明,從Stack Overflow本體模型中抽取的專(zhuān)家示例能提高API調(diào)用序列挖掘的準(zhǔn)確率。
關(guān)鍵詞:Stack Overflow問(wèn)答網(wǎng)站; 本體; 本體構(gòu)建; 專(zhuān)家示例推理規(guī)則; 專(zhuān)家示例
中圖分類(lèi)號(hào):TP391?? 文獻(xiàn)標(biāo)志碼:A?? 文章編號(hào):1001-3695(2023)12-033-3736-06
doi:10.19734/j.issn.1001-3695.2023.03.0145
Research on expert code example oriented ontology construction and reasoning for Stack Overflow
Abstract:Stack Overflow is an IT technology Q&A website in the computer field. In order to obtain expert examples in the Q&A website and apply them to API mining, this paper firstly used the Scrapy crawler framework technology to obtain structured data in the Stack Overflow Q&A website and store it in the relational model. Then it used the ontology modeling tool Protégé to build the ontology, and then used the D2RQ tool to achieve the knowledge extraction of the relational database, and transformed the relational model into the ontology model in the form of triplets. At the same time, this article proposed a sub ontology extraction algorithm for expert examples, and used it to extract sub ontologies related to expert example reasoning from the original ontology, and proposed several expert example reasoning rules that could derive expert examples. The experimental results demonstrate that extracting expert examples from the Stack Overflow ontology model can improve the accuracy of API call sequence mining.
Key words:Stack Overflow Q&A website; ontology; ontology construction; expert example reasoning rules; expert example
0 引言
用戶(hù)是Stack Overflow社區(qū)的參與者,在社區(qū)用戶(hù)可以發(fā)表帖子、提出相關(guān)問(wèn)題、回答相關(guān)問(wèn)題、對(duì)帖子進(jìn)行投票、發(fā)表評(píng)論和編輯帖子等操作,實(shí)現(xiàn)用戶(hù)之間的交互和知識(shí)的分享。然而,目前針對(duì)Stack Overflow的本體建模研究還比較少,特別是面向特定領(lǐng)域的Stack Overflow本體建模尚未有研究,例如面向API領(lǐng)域,能挖掘出有價(jià)值的、專(zhuān)家書(shū)寫(xiě)的代碼示例。因此,本文以Stack Overflow問(wèn)答網(wǎng)站的數(shù)據(jù)信息為研究對(duì)象,利用本體建模工具Protégé構(gòu)建Stack Overflow問(wèn)答網(wǎng)站本體模型;然后,為了實(shí)現(xiàn)面向API領(lǐng)域的知識(shí)共享和利用,即通過(guò)規(guī)則推理方法獲取Stack Overflow問(wèn)答網(wǎng)站中的專(zhuān)家示例,本文提出了一個(gè)Stack Overflow子本體抽取算法,篩選出API挖掘時(shí)所需的推導(dǎo)專(zhuān)家示例有關(guān)的本體;最后介紹了推理出有價(jià)值的專(zhuān)家示例的推理規(guī)則,并在A(yíng)PI挖掘中的實(shí)驗(yàn)驗(yàn)證其過(guò)程及效果。
1 本體構(gòu)建相關(guān)研究
領(lǐng)域本體指的是專(zhuān)業(yè)性的本體,其描述的是特定領(lǐng)域中概念與概念之間的關(guān)系。構(gòu)建領(lǐng)域本體能夠更為合理有效地進(jìn)行知識(shí)表示。
文獻(xiàn)[1]在基于構(gòu)件的軟件配置管理模型的基礎(chǔ)上,設(shè)計(jì)了構(gòu)件化軟件演化信息本體模型,提出了構(gòu)件化軟件共同變化模式和相應(yīng)的本體推理規(guī)則。文獻(xiàn)[2]通過(guò)Stack Overflow問(wèn)答社區(qū)中的架構(gòu)知識(shí)概念開(kāi)發(fā)了一個(gè)本體,該本體捕獲了架構(gòu)相關(guān)的信息,并支持實(shí)現(xiàn)從業(yè)者的需求和關(guān)注點(diǎn)。文獻(xiàn)[3]設(shè)計(jì)了構(gòu)件化軟件演化信息本體模型,并提出了構(gòu)件化軟件的共同變化模式和相應(yīng)的本體推理規(guī)則。文獻(xiàn)[4]提出了一種基于多類(lèi)軟件本體的惡意軟件語(yǔ)義描述模型,基于OWL本體的知識(shí)表示方法,通過(guò)軟件行為和軟件結(jié)構(gòu)信息實(shí)現(xiàn)對(duì)惡意軟件語(yǔ)義的描述。文獻(xiàn)[5]提出了一個(gè)軟件安全模式的本體,對(duì)安全需求、安全模式以及應(yīng)用環(huán)境進(jìn)行語(yǔ)義建模,在此基礎(chǔ)上定義推理規(guī)則,利用Jena推理機(jī)實(shí)現(xiàn)了一個(gè)安全模式的查詢(xún)系統(tǒng)。文獻(xiàn)[6]建立了一個(gè)軟件安全性需求本體模型,實(shí)現(xiàn)了軟件安全性需求形式化建模和驗(yàn)證的工具原型。文獻(xiàn)[7]提出了一個(gè)支持軟件知識(shí)共享的本體模型,根據(jù)軟件開(kāi)發(fā)知識(shí)的內(nèi)容、特點(diǎn)以及它們之間的關(guān)系,對(duì)軟件開(kāi)發(fā)知識(shí)進(jìn)行了形式化的表示,并創(chuàng)建了軟件開(kāi)發(fā)知識(shí)本體和軟件開(kāi)發(fā)知識(shí)本體規(guī)則。本文主要研究如何構(gòu)建計(jì)算機(jī)領(lǐng)域的Stack Overflow問(wèn)答網(wǎng)站本體,并通過(guò)規(guī)則推理方法得到專(zhuān)家示例。
2 Stack Overflow本體模型的構(gòu)建
2.1 Stack Overflow本體構(gòu)建流程
本文在七步法的基礎(chǔ)上提出的Stack Overflow本體構(gòu)建的詳細(xì)流程如圖1所示。
在第一步中,本文明確了需要構(gòu)建的本體模型的領(lǐng)域和范疇,即本文構(gòu)建的是面向API挖掘和代碼示例的Stack Overflow問(wèn)答網(wǎng)站本體模型。
在第二步中,本文查閱并借鑒了關(guān)于Stack Overflow問(wèn)答網(wǎng)站知識(shí)圖構(gòu)建的文獻(xiàn),并從文獻(xiàn)[8]中借鑒了已有的研究?jī)?nèi)容,復(fù)用了部分作為本體內(nèi)容。
在第三~六步中,本文通過(guò)分析爬取的Stack Overflow問(wèn)答網(wǎng)站結(jié)構(gòu)化數(shù)據(jù),從中提取并列出本體中的重要概念和術(shù)語(yǔ),從而完成了本體概念以及概念間層次關(guān)系、數(shù)據(jù)屬性關(guān)系、對(duì)象屬性關(guān)系的定義。在完成Stack Overflow本體模型的構(gòu)建工作后,本文進(jìn)行了本體模型的檢驗(yàn)工作,即通過(guò)Protégé本體建模工具中自帶的HermiT推理機(jī)進(jìn)行推理檢驗(yàn),從而修正并完善Stack Overflow本體模型。
在第七步中,本文通過(guò)D2RQ工具將存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)換為三元組形式的本體數(shù)據(jù),由此完成本體實(shí)例化的工作。
2.2 問(wèn)答數(shù)據(jù)的獲取
本文為了能夠?qū)崟r(shí)獲取最新的問(wèn)答信息數(shù)據(jù),采用Scrapy框架來(lái)爬取Stack Overflow帖子的詳情數(shù)據(jù)。通過(guò)Stack Overflow網(wǎng)頁(yè)中問(wèn)題的標(biāo)簽信息來(lái)篩選獲取Java相關(guān)技術(shù)框架,如Netty、Apachecamel、drools等代碼示例等信息。但是Stack Overflow社區(qū)中存在大量沒(méi)有用戶(hù)回答的待解決的問(wèn)題帖,以及部分帖子只有自然語(yǔ)言描述的回答內(nèi)容,回答用戶(hù)沒(méi)有編寫(xiě)相關(guān)代碼示例。對(duì)于這類(lèi)數(shù)據(jù)信息,本文將它們從數(shù)據(jù)樣本中刪除。此外,本文還對(duì)有代碼示例回答信息的帖子進(jìn)行初步篩選,主要是通過(guò)正則表達(dá)式將較完整的代碼示例篩選出來(lái)。獲取的數(shù)據(jù)集如表1所示。
2.3 Stack Overflow問(wèn)答社區(qū)本體模型的構(gòu)建實(shí)現(xiàn)
Stack Overflow問(wèn)答社區(qū)的本體模型描述了Stack Overflow問(wèn)答社區(qū)中的各個(gè)概念之間的關(guān)系。文獻(xiàn)[8]面向開(kāi)源軟件項(xiàng)目構(gòu)建了一個(gè)軟件知識(shí)圖譜,其中有四種不同類(lèi)型的軟件資源,包括了對(duì)問(wèn)答文檔的軟件知識(shí)實(shí)體的提取以及問(wèn)答文檔知識(shí)實(shí)體之間關(guān)系的建立。該文獻(xiàn)問(wèn)答信息的獲取也是來(lái)自于Stack Overflow問(wèn)答網(wǎng)站。本文借鑒了文獻(xiàn)[8]中建立的問(wèn)答文檔知識(shí)圖,并在其研究結(jié)果的基礎(chǔ)上提出了自己的內(nèi)容,再結(jié)合經(jīng)典的領(lǐng)域本體的構(gòu)建方法——七步法,最終完成了本體模型的構(gòu)建。對(duì)于文獻(xiàn)[8]中提出的問(wèn)答文檔知識(shí)圖和本文提出的Stack Overflow本體的不同之處,將在圖2進(jìn)行表示。圖2中紅色實(shí)線(xiàn)標(biāo)記的地方為本文不同于文獻(xiàn)[8]的內(nèi)容,用藍(lán)色虛線(xiàn)標(biāo)記的為文獻(xiàn)[8]獨(dú)有的內(nèi)容,黑色實(shí)線(xiàn)標(biāo)記為共有內(nèi)容(參見(jiàn)電子版)。
2.3.1 概念
在本文構(gòu)建的Stack Overflow問(wèn)答社區(qū)本體模型中一共描述了16個(gè)概念,分別是文本回答(answer)類(lèi)、代碼示例(code)類(lèi)、評(píng)論(comment)類(lèi),以及它的兩個(gè)子類(lèi)(回答評(píng)論(answer_comment)類(lèi)和問(wèn)題評(píng)論(question_comment)類(lèi))、問(wèn)題(question)類(lèi)、標(biāo)簽(tag)類(lèi)、用戶(hù)(user)類(lèi),以及它的四個(gè)子類(lèi)(編輯用戶(hù)(editor)類(lèi)、提問(wèn)用戶(hù)(questioner)類(lèi)、回答用戶(hù)(respondent)類(lèi)、評(píng)論用戶(hù)(reviewer)類(lèi))。其中,編輯用戶(hù)類(lèi)包含問(wèn)題編輯用戶(hù)(question_editor)類(lèi)和回答編輯用戶(hù)(answer_editor)類(lèi)兩個(gè)子類(lèi),評(píng)論用戶(hù)類(lèi)包含問(wèn)題評(píng)論用戶(hù)(question_reviewer)類(lèi)和回答評(píng)論用戶(hù)(answer_reviewer)類(lèi)兩個(gè)子類(lèi)。在圖2中,本文描述的概念都用紅色標(biāo)記的矩形表示。文獻(xiàn)[8]的問(wèn)答信息數(shù)據(jù)是通過(guò)下載第三方網(wǎng)站發(fā)布的數(shù)據(jù)包獲取的,提取出了問(wèn)題、答案、問(wèn)答評(píng)論、問(wèn)答用戶(hù)共四個(gè)實(shí)體(圖2中被藍(lán)色虛線(xiàn)標(biāo)記屬性的實(shí)體)。由于本文構(gòu)建的是面向API挖掘領(lǐng)域的Stack Overflow本體模型,主要是為了能夠從本體模型中通過(guò)推理得到專(zhuān)家示例,所以問(wèn)答帖的回答用戶(hù)信息和他們編寫(xiě)的代碼示例信息是本文必須得到的重要信息內(nèi)容。因此本文將答案實(shí)體類(lèi)分為文本回答類(lèi)和代碼示例類(lèi)。表2為Stack Overflow問(wèn)答社區(qū)本體模型主要概念的詳細(xì)介紹。
2.3.2 對(duì)象屬性關(guān)系
本模型包含15個(gè)對(duì)象屬性關(guān)系,分別是ask、associated_with、belong_to、comment及其子關(guān)系commentQuestion和commentAnswer、compile、write、corresponding_to、edit及其子關(guān)系editQuestion和editAnswer、hasComment及其子關(guān)系hasQuestion Comment和hasAnswerComment。表3介紹了主要的對(duì)象屬性關(guān)系。在圖2中,本文將對(duì)象屬性關(guān)系用紅色帶箭頭的實(shí)線(xiàn)和紅色英文字體標(biāo)注。文獻(xiàn)[8]則只是定義了四個(gè)關(guān)聯(lián)關(guān)系,分別是問(wèn)題和答案之間的“答案關(guān)系”,問(wèn)題和問(wèn)答評(píng)論以及答案和問(wèn)答評(píng)論之間的“評(píng)論關(guān)系”,問(wèn)題和問(wèn)題間的“重復(fù)關(guān)系”,問(wèn)答用戶(hù)和問(wèn)題、問(wèn)答用戶(hù)和答案、問(wèn)答用戶(hù)和問(wèn)答評(píng)論之間的“作者關(guān)系”。在圖2中,本文將這四個(gè)關(guān)聯(lián)關(guān)系用藍(lán)色虛線(xiàn)和藍(lán)色字體標(biāo)注。
除了以上說(shuō)明的15個(gè)對(duì)象屬性關(guān)系之外,每個(gè)對(duì)象屬性關(guān)系都有它們相對(duì)應(yīng)的逆關(guān)系,例如ask的逆關(guān)系為beAskedBy,表示問(wèn)題被問(wèn)題用戶(hù)提出;belong_to的逆關(guān)系為包含(contain),表示一個(gè)標(biāo)簽包含了多個(gè)具體的問(wèn)題;comment的逆關(guān)系為beCommentedBy,表示評(píng)論被評(píng)論用戶(hù)提出;對(duì)象屬性關(guān)系中的associated_with 和corresponding_to相對(duì)特殊,它們具有對(duì)稱(chēng)性(symmetric)。
2.3.3 數(shù)據(jù)屬性關(guān)系
本文根據(jù)獲取的Stack Overflow問(wèn)答信息數(shù)據(jù)總結(jié)出的部分主要的數(shù)據(jù)屬性關(guān)系如表4所示。文獻(xiàn)[8]表述的問(wèn)答文檔的軟件知識(shí)實(shí)體的屬性信息和本文表述的問(wèn)答社區(qū)本體中的數(shù)據(jù)屬性關(guān)系大部分相同,其中問(wèn)題實(shí)體的屬性有標(biāo)題、內(nèi)容、評(píng)分等,答案實(shí)體的屬性有答案內(nèi)容、評(píng)分等,評(píng)論實(shí)體的屬性有評(píng)論內(nèi)容、評(píng)分等,用戶(hù)實(shí)體的屬性有用戶(hù)顯示名稱(chēng)、用戶(hù)聲望等,這些屬性的含義都與本文中所描述的相關(guān)數(shù)據(jù)屬性關(guān)系一致。在圖2中,屬性都由橢圓表示,其中黑色標(biāo)記的橢圓為共有的屬性,藍(lán)色虛線(xiàn)標(biāo)記的橢圓為文獻(xiàn)[8]中描述的而本文沒(méi)有的屬性,紅色實(shí)線(xiàn)標(biāo)記的橢圓為本文提出的屬性。
2.4 基于關(guān)系數(shù)據(jù)庫(kù)的知識(shí)抽取
為了自動(dòng)地構(gòu)建獲取的數(shù)據(jù)(2.1節(jié))與本體模式(2.2節(jié))之間的映射關(guān)系,本文將獲取的問(wèn)答社區(qū)數(shù)據(jù)信息存儲(chǔ)在MySQL關(guān)系數(shù)據(jù)庫(kù)中,并利用D2RQ工具來(lái)完成這一操作步驟。D2RQ是目前主流的關(guān)聯(lián)數(shù)據(jù)發(fā)布工具之一,通過(guò)類(lèi)與屬性的映射實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)向RDF關(guān)聯(lián)數(shù)據(jù)格式的轉(zhuǎn)換與發(fā)布,同時(shí)支持SPARQL語(yǔ)言的語(yǔ)義檢索與查詢(xún)[9]。本文利用D2RQ對(duì)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行知識(shí)抽取,即通過(guò)一個(gè)可個(gè)性化定制的D2RQ mapping file,這個(gè)映射文件通過(guò)一系列映射規(guī)則生成,再利用D2RQ引擎對(duì)映射文件中的規(guī)則進(jìn)行解析,最后將關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)換為RDF形式的三元組本體數(shù)據(jù)。
基于上一節(jié)中提到的本體概念模型,本文在MySQL關(guān)系數(shù)據(jù)庫(kù)中構(gòu)建了與實(shí)體類(lèi)相對(duì)應(yīng)的數(shù)據(jù)表,如answer、question、code、questioner、respondent、tag等,數(shù)據(jù)表中的字段對(duì)應(yīng)本體中的屬性;除此之外,本文另外單獨(dú)建了數(shù)據(jù)表來(lái)表示實(shí)體類(lèi)中多對(duì)多的對(duì)象屬性關(guān)系,如數(shù)據(jù)表question_to_tag存儲(chǔ)的是問(wèn)題類(lèi)與標(biāo)簽類(lèi)之間的多對(duì)多關(guān)系。answer實(shí)體類(lèi)的部分映射代碼如下所示。
# table answer
map:answer a d2rq:ClassMap; // 定義answer類(lèi)
d2rq:dataStorage map:database;
d2rq:uriPattern "answer/@@answer.answer_id@@";
d2rq:class :answer;
d2rq:classDefinitionLabel "answer";
map:answer_question_id__ref a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:answer;
d2rq:property :associated_with; // 對(duì)象屬性名
d2rq:refersToClassMap map:question;
d2rq:join"answer.question_id=>question.question_id";
3 面向?qū)<沂纠腟tack Overflow子本體抽取算法
3.1 算法思想
子本體抽取是指從某個(gè)基礎(chǔ)性的源本體抽取出來(lái)的獨(dú)立完整的,且能滿(mǎn)足特定需要的子本體,其中源本體中被抽取的部分在子本體中被重用。為了便于后面本體推理研究工作中專(zhuān)家示例的推理,提出了一個(gè)Stack Overflow子本體抽取算法用于將本文推理專(zhuān)家示例時(shí)需要的本體內(nèi)容(如代碼示例等)抽取出來(lái)。Stack Overflow子本體抽取算法對(duì)應(yīng)的偽代碼如下:
算法 將Stack Overflow本體中對(duì)本文后續(xù)的專(zhuān)家示例推理工作用不到的概念及其實(shí)例、屬性以及實(shí)例間的關(guān)系進(jìn)行刪除,得到一個(gè)便于專(zhuān)家示例推理的Stack Overflow子本體
輸入:n個(gè)概念節(jié)點(diǎn)元組T1=(null,conceptName),…,Tn;(1≤n≤16)。
輸出:本體連通子圖G1={G1.V,G1.E}。
begin
讀取Stack Overflow本體文件,Stack Overflow本體表示為S={C,R1,R2,H,P,K,D},其中C為概念,D為概念與其下屬實(shí)例間的關(guān)系,P為屬性,H為實(shí)例,K為實(shí)例與屬性間的關(guān)系,R1為概念間的關(guān)系,R2為實(shí)例間的關(guān)系;
將Stack Overflow本體映射為連通圖G={G.V,G.E},頂點(diǎn)G.V={C,H,P},邊G.E={R1,R2,K,D};
對(duì)概念C映射的節(jié)點(diǎn)添加標(biāo)簽來(lái)進(jìn)行分類(lèi),用概念名(conceptName)進(jìn)行標(biāo)記,其中概念節(jié)點(diǎn)表示為元組T=(null,conceptName),其下屬的實(shí)例節(jié)點(diǎn)表示為T(mén)′=(instance information,conceptName),該實(shí)例節(jié)點(diǎn)被標(biāo)記的概念名就表示該節(jié)點(diǎn)歸屬哪一類(lèi),instance information存儲(chǔ)的是實(shí)例信息;
list need_list=new ArrayList(); /*構(gòu)造一個(gè)空列表用于存儲(chǔ)需要的本體概念節(jié)點(diǎn)*/
need_list.add(T);
for(G) //遍歷連通圖G中的節(jié)點(diǎn)
for(need_list) //遍歷所需的本體概念列表
if(列表中T的概念名標(biāo)簽和圖G中T的概念名標(biāo)簽不匹配) //該節(jié)點(diǎn)不需要
findEntity(T′,T); //找到此概念節(jié)點(diǎn)下屬的實(shí)例節(jié)點(diǎn)
findProperty(P,T′) //找到實(shí)例節(jié)點(diǎn)有關(guān)的屬性節(jié)點(diǎn)
deleteNode(P) //刪除屬性節(jié)點(diǎn)
deleteNode(T′) //刪除實(shí)例節(jié)點(diǎn)
deleteNode(T) //刪除此概念節(jié)點(diǎn)
return G1={G1.V,G1.E} ?/*得到新的連通子圖G1,G1.V,G1.E為本文保留的節(jié)點(diǎn)集和邊集*/
end if
end for
end for
end
該算法的輸入是概念節(jié)點(diǎn)元組T=(null,conceptName),輸出是用戶(hù)自己想要的Stack Overflow子本體連通圖G1={G1.V,G1.E}。算法首先通過(guò)讀取本體文件,根據(jù)本體模型將概念映射為節(jié)點(diǎn),概念間的關(guān)系映射為邊來(lái)構(gòu)建一個(gè)連通圖;隨后對(duì)連通圖中的節(jié)點(diǎn)進(jìn)行標(biāo)簽標(biāo)記,以它們的概念名如用answer進(jìn)行標(biāo)記answer這個(gè)概念節(jié)點(diǎn)以及它下屬的各個(gè)實(shí)例節(jié)點(diǎn);隨后用戶(hù)將自己需要的概念節(jié)點(diǎn)加入列表中,再根據(jù)列表和圖將用戶(hù)不需要的概念節(jié)點(diǎn)以及其下屬的實(shí)例節(jié)點(diǎn)和屬性節(jié)點(diǎn)進(jìn)行刪除,形成新的原連通圖的子圖;最后將最終的連通子圖還原為子本體模型。
3.2 算法抽取結(jié)果
該算法是裁剪專(zhuān)家示例推理工作中不需要用到的冗余的本體內(nèi)容,以此來(lái)抽取出一個(gè)便于專(zhuān)家示例獲取的Stack Overflow子本體。而在本文后續(xù)工作提出的專(zhuān)家示例規(guī)則推理方法中沒(méi)有用到的本體實(shí)體類(lèi)有question_comment、answer、reviewer、question_reviewer、answer_reviewer。經(jīng)過(guò)算法抽取出的便于專(zhuān)家示例規(guī)則推理方法推導(dǎo)的Stack Overflow子本體結(jié)構(gòu)如圖3所示。
本文使用構(gòu)建的本體數(shù)據(jù)進(jìn)行Stack Overflow子本體抽取算法的驗(yàn)證,主要統(tǒng)計(jì)了本體數(shù)據(jù)中的實(shí)例個(gè)數(shù)、關(guān)系的個(gè)數(shù)(實(shí)例與實(shí)例間的關(guān)系和實(shí)例與屬性間的關(guān)系的個(gè)數(shù))、屬性個(gè)數(shù)、概念個(gè)數(shù)。Stack Overflow子本體抽取算法的抽取結(jié)果如表5所示。
4 專(zhuān)家示例推理規(guī)則及應(yīng)用
本文根據(jù)提出的專(zhuān)家示例推理規(guī)則從本體數(shù)據(jù)模型中推理得到專(zhuān)家示例,再將專(zhuān)家示例應(yīng)用于本研究團(tuán)隊(duì)之前開(kāi)發(fā)的BEMiner挖掘[10]中,以此驗(yàn)證本文得到的專(zhuān)家示例是否有價(jià)值。
專(zhuān)家示例指的是問(wèn)答網(wǎng)站中專(zhuān)家用戶(hù)編寫(xiě)的高質(zhì)量的代碼示例。Stack Overflow擁有一個(gè)協(xié)作編輯功能,允許整個(gè)社區(qū)共同編輯問(wèn)題和答案。Stack Overflow問(wèn)答社區(qū)的官方對(duì)協(xié)作編輯的描述為:一旦用戶(hù)獲得足夠的聲譽(yù)(2 000聲譽(yù)值以上),問(wèn)答社區(qū)相信該用戶(hù)能夠編輯社區(qū)中的內(nèi)容,如果該用戶(hù)看到了需要改進(jìn)的地方,鼓勵(lì)用戶(hù)進(jìn)行編輯改進(jìn)。他們認(rèn)為編輯對(duì)于保持問(wèn)題和答案的清晰性、相關(guān)性和最新程度很重要。根據(jù)對(duì)Stack Overflow問(wèn)答網(wǎng)站協(xié)作編輯功能的研究,本文初步認(rèn)為被編輯過(guò)的帖子內(nèi)容的質(zhì)量可能比較好,判斷Stack Overflow中的代碼示例是專(zhuān)家示例有以下標(biāo)準(zhǔn):a)被編輯后的代碼示例是高質(zhì)量代碼示例且編輯的用戶(hù)是專(zhuān)家用戶(hù);b)代碼示例解決的是一個(gè)高質(zhì)量且受歡迎的問(wèn)題,并且該問(wèn)題是被一名專(zhuān)家用戶(hù)所編輯過(guò)的。此外Stack Overflow也存在一個(gè)投票機(jī)制,用戶(hù)可以對(duì)問(wèn)答網(wǎng)站中的問(wèn)題以及回答內(nèi)容進(jìn)行投票,而投票數(shù)高的內(nèi)容則可以作為被許多用戶(hù)接受的高質(zhì)量?jī)?nèi)容。
本文將Stack Overflow中的專(zhuān)家用戶(hù)定義為能夠提供高質(zhì)量答案并且對(duì)問(wèn)答社區(qū)作出了許多貢獻(xiàn)的用戶(hù)。Stack Overflow也有一個(gè)聲譽(yù)系統(tǒng),聲譽(yù)系統(tǒng)用于衡量和鼓勵(lì)用戶(hù)對(duì)社區(qū)的貢獻(xiàn),用戶(hù)的行為和專(zhuān)業(yè)知識(shí)會(huì)得到聲譽(yù)系統(tǒng)的認(rèn)可和獎(jiǎng)勵(lì)。用戶(hù)通過(guò)提出好的問(wèn)題、回答有用的答案、對(duì)他人的答案或者回答的質(zhì)量進(jìn)行投票以及通過(guò)其他一些網(wǎng)站允許的活動(dòng)來(lái)獲得聲譽(yù)。Stack Overflow社區(qū)官方對(duì)聲譽(yù)的解釋是:聲譽(yù)粗略地衡量了社區(qū)對(duì)用戶(hù)的信任程度。聲譽(yù)越高的用戶(hù)也可以享有更多的網(wǎng)站特權(quán)。除了通過(guò)問(wèn)答獲得聲譽(yù),用戶(hù)還會(huì)因一些特別的幫助或者貢獻(xiàn)而獲得相應(yīng)的徽章?;照路譃榍嚆~徽章、銀徽章和金徽章三種。用戶(hù)所獲的徽章在一定程度上也能反映用戶(hù)的專(zhuān)業(yè)知識(shí)水平以及對(duì)社區(qū)的貢獻(xiàn)程度。因此本文將聲譽(yù)值以及徽章數(shù)達(dá)到一定數(shù)量的用戶(hù)作為專(zhuān)家用戶(hù)。
4.1 專(zhuān)家示例推理規(guī)則
本文提出的專(zhuān)家示例推理規(guī)則是由基于Jena的自定義推理規(guī)則與基于度量的規(guī)則相結(jié)合的推理規(guī)則兩種基本推理規(guī)則構(gòu)成,其中部分基于Jena自定義推理規(guī)則如下所示。
rule1:[(?c:beEditedAnswerBy ?e),(?c:associated_with ?q),(?q:belong_to ?t) ->(?c:is_candidate_expertCode_of ?t)]
規(guī)則1是關(guān)于被編輯過(guò)的回答的自定義規(guī)則。若代碼示例c已被回答編輯用戶(hù)編輯審查,且代碼示例c是關(guān)于解決問(wèn)題q的代碼示例,問(wèn)題q又屬于技術(shù)領(lǐng)域標(biāo)簽t,那么可以推導(dǎo)出代碼示例c是關(guān)于技術(shù)領(lǐng)域標(biāo)簽t的候選專(zhuān)家示例。
rule2:[(?q:beEditedQuestionBy ?e),(?q:belong_to ?t) ->(?q:isHQ_of ?t)
(?q:isHQ_of ?t) ->(?t:hasHQ ?q)
(?t:hasHQ ?q),(?q:associated_with ?c) ->(?t:has_candidate_expertCode ?c)]
規(guī)則2是根據(jù)高質(zhì)量問(wèn)題來(lái)獲取候選的專(zhuān)家示例。若問(wèn)題q被問(wèn)題編輯用戶(hù)e編輯審查過(guò),且問(wèn)題q屬于技術(shù)領(lǐng)域標(biāo)簽t,則可以得出問(wèn)題q是關(guān)于技術(shù)領(lǐng)域標(biāo)簽t的高質(zhì)量問(wèn)題的新關(guān)系;問(wèn)題q是關(guān)于技術(shù)領(lǐng)域標(biāo)簽t的高質(zhì)量問(wèn)題關(guān)系的逆關(guān)系:技術(shù)領(lǐng)域標(biāo)簽t擁有高質(zhì)量問(wèn)題q;若技術(shù)領(lǐng)域標(biāo)簽t擁有高質(zhì)量問(wèn)題q,而高質(zhì)量問(wèn)題q擁有能夠解決問(wèn)題的代碼示例c,那么技術(shù)領(lǐng)域標(biāo)簽t擁有候選專(zhuān)家示例c。
上述基于Jena的推理規(guī)則得到的是候選的專(zhuān)家示例,而候選的專(zhuān)家示例還需經(jīng)過(guò)度量規(guī)則的檢驗(yàn)才能得到最終的專(zhuān)家示例。本文提出的度量規(guī)則主要是根據(jù)用戶(hù)的聲譽(yù)值和徽章數(shù)等屬性來(lái)判斷專(zhuān)家用戶(hù),以及根據(jù)代碼示例的投票數(shù)屬性及計(jì)算其質(zhì)量分?jǐn)?shù)來(lái)作為代碼示例質(zhì)量的參考標(biāo)準(zhǔn),其中部分基于度量的推理規(guī)則如下所示。
rule3: [IF (ae_reputation>=AVG(ae_AllReputation) AND ae_gold>=AVG(ae_AllGold) AND ae_silver>=AVG(ae_AllSilver) AND ae_bronze>=AVG(ae_AllBronze)) THEN expertUserList.add(answer_editor).]
rule4:[IF (qe_reputation>=AVG(qe_AllReputation) AND qe_gold>=AVG(qe_AllGold) AND q_silver>=AVG(q_AllSilver) AND qe_bronze>=AVG(qe_AllBronze)) THEN expertUserList.add(question_editor).]
規(guī)則3和4都是推導(dǎo)專(zhuān)家用戶(hù)的度量規(guī)則。規(guī)則3表示將聲譽(yù)值(ae_reputation)和徽章數(shù)(ae_gold、ae_silver、ae_bronze)都大于平均度量值的回答編輯用戶(hù)作為專(zhuān)家用戶(hù);規(guī)則4則表示的是將聲譽(yù)值(qe_reputation)和徽章數(shù)(qe_gold、qe_silver、qe_bronze)都大于平均度量值的問(wèn)題編輯用戶(hù)作為專(zhuān)家用戶(hù)。
rule5:[IF (questionVote>=AVG(allQuestionVote) AND answerCount>=AVG(allAnswerCount) AND bookmarkNum>=AVG(allBookmarkNum)) Then goodQuestionList.add(q),candidateExpertCodeList.add.add(code(q)).]
規(guī)則5表示將問(wèn)題投票數(shù)、回答數(shù)和書(shū)簽數(shù)(questionVote、answerCount、bookmarkNum)都高于平均度量標(biāo)準(zhǔn)的問(wèn)題作為受歡迎且高質(zhì)量的問(wèn)題,而能夠解決這類(lèi)問(wèn)題的代碼示例則作為候選專(zhuān)家示例。
rule6:[IF (Q>=AVG(Q) AND re_AnswerVote>=AVG(AnswerVote)) THEN candidateExpertCodeList.add(code).]
規(guī)則6表示將代碼質(zhì)量分?jǐn)?shù)(Q)和回答投票數(shù)(Answer Vote)都高于其平均度量值的代碼示例作為候選專(zhuān)家示例。其中本文采用IntelliJ IDEA的自動(dòng)化源代碼度量插件MetricsReloaded來(lái)計(jì)算代碼質(zhì)量分?jǐn)?shù),主要通過(guò)Java代碼中的函數(shù)參數(shù)個(gè)數(shù)(PARA)、注釋率(COMF)、函數(shù)中非結(jié)構(gòu)化語(yǔ)句的數(shù)量、函數(shù)中的可執(zhí)行語(yǔ)句數(shù)(STMT)、圈復(fù)雜度(v(G))、基本復(fù)雜度(ev(G))、模塊設(shè)計(jì)復(fù)雜度(iv(G))等計(jì)算評(píng)估后得到。
根據(jù)以上六條基本推理規(guī)則,本文得到了兩條專(zhuān)家示例推理規(guī)則,具體如下所示。
R1:[IF (?c :is_candidate_expertCode_of ?t) AND (ae_reputation>=AVG(ae_AllReputation) AND ae_gold>=AVG(ae_AllGold) AND ae_silver>=AVG(ae_AllSilver) AND ae_bronze>=AVG(ae_AllBronze)) AND (Q>=AVG(q) AND re_AnswerVote>=AVG(AnswerVote)) THEN ExpertCodeList.add(c).]
專(zhuān)家示例推理規(guī)則R1是由rule1、rule3、rule6三條基本規(guī)則組合得到的,其表示的是若在本體中存在本體關(guān)系:代碼示例c是技術(shù)標(biāo)簽t的候選專(zhuān)家示例,并且代碼示例c被專(zhuān)家用戶(hù)編輯過(guò)且編輯后的代碼示例的質(zhì)量分?jǐn)?shù)和投票數(shù)都較高,那么可以認(rèn)為該回答編輯用戶(hù)審查過(guò)的那個(gè)代碼示例也是專(zhuān)家示例。
R2:[IF (?t :has_candidate_expertCode ?c) AND (qe_reputation>=AVG(qe_AllReputation) AND qe_gold>=AVG(qe_AllGold) && q_silver>=AVG(q_AllSilver) AND qe_bronze>=AVG(qe_AllBronze)) AND (questionVote>=AVG(allQuestionVote) AND answerCount>=AVG(allAnswerCount) AND bookmarkNum>=AVG(allBookmarkNum)) THEN ExpertCodeList.add(c).]
專(zhuān)家示例推理規(guī)則R2是由rule2、rule4和rule6三條基本規(guī)則組合得到的,表示若在本體中存在本體關(guān)系:技術(shù)標(biāo)簽t擁有候選專(zhuān)家示例c,并且候選專(zhuān)家示例c所對(duì)應(yīng)解決的問(wèn)題是被專(zhuān)家用戶(hù)編輯過(guò)的高質(zhì)量且受歡迎的問(wèn)題,本文則將候選專(zhuān)家示例c作為專(zhuān)家示例并將其加入專(zhuān)家示例列表中。根據(jù)專(zhuān)家示例推理規(guī)則推導(dǎo)獲取到的專(zhuān)家示例如表6所示。
4.2 專(zhuān)家示例的應(yīng)用
為了驗(yàn)證通過(guò)推理規(guī)則得到的專(zhuān)家示例是否有價(jià)值,即是否能夠提升BEMiner方法的挖掘效果,本文將獲取的專(zhuān)家示例作為新的訓(xùn)練集用于BEMiner挖掘方法中,測(cè)試集還是沿用的之前研究人員在GitHub中尋找的Netty、Apachecamel以及drools三種Java開(kāi)源項(xiàng)目。應(yīng)用的具體過(guò)程為:a)首先獲取一類(lèi)Java技術(shù)框架專(zhuān)家示例數(shù)據(jù),如Netty專(zhuān)家示例數(shù)據(jù)通過(guò)AST抽象語(yǔ)法樹(shù)提取出其中的API調(diào)用序列;b)提取出Netty開(kāi)源項(xiàng)目中源程序的API調(diào)用序列;c)通過(guò)層次聚類(lèi)算法聚類(lèi)提取的專(zhuān)家示例API調(diào)用序列;d)聚好的類(lèi)通過(guò)KNN分類(lèi)算法來(lái)對(duì)源程序API調(diào)用序列分類(lèi);e)將分類(lèi)結(jié)果用BIDE算法進(jìn)行頻繁閉序列挖掘,以此來(lái)挖掘得到最終的API調(diào)用模式。
由于BEMiner和UPMiner方法都是基于傳統(tǒng)的序列模式的挖掘方法,所以本文在實(shí)驗(yàn)比較上和經(jīng)典的API挖掘工具UPMiner[11]進(jìn)行挖掘結(jié)果的比較,主要是比較精確率(precision)[10]、召回率(recall)[10]以及Fmeasure[10]。具體的評(píng)估標(biāo)準(zhǔn)如式(1)~(3)所示。
其中:L為“黃金集”中的API調(diào)用序列集合,“黃金集”指的是從開(kāi)源項(xiàng)目中人工篩選出的最完整且最精確的API調(diào)用序列集合;C表示基于專(zhuān)家示例的BEMiner方法所挖掘到的API調(diào)用序列集合;|L|表示“黃金集”中的API調(diào)用序列數(shù)量;|C|表示BEMiner挖掘結(jié)果中的API調(diào)用序列數(shù)量;|L∩C|表示挖掘結(jié)果與“黃金集”相匹配的API調(diào)用序列數(shù)量。若挖掘到的序列為“黃金集”中的子序列,且序列長(zhǎng)度誤差不超過(guò)2,則認(rèn)為該序列為挖掘出的且與“黃金集”相匹配的序列[10]。
BEMiner的示例聚類(lèi)閾值、K值、分類(lèi)閾值、頻繁閉序列閾值、源程序序列聚類(lèi)閾值分別為0.6、3、0.3、0.1、0.2,UPMiner的頻繁閉序列閾值和源程序序列聚類(lèi)閾值分別為0.1、0.2。實(shí)驗(yàn)結(jié)果比較如表7、8所示。
本文設(shè)計(jì)三組基于不同Java技術(shù)框架的實(shí)驗(yàn),用于比較基于專(zhuān)家示例的BEMiner與UPMiner方法的API挖掘效果。實(shí)驗(yàn)結(jié)果表明,經(jīng)過(guò)本文構(gòu)建的Stack Overflow問(wèn)答網(wǎng)站本體推理得到的專(zhuān)家示例應(yīng)用于BEMiner方法中得到的API挖掘結(jié)果無(wú)論是在精確率、召回率還是Fmeasure,基本都比UPMiner要高。而在沒(méi)有專(zhuān)家示例作為訓(xùn)練集的情況下,BEMiner方法只是在召回率上高于UPMiner,精確率略低于UPMiner。因此專(zhuān)家示例可以在不降低召回率的情況下,更好地提升BEMiner方法的精確率。
5 結(jié)束語(yǔ)
Stack Overflow問(wèn)答網(wǎng)站作為一個(gè)計(jì)算機(jī)領(lǐng)域的IT技術(shù)問(wèn)答網(wǎng)站,其中包含了許多計(jì)算機(jī)領(lǐng)域相關(guān)的知識(shí)技術(shù)資源。為了達(dá)到復(fù)用Stack Overflow問(wèn)答網(wǎng)站知識(shí)資源的目的,本文構(gòu)建了Stack Overflow本體模型,為后續(xù)專(zhuān)家示例的獲取及在A(yíng)PI挖掘上的應(yīng)用奠定了基礎(chǔ)。在后續(xù)工作中,本文通過(guò)部分自定義專(zhuān)家示例推理規(guī)則在本體中推導(dǎo)出專(zhuān)家示例,并將專(zhuān)家示例應(yīng)用于BEMiner挖掘方法。初步的實(shí)驗(yàn)結(jié)果表明,由本文構(gòu)建的Stack Overflow本體模型推導(dǎo)出的專(zhuān)家示例確實(shí)能夠提升API挖掘的效果。
參考文獻(xiàn):
[1]鐘林輝,宗洪雁.基于本體的構(gòu)件化軟件演化信息獲取及度量研究[J].計(jì)算機(jī)科學(xué),2015,42(1):196-200,231.(Zhong Linhui,Zong Hongyan. Research on acquisition and measurement of ontologybased component software evolution information[J].Computer Science,2015,42(1):196-200,231.)
[2]Soliman M, Galster M, Riebisch M. Developing an ontology for architecture knowledge from developer communities[C]//Proc of IEEE International Conference on Software Architecture.Piscataway,NJ:IEEE Press,2017:89-92.
[3]鐘林輝,朱小征,宗洪雁,等.基于本體及模式驅(qū)動(dòng)的構(gòu)件化軟件共同變化識(shí)別研究[J].計(jì)算機(jī)應(yīng)用研究,2016,33(3):773-778.(Zhong Linhui,Zhu Xiaozheng,Zong Hongyan,et al. Research on common change recognition of componentbased software based on ontology and patterndriven[J].Application Research of Computers,2016,33(3):773-778.)
[4]唐成華,侯夢(mèng)迪,高慶澤,等.多類(lèi)軟件本體的惡意軟件語(yǔ)義描述模型[J].小型微型計(jì)算機(jī)系統(tǒng),2021,42(11):2433-2439.(Tang Chenghua,Hou Mengdi,Gao Qingze,et al. Malware semantic description model of multiclass software ontology[J].Journal of Chinese Computer Systems,2021,42(11):2433-2439.)
[5]關(guān)慧,金梓奕,李楊.基于安全模式的軟件安全本體模型及推理[J].計(jì)算機(jī)工程與設(shè)計(jì),2018,39(5):1276-1282.(Guan Hui,Jin Ziyi,Li Yang. Software security ontology model and reasoning based on security patterns[J].Computer Engineering and Design,2018,39(5):1276-1282.)
[6]李震,劉斌,苗虹,等.基于本體的軟件安全性需求建模和驗(yàn)證[J].北京航空航天大學(xué)學(xué)報(bào),2012,38(11):1445-1449.(Li Zhen,Liu Bin,Miao Hong,et al. Ontologybased software safety requirements modeling and verification[J].Journal of Beijing University of Aeronautics and Astronautics,2012,38(11):1445-1449.)
[7]魯強(qiáng),陳超,王智廣.一種支持軟件知識(shí)共享的本體模型研究[J].計(jì)算機(jī)應(yīng)用,2010,30(2):402-405.(Lu Qiang,Chen Chao,Wang Zhiguang. Research on an ontology model supporting software knowledge sharing[J].Journal of Computer Applications,2010,30(2):402-405.)
[8]李文鵬,王建彬,林澤琦,等.面向開(kāi)源軟件項(xiàng)目的軟件知識(shí)圖譜構(gòu)建方法[J].計(jì)算機(jī)科學(xué)與探索,2017,11(6):851-862.(Li Wenpeng,Wang Jianbin,Lin Zeqi,et al. Software knowledge graph construction method for open source software projects[J].Journal of Frontiers of Computer Science and Technology,2017,11(6):851-862.)
[9]董坤,謝守美.基于關(guān)聯(lián)數(shù)據(jù)的MOOC資源語(yǔ)義化組織與聚合研究[J].情報(bào)雜志,2016,35(6):177182.(Dong Kun,Xie Shoumei. Research on semantic organization and aggregation of MOOC resources based on linked data[J].Journal of Intelligence,2016,35(6):177-182.)
[10]莫俊杰.基于示例的API調(diào)用模式挖掘方法研究[D].南昌:江西師范大學(xué),2021.(Mo Junjie. Research on API call pattern mining method based on example[D].Nanchang:Jiangxi Normal University,2021.)
[11]Wang Jue, Dang Yingnong, Zhang Hongyu, et al. Mining succinct and highcoverage API usage patterns from source code[C]//Proc of the 10th Working Conference on Mining Software Repositories.Piscataway,NJ:IEEE Press,2013:319-328.