伏廣宇,李傳藝,葛季棟,駱 斌
1.南京大學(xué)計(jì)算機(jī)軟件新技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,南京210046
2.南京大學(xué)軟件學(xué)院,南京210093
隨著互聯(lián)網(wǎng)的飛速發(fā)展和軟件規(guī)模的不斷擴(kuò)大,軟件復(fù)用已成為降低開(kāi)發(fā)成本、節(jié)約開(kāi)發(fā)時(shí)間的有效途徑.越來(lái)越多的開(kāi)發(fā)者參與到開(kāi)源軟件的開(kāi)發(fā)中來(lái),積累了大量可復(fù)用的代碼、組件、服務(wù),為開(kāi)發(fā)者能夠快速構(gòu)建新軟件提供了有利條件.大量開(kāi)源軟件社區(qū)也隨之興起(如Github、SourceForge、OSCHINA、OpenHub 等).這些開(kāi)源軟件社區(qū)為開(kāi)發(fā)者提供了開(kāi)源軟件托管的平臺(tái),同時(shí)支持開(kāi)源軟件檢索,使用戶能夠找到相關(guān)的開(kāi)源軟件進(jìn)行復(fù)用.
在現(xiàn)有的開(kāi)源軟件社區(qū)中,大部分只提供了根據(jù)軟件倉(cāng)庫(kù)名稱、標(biāo)簽、分類、軟件描述等信息進(jìn)行檢索的方法.開(kāi)源軟件社區(qū)中存在著大量?jī)?yōu)秀的開(kāi)源軟件但缺少詳細(xì)的描述,不能將軟件的所有功能體現(xiàn)出來(lái),導(dǎo)致用戶檢索困難.然而,技術(shù)問(wèn)答社區(qū)(如Stack Overflow)中存在關(guān)于開(kāi)源軟件的問(wèn)答描述,為軟件提供了更加詳細(xì)的信息,可以成為可復(fù)用軟件檢索的輔助信息來(lái)源.
已經(jīng)有很多關(guān)于可復(fù)用軟件檢索的研究,如Bajracharya 等[1]實(shí)現(xiàn)了Sourcerer 系統(tǒng),從代碼角度進(jìn)行分析,提取出細(xì)粒度信息存儲(chǔ)在關(guān)系模型中用于進(jìn)行搜索,效果遠(yuǎn)優(yōu)于基于關(guān)鍵詞的搜索.Gu 等在文獻(xiàn)[2]中提出了一種新的帶有層次結(jié)構(gòu)的軟件標(biāo)簽結(jié)構(gòu),優(yōu)化了基于標(biāo)簽的軟件搜索方式.Girardi 等[3]構(gòu)建了一個(gè)名為ROSE 的方法,通過(guò)對(duì)軟件描述文本中的動(dòng)詞與名詞進(jìn)行抽取,建立索引為用戶提供軟件檢索.
然而,這些研究都沒(méi)有解決用戶輸入與開(kāi)源軟件倉(cāng)庫(kù)索引方式之間的不對(duì)等問(wèn)題.現(xiàn)有研究中要么使用軟件代碼(如SCRUPLE 工具[4]),要么使用軟件簡(jiǎn)介(如RepoPal 系統(tǒng)[5])對(duì)軟件進(jìn)行索引,而輸入則為用戶表達(dá)的非正式的軟件需求描述.同時(shí),開(kāi)源軟件社區(qū)中存在著大量?jī)?yōu)秀開(kāi)源軟件的標(biāo)簽、描述不全的問(wèn)題,用戶不能針對(duì)軟件的功能特征進(jìn)行檢索.因此,本文提出了一種通過(guò)開(kāi)源軟件論壇或問(wèn)答網(wǎng)站構(gòu)建軟件功能描述,以匹配用戶輸入的方法,用于滿足用戶針對(duì)軟件功能進(jìn)行檢索的需求,具體包括:
1)通過(guò)將開(kāi)源軟件與相關(guān)論壇結(jié)合,從論壇上提取出軟件所具有的功能特征;
2)通過(guò)對(duì)用戶描述的軟件需求文本處理,快速提取出用戶所需的軟件功能;
3)用BERT(bidirectional encoder representation from transformers)[6]預(yù)訓(xùn)練模型將軟件功能特征與用戶所需軟件功能轉(zhuǎn)換為句向量進(jìn)行相似度計(jì)算并推薦.
軟件復(fù)用是用現(xiàn)有的軟件或者軟件知識(shí)來(lái)構(gòu)建新的軟件[7].在軟件開(kāi)發(fā)過(guò)程中,軟件復(fù)用有幾個(gè)不同的層次,如代碼復(fù)用、設(shè)計(jì)復(fù)用、需求復(fù)用等.代碼級(jí)復(fù)用[8]包括函數(shù)復(fù)用、模塊復(fù)用、庫(kù)復(fù)用、完整的軟件產(chǎn)品復(fù)用等;設(shè)計(jì)級(jí)復(fù)用[9]包括模式復(fù)用、設(shè)計(jì)圖表復(fù)用、架構(gòu)復(fù)用、框架復(fù)用等;需求復(fù)用[10]則包括非正式需求描述復(fù)用與需求規(guī)格說(shuō)明復(fù)用等.無(wú)論何種軟件復(fù)用形式,其目的都是提高軟件質(zhì)量和生產(chǎn)率,這也成為許多科學(xué)家與管理學(xué)家關(guān)注的焦點(diǎn).軟件的可復(fù)用性是衡量軟件是否能被復(fù)用的重要指標(biāo),可以通過(guò)以下幾個(gè)方面進(jìn)行衡量:
1)軟件功能的復(fù)用
在設(shè)計(jì)初期,許多軟件的存在形式具有高度的可復(fù)用性.開(kāi)發(fā)者可以將現(xiàn)有項(xiàng)目中的源代碼或組件直接或簡(jiǎn)單修改后應(yīng)用到新的軟件中.例如在Java 開(kāi)發(fā)中,開(kāi)發(fā)者通過(guò)引入Java Archive(Jar)文件,能夠快速、高效地使用拓展功能.面向?qū)ο蟪绦蛟O(shè)計(jì)的出現(xiàn)進(jìn)一步推動(dòng)了軟件復(fù)用的發(fā)展.通過(guò)對(duì)軟件中功能與實(shí)體的抽象,通過(guò)類、方法、對(duì)象將軟件的功能與角色進(jìn)行封裝,一次編寫即可隨時(shí)被調(diào)用,大大降低了開(kāi)發(fā)成本.
2)軟件體系結(jié)構(gòu)的復(fù)用
隨著領(lǐng)域工程、領(lǐng)域分析的出現(xiàn),軟件的體系結(jié)構(gòu)成為了復(fù)用軟件的重要考慮因素.Arango 等[11]提出了一種在受限領(lǐng)域中構(gòu)建重用軟件的理論.在特定領(lǐng)域中,通過(guò)對(duì)用戶反饋與成功因素等積累,能夠大幅度提高軟件開(kāi)發(fā)的能力與效率.因此,通用模版也成為了軟件復(fù)用重要資源.
3)開(kāi)發(fā)過(guò)程重用
過(guò)程重用是最抽象、最高級(jí)的重用方法,與對(duì)特定代碼片段甚至是軟件體系結(jié)構(gòu)的重用無(wú)關(guān).這其中包括項(xiàng)目團(tuán)隊(duì)的開(kāi)發(fā)工具、開(kāi)發(fā)周期、協(xié)作模式、開(kāi)發(fā)中所產(chǎn)生的經(jīng)驗(yàn)等.Barreto等[12]提出了一種軟件流程的定義方法來(lái)獲取軟件開(kāi)發(fā)過(guò)程中可復(fù)用的元素,如團(tuán)隊(duì)組織、進(jìn)度安排等.
本文主要研究檢索滿足功能可復(fù)用的開(kāi)源軟件項(xiàng)目,而如何對(duì)檢索到的可復(fù)用軟件項(xiàng)目進(jìn)行復(fù)用不是本文研究?jī)?nèi)容.本文使用自然語(yǔ)言表達(dá)軟件的功能特征.
在軟件復(fù)用時(shí),通常會(huì)面臨道德與法律問(wèn)題.開(kāi)源軟件快速增長(zhǎng)的同時(shí)也帶動(dòng)了開(kāi)源社區(qū)與開(kāi)源協(xié)議的進(jìn)步與發(fā)展.為了避免道德問(wèn)題與法律糾紛并保護(hù)開(kāi)源軟件作者的權(quán)益,開(kāi)源軟件協(xié)議也是評(píng)估開(kāi)源軟件復(fù)用性的重要因素之一[13].常見(jiàn)的開(kāi)源協(xié)議有MIT License(MIT)、GNU General Public License v3.0(GLP)、Apache Licence 2.0(Apache-2.0)、Berkeley Software Distribution(BSD)等.Lerner 在文獻(xiàn)[14]指出,不同的開(kāi)源協(xié)議對(duì)開(kāi)源軟件的用途、規(guī)范的限制不同,所以在選擇開(kāi)源軟件進(jìn)行復(fù)用時(shí),需要考慮開(kāi)源軟件所遵守的協(xié)議.本文描述的方法只限定使用于符合開(kāi)源軟件復(fù)用協(xié)議的相關(guān)軟件.
本文設(shè)定的可復(fù)用軟件檢索目標(biāo)為:檢索基于軟件功能可復(fù)用的相似開(kāi)源軟件.通過(guò)對(duì)開(kāi)源軟件的功能特征與需求文檔中的功能特征進(jìn)行匹配,為用戶推薦具有可被直接復(fù)用功能的開(kāi)源軟件,或具有相似功能經(jīng)過(guò)修改可被復(fù)用的開(kāi)源軟件.
現(xiàn)有開(kāi)源軟件倉(cāng)庫(kù)對(duì)軟件本身功能性描述并不全面,主要是對(duì)軟件代碼的管理和軟件迭代更新過(guò)程的管理.為了實(shí)現(xiàn)基于可復(fù)用功能的開(kāi)源軟件檢索,首先需要明確每一個(gè)開(kāi)源軟件的功能性需求,作為判斷是否符合檢索要求的基礎(chǔ).雖然軟件倉(cāng)庫(kù)沒(méi)有詳細(xì)描述軟件的功能性需求,在一些用戶論壇和問(wèn)答系統(tǒng)中,軟件用戶會(huì)對(duì)相關(guān)軟件的功能開(kāi)展討論,從用戶發(fā)言中可以抽取出軟件的功能性描述.因此,本文提出一種從用戶論壇或問(wèn)答系統(tǒng)中抽取軟件功能描述的方法,用于構(gòu)建軟件功能索引.
從用戶描述語(yǔ)言中提取軟件功能描述的另一個(gè)優(yōu)點(diǎn)是,其描述語(yǔ)言與用戶輸入的檢索條件保持一致.一般而言,普通用戶在描述軟件功能時(shí)不會(huì)使用專業(yè)術(shù)語(yǔ),更加偏向日常使用的自然語(yǔ)言描述,如果將這種檢索輸入與正式的軟件需求規(guī)格說(shuō)明中的功能描述進(jìn)行匹配,即使描述的為相同的功能,其文本相似程度也非常低.雖然可以通過(guò)語(yǔ)義編碼將規(guī)格說(shuō)明與用戶描述映射到同一個(gè)語(yǔ)義空間,其效果不如在輸入和索引中均使用用戶描述語(yǔ)言,這樣通過(guò)語(yǔ)義編碼后,語(yǔ)義相近的更可能匹配成功.
本文描述的檢索系統(tǒng)的輸入為自然語(yǔ)言描述的軟件功能性需求,其特點(diǎn)是非正式的軟件功能性描述,與寫入軟件需求規(guī)格說(shuō)明的敘述存在一定差別.為根據(jù)輸入的功能描述檢索功能相似的軟件項(xiàng)目,將其與從相關(guān)論壇或問(wèn)答社區(qū)中提取出的開(kāi)源軟件功能特征映射到同一個(gè)語(yǔ)義空間中,使用數(shù)值向量表示文本內(nèi)容,例如通過(guò)現(xiàn)階段流行的BERT 神經(jīng)網(wǎng)絡(luò)語(yǔ)言模型將兩種文本轉(zhuǎn)換為向量表示.假設(shè),vi表示用戶輸入的功能描述的文本向量,vj表示開(kāi)源軟件功能特征的文本向量,m為向量的維度,用余弦相似度公式計(jì)算兩者相似性如下:
同時(shí),納入本文描述系統(tǒng)檢索范圍的開(kāi)源軟件需遵守相關(guān)的開(kāi)源許可,確保用戶對(duì)開(kāi)源軟件的合法復(fù)用.
本文提出了一種基于軟件需求的開(kāi)源軟件檢索方法.圖1展示了該方法的整體框架.
圖1 本文提出的方法整體框架圖Figure 1 Overall framework in our proposed approach
該方法的核心工作是為每一個(gè)開(kāi)源軟件構(gòu)建功能特征描述,處理用戶上傳的功能需求描述,并計(jì)算開(kāi)源軟件功能特征與用戶描述中所需功能的相似度.開(kāi)源軟件是系統(tǒng)返回的結(jié)果單元.該方法主要分為4 個(gè)步驟:
步驟1對(duì)開(kāi)源軟件在論壇或問(wèn)答社區(qū)中的文本討論數(shù)據(jù)進(jìn)行預(yù)處理(本文以開(kāi)發(fā)者技術(shù)論壇Stack Overflow 作為數(shù)據(jù)來(lái)源,基于該數(shù)據(jù)描述本文方法的具體流程并驗(yàn)證該方法的有效性),減少文本中代碼、網(wǎng)頁(yè)標(biāo)簽帶來(lái)的負(fù)面影響;
步驟2通過(guò)句法分析與動(dòng)賓短語(yǔ)提取從問(wèn)答語(yǔ)句中篩選出動(dòng)賓短語(yǔ),作為開(kāi)源軟件功能特征的候選詞,再通過(guò)啟發(fā)式過(guò)濾規(guī)則和信息詞出現(xiàn)的頻率進(jìn)行過(guò)濾,篩選出開(kāi)源軟件的功能特征短語(yǔ);
步驟3對(duì)用戶上傳軟件需求描述進(jìn)行動(dòng)賓短語(yǔ)提取與過(guò)濾,同時(shí)為用戶提供自行篩選與修改動(dòng)賓短語(yǔ)的接口,輔助用戶提取出軟件需求中所需的軟件功能;
步驟4通過(guò)對(duì)提取出的開(kāi)源軟件功能與用戶所需的軟件功能進(jìn)行文本向量轉(zhuǎn)換,并計(jì)算相似度,最終根據(jù)相似度篩選出前K個(gè)結(jié)果推送給用戶.
本文從Stack Exchange Data Explorer 上獲取數(shù)據(jù)源,根據(jù)開(kāi)源軟件的名稱在Stack Overflow 上對(duì)應(yīng)的標(biāo)簽獲取相關(guān)的問(wèn)答信息.如圖2所示,Stack Overflow 中的問(wèn)答記錄以網(wǎng)頁(yè)的形式進(jìn)行展示,所以在獲取到的原始問(wèn)答數(shù)據(jù)中,包含著大量HTML 標(biāo)簽和代碼.這些都會(huì)對(duì)語(yǔ)義分析產(chǎn)生影響.同時(shí),這些開(kāi)源軟件需遵守相關(guān)的開(kāi)源協(xié)議.
對(duì)語(yǔ)句中出現(xiàn)的代碼進(jìn)行替換.在圖2所展示的問(wèn)答記錄中,存在灰色背景的命令行代碼.從網(wǎng)頁(yè)獲取的這段文本中,代碼被包含在標(biāo)簽,通過(guò)正則表達(dá)式
.*
將代碼替換為#CODE 標(biāo)記.
對(duì)語(yǔ)句中出現(xiàn)的HTML 標(biāo)簽進(jìn)行替換,獲取到的問(wèn)答記錄被包含在HTML 標(biāo)簽之間.用Beautiful Soup 工具對(duì)出現(xiàn)的HTML 標(biāo)簽進(jìn)行替換.
圖2 Youtube-dl 項(xiàng)目在Stack Overflow 中的問(wèn)答記錄Figure 2 Q&A record of youtube-dl in Stack Overflow
根據(jù)文獻(xiàn)[15]中提出的基于Stack Overflow 數(shù)據(jù)的軟件功能特征挖掘組織方法進(jìn)行開(kāi)源軟件功能特征提取.
2.2.1 句法分析與動(dòng)賓短語(yǔ)提取
在問(wèn)答社區(qū)中,功能特征通常作為動(dòng)賓短語(yǔ)出現(xiàn).因此用Stanford CoreNLP[16]工具對(duì)語(yǔ)句構(gòu)造句法分析樹,并用Penn Treebank[17]的約定進(jìn)行語(yǔ)法與詞性標(biāo)記.如語(yǔ)句“I’m trying to download all the videos from the playlist.”(來(lái)自開(kāi)源項(xiàng)目youtube-dl 在Stack Overflow 中的討論)的句法解析書構(gòu)造如圖3所示.
圖3 “I’m trying to download all the videos from the playlist.”的句法解析樹Figure 3 Parse tree of the sentence of “I’m trying to download all the videos from the playlist.”
在句法解析樹中,VP 所對(duì)應(yīng)的句子為動(dòng)賓短語(yǔ).而文檔中存在多個(gè)VP 標(biāo)記,只有“download all the videos from the playlist.”為合法的功能特征.因此設(shè)計(jì)了基于句法結(jié)構(gòu)特征的過(guò)濾方式:如果動(dòng)賓短語(yǔ)的第一層子節(jié)點(diǎn)不包含動(dòng)詞(標(biāo)簽VB.*)和名詞成分(標(biāo)簽.*NP.*)則直接過(guò)濾.根據(jù)此過(guò)濾方法可以得到該句中合法的動(dòng)賓短語(yǔ)作為候選功能特征.
2.2.2 基于啟發(fā)式的動(dòng)賓短語(yǔ)過(guò)濾
初步篩選出的動(dòng)賓短語(yǔ)很多不能直接作為功能特征,需要通過(guò)啟發(fā)式規(guī)則進(jìn)行篩選.本文在動(dòng)賓短語(yǔ)篩選的過(guò)程中提出了核心詞概念.根據(jù)文獻(xiàn)[15]所提出的功能特征的統(tǒng)一文法,如表1所示.
Function、Action、Object、Condition 分別表示功能特征、功能特征中的操作、功能特征中的對(duì)象、功能特征中的約束條件.操作中的動(dòng)詞與對(duì)象最后一個(gè)名詞分別對(duì)應(yīng)著功能特征中的核心動(dòng)詞與核心名詞.如“download all the videos from the playlist”中,核心動(dòng)詞為download,核心名詞為video,兩者組合的核心詞組為“download video”.
表1 功能特征的統(tǒng)一文法Table 1 Normalized grammar of functional features
當(dāng)核心動(dòng)詞出現(xiàn)助動(dòng)詞、情態(tài)動(dòng)詞,或軟件開(kāi)發(fā)常用術(shù)語(yǔ)(如include 等)、問(wèn)答常用術(shù)語(yǔ)(如ask,help 等)時(shí),將短語(yǔ)過(guò)濾.
當(dāng)核心名詞出現(xiàn)代詞或軟件開(kāi)發(fā)常用術(shù)語(yǔ)(如method、object 等)、問(wèn)答常用術(shù)語(yǔ)(如solution、advice 等)時(shí),將短語(yǔ)過(guò)濾.
2.2.3 基于核心詞組出現(xiàn)頻度的過(guò)濾
在問(wèn)答討論中會(huì)反復(fù)提及功能特征,因此通過(guò)過(guò)濾基于核心詞組出現(xiàn)詞頻,能夠有效篩選出合法的功能特征.與文獻(xiàn)[15]不同的是,本文方法統(tǒng)計(jì)動(dòng)賓短語(yǔ)的核心詞組在一個(gè)項(xiàng)目中出現(xiàn)的頻度,當(dāng)核心詞組出現(xiàn)頻度大于0.01%,可被視為合法的功能特征.由于本文方法無(wú)需獲取開(kāi)源軟件功能的層次化組織結(jié)構(gòu),相較于文獻(xiàn)[15]中使用的頻繁子圖挖掘算法,基于核心詞組出現(xiàn)頻度的過(guò)濾方式不僅能反映功能特征出現(xiàn)的頻率,在處理大量數(shù)據(jù)時(shí)還能提高運(yùn)行效率.
針對(duì)用戶上傳的軟件需求,通過(guò)2.2 節(jié)中1)、2)方法進(jìn)行功能特征的提取.比如,需求語(yǔ)句“I want to make a webpage,users can download youtube videos from the webpage.” 通過(guò)2.2 節(jié)中1)、2)方法,篩選出候選功能特征“make a webpage” “download youtube videos using the webpage”.
由于用戶需求描述文本中功能特征出現(xiàn)的頻度較小,無(wú)法采用基于核心詞出現(xiàn)頻度的過(guò)濾.因此為用戶提供了一個(gè)允許其對(duì)提取、篩選后的候選功能特征進(jìn)行刪除、修改的接口,保證了軟件需求中提取的功能特征的準(zhǔn)確度,也避免了用戶逐一查找的繁瑣.
上文的候選功能特征“download youtube videos using the webpage”中,“from the webpage”對(duì)檢索沒(méi)有意義,通過(guò)修改接口修改為“download youtube videos”.
本文基于軟件需求中的功能特征與開(kāi)源軟件中的功能特征,設(shè)計(jì)了如圖4的檢索與推薦流程.
圖4 開(kāi)源軟件檢索與推薦流程Figure 4 Process of retrieval and recommendation
1)功能特征和核心詞短語(yǔ)的文本向量轉(zhuǎn)換
由于開(kāi)源軟件存在大量的功能特征且涉及領(lǐng)域不確定,無(wú)法提前獲得數(shù)據(jù)集進(jìn)行訓(xùn)練.因此使用Google 提供的BERT-Large、Uncased (Whole Word Masking)預(yù)訓(xùn)練模型進(jìn)行無(wú)監(jiān)督的文本向量轉(zhuǎn)換.
例如開(kāi)源軟件youtube-dl 中具有的功能特征“download youtube videos”,其核心詞組為“download video”,使用BERT將功能特征與核心詞組分別轉(zhuǎn)換為1?1 024 的文本向量.
2)使用核心詞組進(jìn)行初次匹配
由于開(kāi)源軟件中存在大量的功能特征,且不同的功能特征有可能存在相同的核心詞.因此先采用核心詞組進(jìn)行相似度匹配,能夠有效減少檢索的次數(shù).使用用戶需求中提取出的核心詞組,對(duì)數(shù)據(jù)庫(kù)中開(kāi)源軟件功能特征的核心詞組進(jìn)行相似度匹配,文本向量相似度檢測(cè)如式(1)所示.根據(jù)相似度進(jìn)行排序篩選出前J個(gè)核心詞組.
如用戶所需功能為“download videos from youtube”,系統(tǒng)將先使用核心詞組“download video”與數(shù)據(jù)庫(kù)中的開(kāi)源軟件功能特征的核心詞組進(jìn)行相似度匹配,當(dāng)匹配到y(tǒng)outube-dl 項(xiàng)目中的核心詞組“download video”,再與其對(duì)應(yīng)的“download youtube videos”進(jìn)行相似度計(jì)算.
3)使用功能特征進(jìn)行再次匹配.
根據(jù)2)中篩選出的核心詞組所對(duì)應(yīng)的功能特征,用式(1)檢測(cè)短文本向量相似度.根據(jù)相似度篩選出前K個(gè)開(kāi)源軟件的功能特征.此處分為兩個(gè)階段檢索是出于檢索效率的考慮,通過(guò)核心詞能夠檢索出具有較高推薦排名候選項(xiàng)目,即縮小二次檢索范圍,提高檢索效率.效率對(duì)比將在實(shí)驗(yàn)部分給出.
4)按照功能特征相似度進(jìn)行排序,將排名前K個(gè)的軟件項(xiàng)目推薦給用戶.
實(shí)驗(yàn)平臺(tái)為Intel i9 9880H 處理器,macOS 10.15.5 操作系統(tǒng),運(yùn)行內(nèi)存16 GB.
我們篩選了Github上Stars 數(shù)排名前100 的Python 開(kāi)源軟件.從Stack Overflow 上獲取到相關(guān)的問(wèn)答記錄數(shù)據(jù)如表2所示.有些開(kāi)源軟件在Stack Overflow 社區(qū)中問(wèn)答數(shù)目較多,例如Flask 擁有81 972 條問(wèn)答記錄.由于實(shí)驗(yàn)設(shè)備性能限制,對(duì)于大于10 000 條評(píng)論的開(kāi)源項(xiàng)目,只截取其中瀏覽量最高的5 000 條問(wèn)題及其答案.
表2 實(shí)驗(yàn)數(shù)據(jù)信息Table 2 Information about experimental data
首先,采用MRR(mean reciprocal rank)[18]對(duì)項(xiàng)目推薦性能進(jìn)行評(píng)估.MRR是檢索系統(tǒng)中常用的評(píng)估指標(biāo).檢索系統(tǒng)根據(jù)條件生成一個(gè)項(xiàng)目排名列表,MRR 是第一個(gè)符合條件的項(xiàng)目在列表中排名的倒數(shù)乘積.MRR 的值越大,說(shuō)明該系統(tǒng)的性能越好.
由于開(kāi)源軟件庫(kù)中軟件數(shù)目多,軟件所具有的功能特征也較多,采用人工方法對(duì)所有軟件的功能特征進(jìn)行標(biāo)定工程量較大,無(wú)法使用Recall 等指標(biāo)進(jìn)行衡量,因此采用MRR 來(lái)衡量系統(tǒng)的檢索性能.根據(jù)用于測(cè)試的軟件項(xiàng)目編寫用戶需求描述,假設(shè)測(cè)試項(xiàng)目為開(kāi)源軟件F,其用戶需求描述為Q.然后,用Q作為檢索條件獲得一個(gè)推薦項(xiàng)目列表.由于Q可能不只是項(xiàng)目F 獨(dú)有的功能,檢索結(jié)果中會(huì)有同樣滿足Q要求的非F項(xiàng)目.為了消除該類項(xiàng)目對(duì)評(píng)價(jià)檢索方案的影響,我們將其從列表中刪除,僅保留并不滿足Q要求的開(kāi)源項(xiàng)目.最后,根據(jù)F在處理后的推薦列表中的排名計(jì)算MRR 值.假設(shè)對(duì)于給定的查詢Q,其檢索結(jié)果列表為其MRR 的計(jì)算為
式中,Ranki表示對(duì)于查詢Qi,開(kāi)源軟件Fi的排序結(jié)果.MRR 的值越高,則項(xiàng)目推薦性能越好.
為了體現(xiàn)先用核心詞組進(jìn)行檢索的效率優(yōu)勢(shì).在實(shí)驗(yàn)中,設(shè)置了分段檢索與一次檢索的平均檢索耗時(shí)(單位:ms)的對(duì)比.分段檢索為先用核心詞進(jìn)行初次檢索,再用核心詞組所對(duì)應(yīng)的完整的功能特征進(jìn)行檢索.一次檢索為直接使用需求中所需的功能特征與提取出的開(kāi)源軟件的功能特征進(jìn)行文本向量相似度匹配.
為了評(píng)估本文提出的方案的有效性,設(shè)計(jì)了兩個(gè)對(duì)比實(shí)驗(yàn).第一個(gè)實(shí)驗(yàn)是與基本檢索方案對(duì)比檢索性能(Baseline).基本方案為使用不包括本文構(gòu)造的功能描述作為項(xiàng)目索引的檢索方案,如基于項(xiàng)目簡(jiǎn)介、標(biāo)簽等信息進(jìn)行檢索.最后用同樣的方式計(jì)算測(cè)試項(xiàng)目的MRR 值進(jìn)行對(duì)比.第二個(gè)對(duì)比實(shí)驗(yàn)是對(duì)比本文分階段檢索(Split)與一次檢索(Single)的差異,包括推薦效果差異和效率差異.
表3 用于測(cè)試的開(kāi)源軟件的用戶需求樣例Table 3 Examples of user requirements of open source software for testing
由于數(shù)據(jù)集中的開(kāi)源項(xiàng)目均為面向開(kāi)發(fā)者用戶的Python 平臺(tái)項(xiàng)目,我們邀請(qǐng)了5 位熟練的Python 開(kāi)發(fā)工程師并隨機(jī)選取了10 個(gè)開(kāi)源項(xiàng)目.每個(gè)選取的開(kāi)源軟件由3 位工程師獨(dú)立編寫人工描述的需求,并對(duì)3 份不同的描述分別進(jìn)行實(shí)驗(yàn)取平均值.表3給出了每個(gè)項(xiàng)目的用戶需求示例.
將MRR 中的K設(shè)置為20,針對(duì)每條需求中所描述的功能,每次從檢索結(jié)果中抽取出20個(gè)不符合功能描述要求的開(kāi)源軟件,并統(tǒng)計(jì)該開(kāi)源軟件在這K+1 個(gè)軟件中的排名.針對(duì)每個(gè)用于測(cè)試的開(kāi)源軟件,共進(jìn)行3 次實(shí)驗(yàn)取平均值.圖5描述了不同開(kāi)源軟件在不同檢索方案下對(duì)應(yīng)的MRR 評(píng)分.
圖5 不同開(kāi)源軟件的不同檢索方案對(duì)應(yīng)的MRR 評(píng)分Figure 5 MRR of different open source software using different searching strategies
根據(jù)圖5可以得出,Split 比Baseline 的實(shí)驗(yàn)效果更好,但與Single 沒(méi)有明顯差別.在Split 與Baseline 的對(duì)比中,由于大部分開(kāi)源軟件(如scrapy、spaCy)的描述、簡(jiǎn)介中沒(méi)有提及軟件功能,所以Split 實(shí)驗(yàn)效果遠(yuǎn)優(yōu)于Baseline.少部分開(kāi)源軟件(如youtube-dl)的描述中涉及了大部分軟件功能,所以其Baseline 實(shí)驗(yàn)效果要遠(yuǎn)優(yōu)于在其他開(kāi)源軟件上Baseline 的實(shí)驗(yàn)效果.在Split 與Single 對(duì)比中,由于兩種方法最終都要進(jìn)行功能特征的匹配,所以實(shí)驗(yàn)效果沒(méi)有明顯差別.
第二個(gè)實(shí)驗(yàn)中我們同樣用上述10 個(gè)測(cè)試軟件項(xiàng)目,使用多個(gè)功能描述進(jìn)行多次檢索,統(tǒng)計(jì)平均檢索效率,對(duì)比結(jié)果見(jiàn)表4.
如表4所示,分階段檢索的平均檢索耗時(shí)明顯少于一次檢索的平均檢索耗時(shí).因?yàn)橐粋€(gè)核心詞組(如download video),往往對(duì)應(yīng)著多個(gè)功能特征(如download videos from youtube、download videos from playlist、download playlist videos等),通過(guò)核心詞組可以快速定位到對(duì)應(yīng)的功能特征,再進(jìn)行第二階段的檢索.因此在軟件檢索過(guò)程中,采用分階段檢索的方法所需的計(jì)算更少,所需時(shí)間更少.
表4 分階段檢索和一次檢索的效率對(duì)比Table 4 Comparison of searching efficiency between splite and single strategy ms
基于本文提出的方法,我們實(shí)現(xiàn)了一個(gè)供用戶基于軟件功能需求描述的相似軟件檢索系統(tǒng).通過(guò)使用Flask 框架與Vue.js 框架進(jìn)行前后端的搭建.如圖6所示,該系統(tǒng)為用戶提供了一個(gè)用戶需求文檔上傳的界面.用戶可以將需求分析以txt 文檔格式上傳.系統(tǒng)將自動(dòng)抽取出用戶所需的候選功能并支持用戶進(jìn)行修改、刪除.
圖6 軟件需求上傳編輯界面Figure 6 Interface of uploading software requirements and editing functions
如圖7所示,搜索結(jié)果將以列表的形式呈現(xiàn)給用戶.根據(jù)軟件需求中提取、篩選出的功能為用戶推薦具有相似功能的開(kāi)源軟件,并給出相應(yīng)的鏈接與開(kāi)源證書.
本文提出了基于軟件需求的開(kāi)源軟件檢索方法,從開(kāi)源軟件在問(wèn)答社區(qū)的問(wèn)答記錄中提取開(kāi)源軟件的功能特征,能夠有效解決開(kāi)源軟件社區(qū)中軟件標(biāo)簽較少、軟件描述不全對(duì)開(kāi)源軟件檢索造成的負(fù)面影響.通過(guò)文本向量對(duì)功能進(jìn)行檢索,在一定程度上解決了功能描述上的差異問(wèn)題.同時(shí),系統(tǒng)對(duì)軟件需求中的功能需求進(jìn)行批量抽取與檢索,避免了開(kāi)發(fā)者在開(kāi)發(fā)過(guò)程中逐個(gè)檢索的繁瑣.因此,本方法在開(kāi)源軟件檢索上有一定的價(jià)值.
圖7 系統(tǒng)查詢結(jié)果界面Figure 7 Query result interface of the system
由于很多開(kāi)源軟件在問(wèn)答社區(qū)中問(wèn)答數(shù)目較少,會(huì)出現(xiàn)部分功能不能被體現(xiàn)的情況,很大程度上影響了檢索的效果.后續(xù)實(shí)驗(yàn)中將會(huì)從代碼信息,注釋信息等更多地方獲取開(kāi)源軟件信息,作為檢索的條件.