李囈瑾 寧浩宇 劉秀
云南電網(wǎng)有限責(zé)任公司信息中心 云南 昆明 650217
代碼倉(cāng)庫(kù)分析下的代碼推進(jìn)方法與機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘有密切的聯(lián)系。我們可以將機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘作為代碼倉(cāng)庫(kù)分析下代碼推薦方法的基礎(chǔ)。以下是本文對(duì)基于代碼倉(cāng)庫(kù)分析的代碼推薦方法相關(guān)研究。
weka是機(jī)器學(xué)習(xí)與數(shù)據(jù)挖掘常見(jiàn)工具,weka的特點(diǎn)就是非商業(yè)化,是一種免費(fèi)的開(kāi)源機(jī)器學(xué)習(xí)與數(shù)據(jù)挖掘軟件,weak是建立在Java編程語(yǔ)言基礎(chǔ)之上的,對(duì)于多數(shù)的操作系統(tǒng)均有較好的兼容性,可為用戶提供數(shù)據(jù)分類、預(yù)處理、關(guān)聯(lián)分析等功能。weak中數(shù)據(jù)輸入格式為二維矩陣,文件格式后有ARFF的后綴名稱,所輸入的數(shù)據(jù)一般為一個(gè)或者多個(gè)實(shí)例,并由一組屬性對(duì)實(shí)例進(jìn)行補(bǔ)充說(shuō)明。
機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)過(guò)多年發(fā)展已經(jīng)形成了基于不同思想下的機(jī)器學(xué)習(xí)算法。不同機(jī)器學(xué)習(xí)算法之間存在一定的聯(lián)系性。舉例來(lái)說(shuō),數(shù)值預(yù)測(cè)機(jī)器學(xué)習(xí)算法可以在輸出數(shù)值對(duì)應(yīng)區(qū)間設(shè)定好后,在分類算法中應(yīng)用,這樣就將分類算法與數(shù)值預(yù)算算法聯(lián)系在一起。由此可見(jiàn)不同的機(jī)器學(xué)習(xí)算法是相互關(guān)聯(lián)的。假設(shè)學(xué)習(xí)概念模型是機(jī)器學(xué)習(xí)算法運(yùn)行的前提,所謂假設(shè)學(xué)習(xí)概念模型就是預(yù)先確定概念模型。通常情況下,規(guī)則模型、聚類模型、線性模型、表模型以及樹(shù)模型是常使用的概念模型。以上模型帶有較強(qiáng)的抽象性,機(jī)器學(xué)習(xí)算法需要在具體學(xué)習(xí)場(chǎng)景中對(duì)模型結(jié)構(gòu)進(jìn)行適當(dāng)調(diào)整[1]。舉例來(lái)說(shuō),機(jī)器學(xué)習(xí)算法模型如果使用的是決策樹(shù)模型,則需要在已知數(shù)據(jù)基礎(chǔ)下對(duì)每個(gè)葉子中間節(jié)點(diǎn)和節(jié)點(diǎn)進(jìn)行確定,由此構(gòu)建出與實(shí)際學(xué)習(xí)場(chǎng)景相適應(yīng)的決策樹(shù)模型。
Java編程語(yǔ)言具有跨平臺(tái)性的特點(diǎn),是一種可以面向?qū)ο蟮木幊陶Z(yǔ)言。Java編程語(yǔ)言的前身是Oak語(yǔ)言,該語(yǔ)言產(chǎn)生于1990年。目前全球互聯(lián)網(wǎng)在不斷發(fā)展的背景下,Java語(yǔ)言已經(jīng)在各個(gè)手機(jī)應(yīng)用開(kāi)發(fā)領(lǐng)域和web開(kāi)發(fā)領(lǐng)域所應(yīng)用,在目前的編程語(yǔ)言中享有重要地位。解釋型、簡(jiǎn)單性、健壯性、網(wǎng)絡(luò)技能性、可移植性、安全性以及高性能等是Java語(yǔ)言的特點(diǎn)。Java作為一種編程語(yǔ)言與C++編程語(yǔ)言在語(yǔ)法規(guī)則上有著較大的相似性,我們可以將Java編程語(yǔ)言看成是C++編程語(yǔ)言的進(jìn)一步發(fā)展,但是Java編程語(yǔ)言摒棄了C++編程語(yǔ)言的不足,Java編程語(yǔ)言可以在發(fā)布的JDK包中對(duì)常用函數(shù)預(yù)先定義,明確字符串、數(shù)組等的操作。Java編程語(yǔ)言可面向?qū)ο螅坎僮骶梢砸詥挝粓?zhí)行。將Java文件編譯為Class文件是Java程序編譯的特點(diǎn),這些文件均由字節(jié)碼構(gòu)成,在所有平臺(tái)上的Java虛擬機(jī)均可以運(yùn)行。早期的Java程序存在運(yùn)行慢的問(wèn)題,但是伴隨編譯器的不斷發(fā)展,進(jìn)一步優(yōu)化了字節(jié)碼編譯,將其轉(zhuǎn)化為機(jī)器碼,字節(jié)碼和機(jī)器碼在轉(zhuǎn)化的過(guò)程中明顯提高了Java程序運(yùn)行速度。Java程序中還具備自動(dòng)回收管理內(nèi)存的功能,該項(xiàng)功能可為開(kāi)發(fā)者專注邏輯功能創(chuàng)造良好的條件,能有效解決C++程序運(yùn)行中泄露內(nèi)存的問(wèn)題。
Eclipse作為一款集成開(kāi)發(fā)環(huán)境,Eclipse與Java有高度的相似性,開(kāi)發(fā)者可以在網(wǎng)絡(luò)上自由瀏覽發(fā)布的源代碼,也可以經(jīng)Eclipse發(fā)布接口開(kāi)發(fā)插件,進(jìn)一步拓展Eclipse功能。JDT作為一種開(kāi)發(fā)工具,主要是針對(duì)Java編程語(yǔ)言而產(chǎn)生的,是Eclipse自帶的一款編程語(yǔ)言開(kāi)發(fā)工具。開(kāi)發(fā)者在JDT發(fā)布的API下可以自主編程,改變以往手動(dòng)操作Java工程項(xiàng)目和資源的方式。比如開(kāi)發(fā)者可以創(chuàng)建新的項(xiàng)目、語(yǔ)法分析Java程序、對(duì)已有項(xiàng)目生成源代碼、對(duì)編程語(yǔ)言中的錯(cuò)誤進(jìn)行檢查并重構(gòu)源代碼等。Eclipse JDT中重要部分之一就是Java模型,Java模型可以對(duì)Java工程資源進(jìn)一步分解,將其分解成相應(yīng)的元素模型,構(gòu)建起元素模型與Java工程資源相對(duì)應(yīng)的關(guān)系。舉例來(lái)說(shuō),IJavaModel該元素主要是代表工作區(qū)的根Java元素,它的后代是IJavaProjects;IField該元素代表在類型中的字段聲明;IMethod該元素代表在類型中方法聲明或者構(gòu)造函數(shù)聲明[2]。
Jsoup作為一種html文件解析器,主要是針對(duì)Java產(chǎn)生的。該解析器可以對(duì)網(wǎng)絡(luò)上的網(wǎng)址所對(duì)應(yīng)的本地html文件或者h(yuǎn)tml文件進(jìn)行解析。Jsoup的API操作方式與JQuery下提供的API操作方式有較大的相似性,可以按照DOM形式提高數(shù)據(jù)讀取速度和操作速度。字符串、文件、URL等的傳入,對(duì)html內(nèi)容進(jìn)行分析;采用DOM形式和CSS選擇器搜索、讀取數(shù)據(jù);借助API操作html文件元素、屬性以及文本內(nèi)容等是Jsoup的基本功能。
軟件開(kāi)發(fā)過(guò)程中,多數(shù)的開(kāi)發(fā)人員會(huì)選擇使用API,所謂API就是應(yīng)用編程接口。但是API的使用需要開(kāi)發(fā)者對(duì)API扎實(shí)記憶。API記憶對(duì)開(kāi)發(fā)者來(lái)說(shuō)不免是一項(xiàng)挑戰(zhàn),尤其是在遇到開(kāi)發(fā)問(wèn)題時(shí),開(kāi)發(fā)人員需要將所要解決的問(wèn)題輸入到搜索引擎中,之后瀏覽搜索引擎中篩選出來(lái)的博客或者論壇,對(duì)其中含有代碼的示例頁(yè)面進(jìn)行查看。隨后參考示例中的方法,將其直接復(fù)制到網(wǎng)頁(yè)上或者進(jìn)行相應(yīng)的修改。Stack OverFlow作為IT專業(yè)問(wèn)答網(wǎng)站,全球使用者居高不下,該網(wǎng)站主要側(cè)重于TI領(lǐng)域上的知識(shí)分享和問(wèn)題解決方法。企業(yè)級(jí)應(yīng)用開(kāi)發(fā)和移動(dòng)應(yīng)用開(kāi)發(fā)中Java在Stack OverFlow上享有非常重要的地位,據(jù)資料顯示Java問(wèn)題數(shù)量在Stack OverFlow網(wǎng)站上一直處于前三位。以上足以說(shuō)明Stack OverFlow網(wǎng)站上有許多值得開(kāi)發(fā)人員借鑒的和效仿的內(nèi)容。但是分析之前API方法推薦研究相關(guān)資料,多數(shù)研究學(xué)者的代碼倉(cāng)庫(kù)為開(kāi)源工程代碼,這樣側(cè)重于開(kāi)源代碼上的研究是為了解決某一領(lǐng)域問(wèn)題為研究目標(biāo),而不能將API涉及多個(gè)方面,將其局限在了特定的方向。基于此就需要開(kāi)發(fā)者將代碼倉(cāng)庫(kù)作為Stack OverFlow數(shù)據(jù)轉(zhuǎn)儲(chǔ)post中的示例代碼,基于人氣指標(biāo)的推薦方法不僅可以有效控制代碼倉(cāng)庫(kù)體量,將體量控制在較小的程度,而且也可以繼續(xù)擴(kuò)大API應(yīng)用范圍,使其涉及更多的方面。Favorite Count Answer Count等是居高不下的人氣指標(biāo),這些指標(biāo)也常作為API方法的參考權(quán)重值[3-4]。
Stack Overflow數(shù)據(jù)分析和處理主要包括五部分內(nèi)容,一是提取Java有關(guān)的Post Type,將Post Type作為Question的post;二是過(guò)濾posts表里Post Type是Answer的post;三是用Jsoup分析post,將Java代碼片段分離出來(lái),Post表中需要以html的格式存儲(chǔ)body字段,將其作為網(wǎng)頁(yè)上的主要內(nèi)容。全球人氣居高不下的Stack OverFlow網(wǎng)站使用的是自定義標(biāo)簽,自定義標(biāo)簽可以格式化文本插入的實(shí)例代碼;四是對(duì)分離出來(lái)的Java代碼片段進(jìn)行語(yǔ)法分析,判斷是否是Java代碼;五是提取post中的人氣指標(biāo),按照API方法對(duì)人氣權(quán)重進(jìn)行計(jì)算[5-6]。
CSCC、BCC、BMN是目前與Java相關(guān)的API方法推薦主要工具。其中CSCC有較高的文本相似度,可實(shí)現(xiàn)對(duì)推薦API方法的排序;BCC是建立在出現(xiàn)頻率基礎(chǔ)之前的,可滿足推薦API方法的排序要求;BMN則是先進(jìn)行K-NN分類,之后在頻率基礎(chǔ)上對(duì)推薦API方法排序。
Apriori算法可以有效節(jié)約頻繁項(xiàng)集的生成時(shí)間,能將一些完全不可能是頻繁項(xiàng)集的集合在最早的時(shí)間內(nèi)消除。舉例來(lái)說(shuō),定律1中支持度大于min-support是這個(gè)集合的特點(diǎn),則被列為頻繁項(xiàng)集,該集合的子集也理所應(yīng)當(dāng)是頻繁項(xiàng)集。定律2中支持度小于min-support是這個(gè)集合的特點(diǎn),則被列為非頻繁項(xiàng)集,該集合中的子集也理所應(yīng)當(dāng)是非頻繁項(xiàng)集。結(jié)合定律1和定律2在Apriori算法下具體步驟所示如下,步驟一:設(shè)定最小置信度和最小支持度;步驟二:對(duì)數(shù)據(jù)庫(kù)中的全部事務(wù)進(jìn)行讀取,一維候選集為任何一項(xiàng),對(duì)每個(gè)候選一維選集置信度進(jìn)行計(jì)算,所選擇的一維頻繁集則為大于最小置信度的項(xiàng);步驟三:對(duì)全部的一維頻繁集進(jìn)行掃描,一維頻繁集生成二維候選集,并對(duì)全部的二維候選集置信度進(jìn)行計(jì)算,所選擇的二維候選集則為大于最小置信度的項(xiàng);步驟四:對(duì)上述步驟二和步驟三進(jìn)行重復(fù),由此生成高一級(jí)的候選集,并對(duì)候選集置信度進(jìn)行計(jì)算,這級(jí)的頻繁項(xiàng)也為大于最小置信的項(xiàng)。一直到新的頻繁集不能產(chǎn)生為止;步驟五:求出全部頻繁集S所有的非空子集A,并求出A的補(bǔ)集B。如果非空子集A的置信度和補(bǔ)集B的置信度大于最小置信度,則A→B的規(guī)則是存在的。連續(xù)做連接和減枝操作是Apriori算法的特點(diǎn)[7-8]。
Apriori算法的優(yōu)化可以從以下幾方面分析,一是優(yōu)化生成頻繁集。Apriori計(jì)算復(fù)雜度對(duì)條數(shù)和項(xiàng)數(shù)有較高的敏感性。想要進(jìn)一步優(yōu)化Apriori算法就需要從生成頻繁集階段入手,在Apriori算法運(yùn)行前,就需要借助Java編程語(yǔ)言進(jìn)行裁剪輸入;二是優(yōu)化生成規(guī)則。生成規(guī)則的優(yōu)化需要秉持以下選取原則,原則一如果當(dāng)前對(duì)象能調(diào)用的API方法不在頻繁集中,可排除;原則二選出當(dāng)前頻繁項(xiàng)中可以調(diào)用出來(lái)的API方法,將其定義為Y,隨后將Y的補(bǔ)集求出來(lái)。如果Y的補(bǔ)集不是API方法下的非空子集,可排除?;趦?yōu)化Apriori算法的代碼推進(jìn)方法與人氣指標(biāo)的推薦方法是相互關(guān)聯(lián)的,兩者結(jié)合可進(jìn)一步創(chuàng)新代碼倉(cāng)庫(kù)分析下的代碼推進(jìn)方法[9-10]。
綜上所述,基于代碼倉(cāng)庫(kù)分析的代碼推薦方法是軟件開(kāi)發(fā)領(lǐng)域研究的熱門(mén)話題。以上就是本文對(duì)基于代碼倉(cāng)庫(kù)分析的代碼推薦方法相關(guān)介紹,希望可進(jìn)一步豐富該領(lǐng)域研究?jī)?nèi)容。