国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

面向業(yè)務(wù)需求的算法路徑自組配模型

2023-07-03 14:11:54陳一風(fēng)
計(jì)算機(jī)應(yīng)用 2023年6期
關(guān)鍵詞:代碼排序組件

劉 耀,童 昕,陳一風(fēng)

(1.中國(guó)科學(xué)技術(shù)信息研究所 信息技術(shù)支持中心,北京 100038;2.北京大學(xué) 軟件與微電子學(xué)院,北京 102600)

0 引言

本文立足于情報(bào)工作常用算法及相關(guān)算法平臺(tái),數(shù)據(jù)集為項(xiàng)目中累積的面向業(yè)務(wù)的所有算法以及依據(jù)算法源代碼拆分后的算法代碼組件,這些算法及組件來(lái)源于基于業(yè)務(wù)劃定的算法范圍所構(gòu)建的算法資源庫(kù)。本文選擇基于Python代碼實(shí)現(xiàn),面向業(yè)務(wù)中涉及的機(jī)器學(xué)習(xí)算法進(jìn)行代碼解析與組配研究,從而實(shí)現(xiàn)智能化算法管理平臺(tái)中的算法結(jié)構(gòu)化及算法業(yè)務(wù)流自組織。本文的主要工作包括3 個(gè)方面:

1)代碼組件表示方法建模。本文在綜合研究抽象語(yǔ)法樹(shù)、控制流程圖等代碼結(jié)構(gòu)提取方法的基礎(chǔ)上,提出一套對(duì)邏輯結(jié)構(gòu)、數(shù)據(jù)流以及組件間的調(diào)用關(guān)系進(jìn)行綜合解析的方法,并通過(guò)基于圖卷積網(wǎng)絡(luò)(Graph Convolutional Network,GCN)對(duì)代碼組件進(jìn)行圖向量表示。

2)提出了代碼路徑自組配模型。本文提出使用聚類的方法進(jìn)行算法代碼的功能挖掘,發(fā)現(xiàn)算法代碼間的路徑關(guān)系,并基于排序?qū)崿F(xiàn)算法路徑自組織。

3)通過(guò)實(shí)驗(yàn)驗(yàn)證了對(duì)算法進(jìn)行解析得到算法代碼組件,并在此基礎(chǔ)上進(jìn)行算法路徑自組配可行性實(shí)驗(yàn)及對(duì)比實(shí)驗(yàn)。

1 相關(guān)工作

本文旨在基于代碼的結(jié)構(gòu)特征與語(yǔ)義特征,從業(yè)務(wù)需求出發(fā)檢索資源庫(kù)中的代碼,在算法代碼的理解基礎(chǔ)上,根據(jù)業(yè)務(wù)需求匹配得到的代碼進(jìn)行組配。在本文中,生成指對(duì)算法代碼的復(fù)用。對(duì)算法代碼復(fù)用的基礎(chǔ)是有能力拆分完整的算法代碼,拆分建立在對(duì)算法代碼的理解之上。

1.1 代碼復(fù)用

代碼復(fù)用[1]在企業(yè)中普遍使用,開(kāi)發(fā)人員出于效率、成本、代碼準(zhǔn)確性的考慮以多種形式實(shí)現(xiàn)代碼復(fù)用,已有的研究表明恰當(dāng)?shù)拇a復(fù)用可以快速集成功能、提高代碼準(zhǔn)確性。

國(guó)內(nèi)外關(guān)于代碼復(fù)用的研究經(jīng)歷了3 個(gè)階段:1)傳統(tǒng)代碼復(fù)用階段,開(kāi)發(fā)人員從互聯(lián)網(wǎng)手動(dòng)獲取可復(fù)用代碼、代碼文檔、代碼用例等,并對(duì)代碼進(jìn)行手動(dòng)更改。2)基于數(shù)據(jù)挖掘的代碼復(fù)用階段,分為代碼片段級(jí)別和代碼功能模塊兩個(gè)維度的復(fù)用:在代碼片段級(jí)別,Lin 等[2]將克隆檢測(cè)結(jié)果與多段代碼之間的差異比較技術(shù)相結(jié)合,檢測(cè)實(shí)例間的差異,同時(shí)認(rèn)為不同代碼的差異點(diǎn)可以轉(zhuǎn)化為代碼可變點(diǎn);而代碼功能模塊的復(fù)用即從相似代碼塊中抽取功能相似的設(shè)計(jì)和模板,開(kāi)發(fā)人員在此基礎(chǔ)上針對(duì)具體需求實(shí)現(xiàn)特定功能[3]。3)基于深度學(xué)習(xí)的代碼復(fù)用主要用于訓(xùn)練和預(yù)測(cè)階段[4],基于傳統(tǒng)統(tǒng)計(jì)學(xué)習(xí)的代碼推薦方法[5-10]和基于深度學(xué)習(xí)的代碼推薦方法[11-13]將代碼視為序列,并將包含N元語(yǔ)法(N-gram)等在內(nèi)的傳統(tǒng)統(tǒng)計(jì)模型或長(zhǎng)短期記憶(Long Short-Term Memory,LSTM)人工神經(jīng)網(wǎng)絡(luò)在內(nèi)的深度學(xué)習(xí)模型用于學(xué)習(xí)和訓(xùn)練,但這些研究方法缺乏對(duì)代碼的結(jié)構(gòu)信息的考量,導(dǎo)致它們無(wú)法有效捕獲遠(yuǎn)距離代碼間關(guān)系,同時(shí)并未實(shí)例化代碼中的參數(shù)。為了改進(jìn)這一情況,基于Tree-LSTM(Treebased LSTM)的推薦方法DeepAPIRec[14]應(yīng)運(yùn)而生,通過(guò)訓(xùn)練語(yǔ)句模型預(yù)測(cè)抽象代碼語(yǔ)句,并構(gòu)造參數(shù)模型以實(shí)現(xiàn)代碼語(yǔ)句的實(shí)例化。

基于此,本文確定了將算法代碼塊進(jìn)行拆分可以實(shí)現(xiàn)復(fù)用這一思想,將算法代碼進(jìn)行結(jié)構(gòu)化處理,同時(shí)獲取代碼的語(yǔ)義信息,為代碼復(fù)用作準(zhǔn)備。

1.2 代碼理解

為了實(shí)現(xiàn)代碼理解,研究界通常采用強(qiáng)化學(xué)習(xí)和隨機(jī)編譯進(jìn)行超優(yōu)化[15-16],或者借用自然語(yǔ)言處理(Natural Language Processing,NLP)中的概念處理人工編寫的代碼。這一方式的理論基于軟件語(yǔ)料庫(kù)具有與自然語(yǔ)言語(yǔ)料庫(kù)相似的統(tǒng)計(jì)特性,這些特性可以用來(lái)構(gòu)建更好的軟件工程工具[17]。在代碼字符(token)的上下文表示中,主流方法之一依賴于詞典編纂位置[11];另一種方法則是挖掘代碼的結(jié)構(gòu),使用數(shù)據(jù)流圖[18]、控制流圖(Control Flow Graph,CFG)[19-21]、抽象語(yǔ)法樹(shù)(Abstract Syntax Tree,AST)[22]、AST 中的路徑或擴(kuò)展的AST[23],例如使用連接不同用途和對(duì)應(yīng)于變量[18]的語(yǔ)法令牌的更新的附加邊。AST 是指一種用于表達(dá)源碼抽象語(yǔ)法結(jié)構(gòu)的樹(shù)狀結(jié)構(gòu)[24],Zettlemoyer 等[25]將AST 視作組合范疇語(yǔ)法(Combinatory Categorial Grammar,CCG)的輕量級(jí)版本,用來(lái)描繪代碼結(jié)構(gòu)。

算法代碼作為機(jī)器語(yǔ)言,包含嚴(yán)格的結(jié)構(gòu)信息,同時(shí)作為可理解的自然語(yǔ)言,具備語(yǔ)義信息。充分表達(dá)代碼的結(jié)構(gòu)和語(yǔ)義信息是進(jìn)行代碼解析的基礎(chǔ)。以信息檢索(Information Retrieval,IR)為代表的傳統(tǒng)方法通常將代碼片段視為自然語(yǔ)言文本,并基于標(biāo)簽對(duì)其進(jìn)行建模。Kamiya等[26]和Sajnani 等[27]用標(biāo)簽序列或一系列標(biāo)簽表達(dá)代碼,并將之用于代碼克隆檢測(cè)。另外,潛在語(yǔ)義標(biāo)引(Latent Semantic Indexing,LSI)[28]和文檔主題生成模型LDA(Latent Dirichlet Allocation)[29]也被應(yīng)用于分析源碼,并取得一定的效果[30-31]。但這些方法忽略了代碼具有更豐富明確的結(jié)構(gòu)信息,無(wú)法視為純自然語(yǔ)言或者基于代碼token 的方式進(jìn)行處理[32]。

2 面向業(yè)務(wù)的算法路徑自組配模型

本文通過(guò)將算法代碼拆分為功能完整的可復(fù)用組件,以算法組件為基準(zhǔn)構(gòu)建算法代碼資源庫(kù),并面向業(yè)務(wù)需求對(duì)算法組件進(jìn)行檢索、選擇與自動(dòng)組配,進(jìn)而構(gòu)建對(duì)應(yīng)業(yè)務(wù)需求的算法代碼流程。面向業(yè)務(wù)的算法自組配的起點(diǎn)為面向業(yè)務(wù)描述的算法代碼檢索。通過(guò)自然語(yǔ)言描述的業(yè)務(wù)信息,首先需要從算法庫(kù)中找到與業(yè)務(wù)需求最符合的代碼組件集合;然后從這些組件中挖掘功能集合作為待構(gòu)建的算法路徑的步驟,并依據(jù)先驗(yàn)知識(shí)訓(xùn)練得到的路徑發(fā)現(xiàn)與自組織模型;最后從面向業(yè)務(wù)的算法代碼組件集合中,構(gòu)建面向業(yè)務(wù)的算法自組配模型的流程,如圖1所示。

圖1 面向業(yè)務(wù)的算法自組配模型的流程Fig.1 Flow of algorithm path self-assembling model

算法組配包括兩種場(chǎng)景,簡(jiǎn)單需求直接匹配單一代碼塊,即輸入需求已被拆分為算法代碼步驟的最小顆粒度,進(jìn)行排序重組即可。復(fù)雜需求表現(xiàn)為輸入需求顆粒度比現(xiàn)有算法代碼顆粒度大。此場(chǎng)景的處理機(jī)制是輸入需求,以需求為關(guān)鍵詞檢索代碼資源庫(kù)中所有相關(guān)包含結(jié)構(gòu)信息的代碼組件,隨后將檢索到的代碼組件聚類,判斷該需求所需步驟以及步驟間的順序,即每一需求內(nèi)部形成小型組配任務(wù)。該場(chǎng)景需要實(shí)現(xiàn)兩層組配,第一層是外層需求代碼間的組配,該層組配與簡(jiǎn)單需求一致;第二層組配是單一需求拆分后的內(nèi)部代碼的組配,兩層組配完成后,才能最終實(shí)現(xiàn)代碼的可運(yùn)行。

2.1 算法組件表示模型

2.1.1 代碼結(jié)構(gòu)提取

在對(duì)算法代碼按照業(yè)務(wù)需求進(jìn)行組配前,首先需要拆分算法代碼,拆分后的算法代碼塊應(yīng)為一個(gè)算法代碼組件。一個(gè)組件通常包含了一個(gè)完整的功能,并且是組成算法的最小可復(fù)用單元。所謂最小,即拆分出來(lái)的代碼塊有且僅能實(shí)現(xiàn)單一步驟;所謂可復(fù)用,即拆分后的代碼塊需要具備一定的功能屬性,能實(shí)現(xiàn)具體的步驟,可以在其他代碼組合中運(yùn)行。

通過(guò)分析算法本身的業(yè)務(wù)流程,可以將算法劃分為一系列實(shí)現(xiàn)不同功能的步驟,每一個(gè)實(shí)現(xiàn)功能的步驟則可以被拆分為一個(gè)算法組件。本文面向的算法代碼為Python 語(yǔ)言,在Python 程序設(shè)計(jì)中,函數(shù)的設(shè)計(jì)一般滿足如上需求,因此對(duì)于算法組件的拆分,以函數(shù)為單位進(jìn)行。

本文結(jié)合AST 中詳細(xì)的變量之間賦值與操作關(guān)系,對(duì)代碼中隱含的數(shù)據(jù)流程的結(jié)構(gòu)進(jìn)行解析,并將解析所得到的數(shù)據(jù)流程結(jié)構(gòu)與CFG 中基于流程控制的邏輯控制流程相結(jié)合,得到結(jié)合數(shù)據(jù)與流程的算法代碼結(jié)構(gòu)。本文構(gòu)建代碼的結(jié)構(gòu)的步驟如下:

1)對(duì)當(dāng)前項(xiàng)目中的所有算法組件,分析它們的調(diào)用關(guān)系,并標(biāo)注有調(diào)用關(guān)系的語(yǔ)句。

2)對(duì)代碼的抽象語(yǔ)法樹(shù)進(jìn)行解析,得到樹(shù)結(jié)構(gòu)GAST,初始化代碼結(jié)構(gòu)圖G。

3)基于解析出的抽象語(yǔ)法樹(shù),遍歷其中的節(jié)點(diǎn)V。

4)對(duì)于邏輯結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu),分別構(gòu)建邏輯控制流程節(jié)點(diǎn)集{vif,vfor,vwhile,vbreak,vcontinue,vreturn}、數(shù)據(jù)流程節(jié)點(diǎn)集{vassign,vop,vcall}和對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)集。

5)對(duì)于當(dāng)前節(jié)點(diǎn),如果它屬于某個(gè)節(jié)點(diǎn)集,則將它加入結(jié)構(gòu)G,如果它屬于邏輯控制流程開(kāi)始的節(jié)點(diǎn)集或數(shù)據(jù)流程節(jié)點(diǎn)集,則將它作為當(dāng)前子樹(shù)的頂點(diǎn),遞歸構(gòu)建邏輯結(jié)構(gòu)與數(shù)據(jù)結(jié)構(gòu)。

6)遍歷完成GAST后,對(duì)返回的圖,遍歷其中的節(jié)點(diǎn),將有組件間調(diào)用關(guān)系的節(jié)點(diǎn)進(jìn)行連接,獲得組件間調(diào)用的關(guān)系結(jié)構(gòu),最終獲得代碼的結(jié)構(gòu)圖G。

本文從算法代碼庫(kù)中選取代碼對(duì)上述步驟進(jìn)行說(shuō)明,選取代碼為word2vec 算法中的word2vec-run 函數(shù)代碼組件。本文進(jìn)行分析并構(gòu)建對(duì)應(yīng)的結(jié)構(gòu)。在構(gòu)建邏輯流程結(jié)構(gòu)與數(shù)據(jù)流結(jié)構(gòu)的基礎(chǔ)上,基于對(duì)算法package 內(nèi)算法組件之間調(diào)用關(guān)系的分析[33],進(jìn)一步從代碼中挖掘隱性結(jié)構(gòu)?;诒竟?jié)提出的結(jié)構(gòu)解析的步驟,對(duì)word2vec 的算法組件結(jié)構(gòu)進(jìn)行解析,最終共得到共37 條邊,35 個(gè)節(jié)點(diǎn)。對(duì)所構(gòu)建的結(jié)構(gòu)進(jìn)行可視化,如圖2 所示。

圖2 word2vec算法組件結(jié)構(gòu)的可視化Fig.2 Visualization of component structure of word2vec algorithm

可見(jiàn),在基于CFG 對(duì)算法的隱含邏輯結(jié)構(gòu)進(jìn)行表示的基礎(chǔ)上,本節(jié)提出的結(jié)構(gòu)解析方法能夠更加詳細(xì)地對(duì)算法組件中的變量等節(jié)點(diǎn)進(jìn)行建模,能夠更加有效地挖掘與表示代碼的結(jié)構(gòu)。

與AST 過(guò)于詳細(xì)、復(fù)雜的結(jié)構(gòu)相比,本文方法更加簡(jiǎn)潔,能夠從代碼的顯性結(jié)構(gòu)中,對(duì)隱含結(jié)構(gòu)進(jìn)行提??;與基于CFG 的簡(jiǎn)略結(jié)構(gòu)相比,本文方法更加詳盡,對(duì)CFG 中未解析的流程語(yǔ)句中所包含的豐富結(jié)構(gòu)信息進(jìn)行了挖掘,能在邏輯結(jié)構(gòu)的基礎(chǔ)上添加更多有效信息,從而更加完備地對(duì)代碼的結(jié)構(gòu)進(jìn)行表達(dá)。在數(shù)據(jù)與控制流程的基礎(chǔ)上,進(jìn)一步對(duì)算法組件間函數(shù)的調(diào)用關(guān)系進(jìn)行分析,從而對(duì)組件間的依賴進(jìn)行建模,更加有效地挖掘代碼中的隱性結(jié)構(gòu)。

2.1.2 代碼組件表示

本文通過(guò)2.1.1 節(jié)步驟,實(shí)現(xiàn)了對(duì)代碼結(jié)構(gòu)的解析。在此基礎(chǔ)上,使用GCN 以及結(jié)構(gòu)中節(jié)點(diǎn)的word2vec 表示為輸入對(duì)代碼的結(jié)構(gòu)與序列特征同時(shí)進(jìn)行建模。本文所采用的代碼數(shù)據(jù)為拆分后的算法代碼庫(kù)中的所有算法代碼組件,共計(jì)424 個(gè)代碼組件,具體步驟如下。

1)對(duì)于所有的代碼組件,提取其結(jié)構(gòu)與相應(yīng)節(jié)點(diǎn)的文本序列,并根據(jù)邏輯控制流程、數(shù)據(jù)流程等對(duì)節(jié)點(diǎn)劃分類型。

2)將提取出的結(jié)構(gòu)、文本序列與節(jié)點(diǎn)類型序列化為JavaScript 對(duì)象簡(jiǎn)譜(JavaScript Object Notation,JSON)文件存儲(chǔ)。

3)初始化GCN 模型,讀取結(jié)構(gòu)文件并構(gòu)建數(shù)據(jù)集。

4)使用節(jié)點(diǎn)分類作為向量表示的訓(xùn)練任務(wù),根據(jù)節(jié)點(diǎn)在代碼組件中的類型,訓(xùn)練模型預(yù)測(cè)節(jié)點(diǎn)的類型。

5)訓(xùn)練結(jié)束后,輸出模型最后一層的隱向量作為節(jié)點(diǎn)的向量表示。

基于以上步驟所構(gòu)建的數(shù)據(jù)集統(tǒng)計(jì)結(jié)果如表1 所示。

表1 算法組件結(jié)構(gòu)構(gòu)建結(jié)果Tab.1 Results of algorithm component structure construction

基于輸入的算法組件對(duì),模型首先從中分別提取算法組件的結(jié)構(gòu)信息,進(jìn)而獲得組件結(jié)構(gòu)的圖表示。其中,圖表示基于GCN,所獲得的表示為以圖中節(jié)點(diǎn)為單位的向量。在下一階段中,模型基于組件之間整體的結(jié)構(gòu)與語(yǔ)義信息進(jìn)行計(jì)算,因此,本文進(jìn)一步使用注意力池化(Attention Pooling)的方法將圖結(jié)構(gòu)中節(jié)點(diǎn)的向量編碼表示為整體的圖編碼。

最常用的基于單位向量得到整體表示的方法為對(duì)所有的單位向量進(jìn)行平均。在圖表示中,常用的平均方法為基于圖中節(jié)點(diǎn)度的加權(quán)平均方法:

其中:un為節(jié)點(diǎn)n的向量表示,wn為基于節(jié)點(diǎn)度的重要性度量權(quán)重。然而,在代碼的結(jié)構(gòu)圖中,節(jié)點(diǎn)的度信息無(wú)法很好地給出節(jié)點(diǎn)在圖中的重要性,基于度的加權(quán)方法無(wú)法很好地對(duì)代碼的整體結(jié)構(gòu)信息進(jìn)行表示。為了在圖結(jié)構(gòu)的整體編碼中強(qiáng)調(diào)圖中更重要的節(jié)點(diǎn),通常使用注意力機(jī)制(Attention Mechanism)為圖中節(jié)點(diǎn)增加可學(xué)習(xí)的權(quán)重,從而對(duì)基于節(jié)點(diǎn)對(duì)路徑關(guān)系的重要性對(duì)其向量進(jìn)行加權(quán)表示。

注意力機(jī)制在圖像處理與自然語(yǔ)言模型中被廣泛使用,并取得了廣泛的成功。在自然語(yǔ)言模型[34]中,通過(guò)在全連接網(wǎng)絡(luò)中使用注意力機(jī)制,模型可以對(duì)長(zhǎng)距離依賴進(jìn)行有效建模,同時(shí)避免了梯度問(wèn)題與模型復(fù)雜度問(wèn)題。在圖結(jié)構(gòu)中,對(duì)于節(jié)點(diǎn)向量編碼U∈RN×D,本文在模型中增加權(quán)重參數(shù)矩陣W∈RD×D作為注意力權(quán)重,并通過(guò)注意力權(quán)重加權(quán)的節(jié)點(diǎn)向量與圖結(jié)構(gòu)向量之間的內(nèi)積作為最終的注意力得分,用于計(jì)算整體的圖結(jié)構(gòu)信息。最終基于注意力的算法組件表示如式(2)所示:

其中:fnorm為歸一化函數(shù),用于對(duì)最終的注意力得分進(jìn)行歸一化;f1為非線性變換函數(shù);最終得到的VG為整體的圖結(jié)構(gòu)表示。

使用基于注意力的加權(quán)表示,模型分別對(duì)輸入的算法組件對(duì)進(jìn)行結(jié)構(gòu)與語(yǔ)義信息的向量表示,并使用向量表示作進(jìn)一步的路徑計(jì)算。

2.1.3 組件對(duì)融合向量表示

模型通過(guò)計(jì)算圖結(jié)構(gòu)之間的關(guān)系判斷組件之間是否存在路徑,其中組件結(jié)構(gòu)信息的交互通過(guò)卷積計(jì)算進(jìn)行。為了對(duì)結(jié)構(gòu)之間的關(guān)系進(jìn)行計(jì)算,本文借鑒ConvE(Convolutional two-dimensional knowledge graph Embeddings)[35]中獲得的知識(shí)圖譜三元組中實(shí)體與關(guān)系的二維向量表示,使用卷積網(wǎng)絡(luò)獲得兩個(gè)算法組件結(jié)構(gòu)的融合向量,從而在基于目標(biāo)使用反向傳播進(jìn)行優(yōu)化時(shí),將路徑信息通過(guò)卷積網(wǎng)絡(luò)獲得的融合向量分別傳播到各個(gè)組件的表示中,從而使得模型能夠同時(shí)利用輸入的算法組件中的結(jié)構(gòu)信息并根據(jù)組件間的結(jié)構(gòu)信息的交互計(jì)算判斷算法組件之間是否存在路徑。其中,輸入的算法組件的向量融合表示如式(3)所示:

通過(guò)將組件對(duì)的結(jié)構(gòu)表示進(jìn)行卷積計(jì)算,模型得到了組件結(jié)構(gòu)之間的融合向量,并以此為依據(jù)進(jìn)行結(jié)構(gòu)間關(guān)系的計(jì)算。

2.2 基于語(yǔ)義擴(kuò)充的檢索模型

本文面向的對(duì)象主要為較為籠統(tǒng)的自然語(yǔ)言描述的業(yè)務(wù)需求。為了對(duì)自然語(yǔ)言中的檢索詞進(jìn)行語(yǔ)義擴(kuò)展,基于算法相關(guān)資源構(gòu)建概念共現(xiàn)網(wǎng)絡(luò)。算法文檔和相關(guān)論文中包含的概念都可用于描述算法組件,因此將算法相關(guān)文檔、論文中的概念提取出來(lái)構(gòu)建概念網(wǎng)絡(luò)。首先,在代碼庫(kù)的基礎(chǔ)上,構(gòu)建與之關(guān)聯(lián)的文檔庫(kù)和論文庫(kù),用于代碼組件檢索時(shí)進(jìn)行語(yǔ)義擴(kuò)充;然后,使用多語(yǔ)言BERT(Multilingual Bidirectional Encoder Representation from Transformers,M-BERT)在中英兩種語(yǔ)言上進(jìn)行序列標(biāo)注任務(wù),從而識(shí)別中英文論文中的概念;最后,利用提取出的概念實(shí)體進(jìn)行面向業(yè)務(wù)的代碼檢索模型構(gòu)建。

本文基于所構(gòu)建的代碼表示模型,將算法代碼庫(kù)中的所有代碼進(jìn)行向量化表示,并提取業(yè)務(wù)需求中的概念進(jìn)行向量化,通過(guò)向量檢索的方式,從結(jié)構(gòu)與語(yǔ)義的層面對(duì)代碼進(jìn)行深度檢索,實(shí)現(xiàn)面向業(yè)務(wù)的算法代碼獲取。本文構(gòu)建的檢索模型的步驟如下。

1)給定業(yè)務(wù)需求,使用構(gòu)建的概念識(shí)別模型,從中提取概念關(guān)鍵詞。

2)在概念抽取的基礎(chǔ)上進(jìn)行分詞并過(guò)濾停用詞,獲得業(yè)務(wù)需求的詞袋表示。

3)基于拆分后的算法代碼組件,對(duì)于每個(gè)組件,提取其中的方法調(diào)用的變量名稱,將同一組件內(nèi)的變量視為有共現(xiàn)關(guān)系,并提取與之關(guān)聯(lián)的算法文檔、論文中的概念,基于窗口構(gòu)建概念的共現(xiàn)關(guān)系。遍歷所有組件,構(gòu)建共現(xiàn)矩陣C。

4)基于業(yè)務(wù)需求提取出的概念,從共現(xiàn)矩陣中檢索概念與變量名稱的共現(xiàn),得到共現(xiàn)矩陣C'中矩陣的元素為概念與變量共現(xiàn)的次數(shù)。

5)對(duì)于業(yè)務(wù)需求中的概念i,從C′取與它共現(xiàn)次數(shù)最高的前e個(gè)詞作為業(yè)務(wù)需求的擴(kuò)充概念,將它加入業(yè)務(wù)需求的詞袋表示,其中e的取值由閾值決定。

6)基于業(yè)務(wù)需求的詞袋表示,獲得它基于詞袋的向量表示;使用該表示對(duì)算法代碼組件庫(kù)中所有組件的向量表示進(jìn)行檢索。其中,檢索的分值由式(4)給出:

其中:xq為業(yè)務(wù)需求的向量表示,xj為算法組件j的向量表示,常量ε作為約束值。

2.3 路徑關(guān)系發(fā)現(xiàn)模型

將通過(guò)2.1.3 節(jié)方法得到的融合向量使用全連接網(wǎng)絡(luò)輸出,并基于全連接網(wǎng)絡(luò)的輸入與目標(biāo)之間計(jì)算誤差,從而對(duì)組件間的路徑關(guān)系建模。將路徑關(guān)系的挖掘視為二分類問(wèn)題:將組件對(duì)輸入模型,如果組件之間存在路徑,模型應(yīng)將關(guān)系預(yù)測(cè)為1;如果沒(méi)有路徑關(guān)系,則模型預(yù)測(cè)應(yīng)接近0。然而,僅使用二分類任務(wù)對(duì)路徑挖掘建模,模型難以收斂。在此基礎(chǔ)上,本文同時(shí)將路徑發(fā)現(xiàn)任務(wù)視為排序任務(wù),在聯(lián)合學(xué)習(xí)的框架下,同時(shí)對(duì)二分類任務(wù)與排序任務(wù)進(jìn)行學(xué)習(xí),從而對(duì)算法組件之間的路徑關(guān)系進(jìn)行建模。具體地,模型在階段2 使用的二維卷積模型輸出的向量基礎(chǔ)上,使用2 層的全連接神經(jīng)網(wǎng)絡(luò)將最終的表示分別映射到排序任務(wù)的向量輸出與二分類任務(wù)的向量輸出。在計(jì)算排序任務(wù)時(shí),模型隨機(jī)從負(fù)例中抽樣算法組件對(duì),并認(rèn)為正例的組件對(duì)在排序上得分應(yīng)高于負(fù)例的得分?;诼?lián)合訓(xùn)練,模型的損失函數(shù)為:

基于以上聯(lián)合損失,模型利用算法組件之間的結(jié)構(gòu)特征,針對(duì)組件之間的路徑關(guān)系進(jìn)行優(yōu)化。

基于上述模型內(nèi)容,研究所構(gòu)建的算法組件間路徑發(fā)現(xiàn)模型如圖3 所示。

圖3 路徑發(fā)現(xiàn)模型Fig.3 Path discovery model

2.4 路徑自組織模型

2.3節(jié)中通過(guò)構(gòu)建路徑發(fā)現(xiàn)模型,從聚類挖掘出的功能集合中進(jìn)一步構(gòu)建了以算法組件對(duì)為單位的算法步驟,初步形成了算法路徑。然而,在這一步中挖掘出的路徑中的組件處于無(wú)序狀態(tài)。為了實(shí)現(xiàn)算法路徑的自組織,需要在構(gòu)建出的路徑的基礎(chǔ)上,通過(guò)挖掘出的算法組件的結(jié)構(gòu)信息與語(yǔ)義信息,依據(jù)所形成的路徑的整體結(jié)構(gòu)與語(yǔ)義關(guān)系,使得作為步驟的算法組件能夠?qū)崿F(xiàn)自組配,從而在路徑上形成有序的算法組件路徑,最終實(shí)現(xiàn)算法自組配。

為了讓算法組件步驟能夠基于結(jié)構(gòu)與語(yǔ)義信息自組配,可以將它視為面向整體算法流程的檢索任務(wù):給定已經(jīng)挖掘出的整體的無(wú)序算法路徑,為路徑中的算法組件給出分值,使得在組配流程中需要被組配到流程前列的算法組件得到更高的分值,而在流程中處于后列的算法組件得到更低的分值。

以上問(wèn)題可以形式化為:給定從功能集合中構(gòu)建出的算法組件路徑子集D={d1,d2,…,dn},構(gòu)建檢索函數(shù)f,應(yīng)該返回一個(gè)排序r*,使得D中的算法組件的排序滿足在源代碼中的先驗(yàn)分布?;谏弦还?jié)的路徑發(fā)現(xiàn)模型所構(gòu)建出的算法步驟子集,其中的算法組件以組件對(duì)的形式被發(fā)現(xiàn),因此,本文基于對(duì)間(pairwise)的方式從構(gòu)建出的算法路徑中,進(jìn)一步構(gòu)建排序模型,實(shí)現(xiàn)算法路徑的自組織。

上一節(jié)中所構(gòu)建的算法組件間路徑r與最佳排序r*可以視為滿足弱序條件(weak ordering)的D×D上的二元關(guān)系組,其中r?D×D且r*?D×D。對(duì)于r與r*中的算法組件di與dj,如果它們順序相同為同序?qū)Γ煌瑒t為異序?qū)?,?shù)量分別為P和Q。在數(shù)量為n的有限算法組件子集D中,P和Q的和為則r與r*的kendall 系數(shù)定義為:

其中ra和rb用于代表兩個(gè)路徑。

可以看出,兩個(gè)路徑的kendall 系數(shù)只與Q有關(guān),而Q給出了平均精度的下界:

因此,要構(gòu)建接近最優(yōu)算法路徑r*的算法組件子集,則要給定這一路徑的集合D作為檢索q,學(xué)習(xí)一個(gè)能夠最大化kendall 系數(shù)τ的函數(shù)f:

對(duì)于本節(jié)研究所面向的算法組件子集,構(gòu)建出的路徑以算法對(duì)(di,dj)的關(guān)系呈現(xiàn),因此對(duì)于學(xué)習(xí)函數(shù)f,可以將它視為根據(jù)集合D判斷組件對(duì)中哪個(gè)組件在路徑中的位置更靠前,即:

其中:w是學(xué)習(xí)的權(quán)重向量;Φ(q,di)是檢索式q與文檔di之間的匹配關(guān)系映射所得的相關(guān)特征。函數(shù)f最大化kendell系數(shù)式,等價(jià)于最小化式中的Q,等價(jià)于學(xué)習(xí)一個(gè)w使得式中的二元組數(shù)量最大。因此,問(wèn)題轉(zhuǎn)化為一個(gè)二分類問(wèn)題,分類器通過(guò)學(xué)習(xí)w計(jì)算式,對(duì)二元組進(jìn)行真值標(biāo)注。在構(gòu)建針對(duì)功能集合的算法路徑中,通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),在聯(lián)合學(xué)習(xí)的框架下進(jìn)行訓(xùn)練能夠使得模型更穩(wěn)定地收斂。因此,在上述任務(wù)的基礎(chǔ)上,將路徑中的算法組件對(duì)擴(kuò)展到整條路徑中的算法組件子集,對(duì)于集合D與集合中所有的算法組件,模型同時(shí)學(xué)習(xí)一個(gè)函數(shù)f(w),從而對(duì)于集合中的算法組件dj,排在路徑中最前列的概率[36]為:

因此,可以通過(guò)交叉熵?fù)p失最大化形成算法路徑的概率:

其中y為最優(yōu)算法路徑r*中算法組件的得分序列。

基于上述研究與所構(gòu)建出的算法組件組成的無(wú)序算法路徑子集,在聯(lián)合學(xué)習(xí)的框架下,構(gòu)建了算法路徑的自組織模型。模型接受3 組輸入:所有組成路徑的算法組件子集、待排序的算法組件1 和待排序的算法組件2。模型首先對(duì)以上的算法組件分別提取結(jié)構(gòu)與序列信息,并基于注意力池化分別將輸入的組件表示為能夠?qū)D的整體結(jié)構(gòu)與序列信息進(jìn)行編碼的向量。模型進(jìn)一步將所有組件子集的表示視為查詢向量query,將待排序的組件1 的表示視為鍵向量key,根據(jù)查詢向量query與鍵向量key,獲得它的融合向量vector;基于vector與組件2 的表示,給出組件1 與組件2 在所有組件子集的語(yǔ)境下的相對(duì)排序;同時(shí),基于融合向量vector,獲得它在所有組件子集中的排序得分。本文基于源代碼中所包含的算法組件的先驗(yàn)排序構(gòu)建訓(xùn)練集對(duì)模型進(jìn)行訓(xùn)練,從而得到算法路徑自組織模型,模型如圖4 所示。

圖4 算法路徑自組織模型Fig.4 Self-assembling model of algorithm path

3 實(shí)驗(yàn)與結(jié)果分析

3.1 基于功能的算法步驟挖掘

在本節(jié)中,選取詞頻-逆向文件頻率(Term Frequency-Inverse Document Frequency,TF-IDF)相關(guān)的算法作為資源,作為進(jìn)行算法自動(dòng)組配實(shí)驗(yàn)的數(shù)據(jù)。在本文構(gòu)建的算法資源庫(kù)中,以TF-IDF 為關(guān)鍵詞進(jìn)行檢索,檢索結(jié)果為庫(kù)中所有與TF-IDF 相關(guān)的算法,包括算法的源代碼以及拆分后的TF-IDF 的算法代碼,拆分后的算法塊為有完整功能的最小可復(fù)用單元,可以作為算法組件使用。檢索結(jié)果共包括5 個(gè)不同來(lái)源的TF-IDF 算法,總計(jì)25 個(gè)組件構(gòu)成,數(shù)據(jù)統(tǒng)計(jì)如表2 所示。

表2 實(shí)驗(yàn)數(shù)據(jù)統(tǒng)計(jì)Tab.2 Experimental data statistics

基于對(duì)算法代碼的向量表示,本文選取常用的聚類算法k-means 進(jìn)行聚類。通過(guò)計(jì)算所有類簇?cái)?shù)量k取值范圍內(nèi)的評(píng)測(cè)指標(biāo),并選取最優(yōu)指標(biāo)對(duì)應(yīng)的類簇?cái)?shù)量,確定所需k的取值。k是一個(gè)相對(duì)重要的參數(shù):若k取值過(guò)低,則無(wú)法有效區(qū)分不同的算法組件,導(dǎo)致原本需要進(jìn)行組配的兩類算法組件在同一個(gè)類里,從而影響組配進(jìn)行;若k取值過(guò)高,則會(huì)產(chǎn)生冗余的組件類型。定義k的取值范圍為k∈range(5,12)。

為了確定最優(yōu)k值,本文提出基于輪廓系數(shù)(Silhouette Coefficient)與方差比準(zhǔn)則(Calinski-Harabasz score)的加權(quán)指標(biāo)進(jìn)行類簇?cái)?shù)量確定的方法。該指標(biāo)計(jì)算方式如下:

其中:最終的評(píng)價(jià)指標(biāo)為輪廓系數(shù)與方差比準(zhǔn)則的加權(quán)和,評(píng)價(jià)指標(biāo)值越高,表明k的取值越好;權(quán)重大小根據(jù)經(jīng)驗(yàn)確定,在實(shí)驗(yàn)中選取α=0.2,β=0.8。選用式(14)中提出的加權(quán)指標(biāo),對(duì)聚類模型的類簇?cái)?shù)量進(jìn)行確定。根據(jù)實(shí)驗(yàn)結(jié)果,在k=6 時(shí),得到最優(yōu)指標(biāo)。其中k取不同值時(shí)的指標(biāo)變化如圖5 所示。

圖5 k取不同值時(shí)的指標(biāo)變化Fig.5 Influence of k on Score

從表3 聚類結(jié)果可見(jiàn),大部分類簇所包含的功能均得到了有效區(qū)分。分析未能正確聚類的算法組件,所實(shí)現(xiàn)的功能、其中所包含的變量命名以及文檔與被聚在同類的其余組件均較為相似,因此未能正確聚類。在類簇0 中,對(duì)構(gòu)建字典的代碼內(nèi)容分析,其本質(zhì)為統(tǒng)計(jì)語(yǔ)料庫(kù)中不同詞出現(xiàn)的次數(shù)并構(gòu)建字典,大部分實(shí)現(xiàn)與計(jì)算TF 值的實(shí)現(xiàn)一致,因此被聚在同一類中。實(shí)驗(yàn)結(jié)果表明,本文提出的使用聚類模型對(duì)所有的候選代碼組件進(jìn)行功能區(qū)分以及步驟挖掘的方法能夠較好地區(qū)分出不同功能的候選代碼,且基于聚類模型制定的k值評(píng)價(jià)指標(biāo)能夠有效挖掘算法流程中步驟數(shù),從而為進(jìn)一步的代碼組配提供依據(jù)。

表3 TF-IDF算法組件聚類結(jié)果Tab.3 Component clustering results of TF-IDF algorithm

3.2 算法路徑關(guān)系發(fā)現(xiàn)

本文選取算法代碼庫(kù)中所有拆分后的代碼,根據(jù)源代碼中函數(shù)執(zhí)行的順序作為路徑的先驗(yàn)知識(shí),對(duì)算法組件之間的路徑關(guān)系進(jìn)行標(biāo)注。同一源代碼中的算法組件之間存在路徑關(guān)系,本質(zhì)是同一源代碼的算法組件之間因?yàn)樽兞棵⒑瘮?shù)調(diào)用以及輸入、輸出的參數(shù)等變量所構(gòu)成的圖結(jié)構(gòu)之間存在一定先驗(yàn)聯(lián)系。在源代碼中,如果兩個(gè)算法組件存在執(zhí)行的先后順序,則認(rèn)為這兩個(gè)組件之間存在路徑關(guān)系,對(duì)于存在路徑的算法組件,將這兩個(gè)組件之間的關(guān)系標(biāo)為1。標(biāo)注完畢后,選取不同的算法源代碼,不同算法之間功能不同的算法組件不存在路徑關(guān)系。按照這樣的策略,從所有樣本中獲取負(fù)例樣本,數(shù)量遠(yuǎn)大于正例樣本,因此,在進(jìn)行訓(xùn)練時(shí),根據(jù)不同算法之間功能不同的算法組件不存在路徑關(guān)系這一假設(shè),制定了抽樣策略,在更新模型參數(shù)時(shí),根據(jù)抽樣策略隨機(jī)抽動(dòng)態(tài)樣出不存在路徑關(guān)系的組件對(duì),將路徑關(guān)系標(biāo)為0。最終,共得到正例樣本385 個(gè)。本文對(duì)樣本進(jìn)行隨機(jī)排序,并按照4∶1 的比例從獲得的正例樣本中構(gòu)建訓(xùn)練集與測(cè)試集,并根據(jù)抽樣策略抽取了80 個(gè)算法組件對(duì)作為負(fù)例樣本的測(cè)試集。使用算法組件先驗(yàn)知識(shí)得到的數(shù)據(jù)集進(jìn)行訓(xùn)練后,使用得到的模型,進(jìn)一步從3.1 節(jié)聚類挖掘出的不同功能類別的算法組件中,進(jìn)行算法路徑的挖掘,以進(jìn)一步驗(yàn)證模型的有效性。

初始化上述路徑發(fā)現(xiàn)模型使用的參數(shù)如表4。

表4 路徑發(fā)現(xiàn)模型的初始化參數(shù)Tab.4 Initialization parameters for path discovery model

使用準(zhǔn)確率(Accuracy)作為模型的評(píng)價(jià)指標(biāo),對(duì)模型預(yù)測(cè)算法組件之間是否存在路徑關(guān)系的性能進(jìn)行評(píng)估。采用模型第2 層全連接層的輸出并使用sigmoid 函數(shù)進(jìn)行歸一化,作為路徑存在的概率,并劃定閾值,作為依據(jù)概率判斷路徑是否存在的依據(jù)。實(shí)驗(yàn)中,存在路徑的閾值定為0.85,不存在路徑的閾值定位0.15。最終,在訓(xùn)練至第300 次時(shí),模型準(zhǔn)確率達(dá)到最高為0.95,訓(xùn)練集損失值最低為3.98,在測(cè)試集上的最高準(zhǔn)確率達(dá)到0.72。

由結(jié)果可知,模型可以較好地?cái)M合根據(jù)先驗(yàn)路徑關(guān)系構(gòu)建的訓(xùn)練數(shù)據(jù),并在測(cè)試集上具有較好的泛化能力,說(shuō)明模型可以較好地建立從源代碼中的路徑關(guān)系到算法代碼結(jié)構(gòu)與語(yǔ)義信息的聯(lián)系。進(jìn)一步選取聚類所得到的6 類算法步驟,從中進(jìn)行算法路徑挖掘,步驟如下。

1)從聚類得到的第一個(gè)類簇#0 出發(fā),遍歷其余所有聚類得到的功能集合。

2)遍歷類簇#0 中的算法組件。

3)對(duì)于其中的每個(gè)組件,計(jì)算和后一個(gè)類簇中的所有組件形成路徑的概率。

4)選取概率最高的組件對(duì),將當(dāng)前的算法組件添加到路徑,并從組件對(duì)中屬于下一個(gè)類簇的組件開(kāi)始,計(jì)算和后一個(gè)類簇中的所有組件形成路徑的概率。

5)如果當(dāng)前組件和下一類簇的所有組件都無(wú)法形成路徑,則跳過(guò)下一類簇。

6)重復(fù)步驟3)~4),直到對(duì)聚類得到的所有類簇遍歷完成。

基于以上步驟,能挖掘出所有的功能集合中可組成算法路徑的概率最大的算法組件集。在挖掘完成后,還可以通過(guò)從聚類類簇中去掉已經(jīng)挖掘出的算法步驟,重復(fù)執(zhí)行算法,挖掘出所有可能的算法路徑。

從表3 中聚類得到的算法功能類別數(shù)據(jù),進(jìn)行算法路徑的構(gòu)建。選取所構(gòu)建出概率最大的路徑,如表5 所示。

表5 算法組件間的路徑發(fā)現(xiàn)結(jié)果Tab.5 Results of path discovery among algorithm components

根據(jù)路徑概率,可計(jì)算該條算法路徑形成的置信度為0.904,為聚類數(shù)據(jù)中置信度最高的路徑。分析所構(gòu)建的路徑,發(fā)現(xiàn)模型能夠利用訓(xùn)練數(shù)據(jù)中算法組件結(jié)構(gòu)與序列信息之間的先驗(yàn)數(shù)據(jù),將結(jié)構(gòu)與語(yǔ)義最為匹配的算法組件挖掘出來(lái),構(gòu)成算法流程。

基于路徑發(fā)現(xiàn)模型,可以有效構(gòu)建出算法流程中所需要的所有算法組件,形成算法步驟。然而,這些算法步驟之間并沒(méi)有順序關(guān)系,因此,進(jìn)一步構(gòu)建路徑自組織模型,基于所發(fā)現(xiàn)的所有算法步驟,對(duì)其中的算法組件進(jìn)行排序,從而最終實(shí)現(xiàn)算法的自組配。

3.3 基于排序的算法路徑自組織

訓(xùn)練數(shù)據(jù)來(lái)源于拆分后的算法組件及其源代碼,以源代碼中算法組件的調(diào)用順序作為算法路徑構(gòu)建中算法組件順序的先驗(yàn)知識(shí)來(lái)源,統(tǒng)計(jì)數(shù)據(jù)如圖6 所示。

圖6 排序數(shù)據(jù)集的統(tǒng)計(jì)Fig.6 Statistics of ranking datasets

對(duì)于同一個(gè)流程中不同的算法組件,本文對(duì)組件進(jìn)行遍歷構(gòu)建組件三元組,三元組包括算法流程中的兩個(gè)算法組件,以及源代碼的所有組件。將三元組中,組件1 排序靠前的作為正例,組件2 排序靠前的作為負(fù)例;在三元組的基礎(chǔ)上,進(jìn)一步根據(jù)組件在算法流程中的順序,獲得其中組件1與組件2 的排序得分。排序分?jǐn)?shù)的范圍來(lái)源于排序數(shù)據(jù)集中包含最多算法組件的算法流程中算法組件數(shù)。根據(jù)所統(tǒng)計(jì)的排序數(shù)據(jù)集,制定排序分?jǐn)?shù)范圍為Score=range(0,25)。對(duì)于算法流程中的算法組件di,如果它在算法流程中的排序?yàn)閕,其排序得分Si=max(Score) -i。在三元組的基礎(chǔ)上,加入組件1 與組件2 的排序得分,形成包括組件1、組件2、源代碼組件集合和組件得分這4 個(gè)元素的數(shù)據(jù),作為數(shù)據(jù)集中每條數(shù)據(jù)的字段。最終構(gòu)建的路徑自組織數(shù)據(jù)集共包含正負(fù)例各2 316 條數(shù)據(jù)。研究采用4∶1 的比例劃分訓(xùn)練集與驗(yàn)證集,在模型上進(jìn)行訓(xùn)練并驗(yàn)證模型對(duì)算法對(duì)排序的性能。

本文采用表6 所示參數(shù)初始化路徑自組織模型。

表6 路徑自組織模型的初始化參數(shù)Tab.6 Initialization parameters for path self-assembling model

使用準(zhǔn)確率作為對(duì)模型預(yù)測(cè)組件對(duì)排序的評(píng)價(jià)指標(biāo),對(duì)模型預(yù)測(cè)某一算法路徑中算法步驟順序的性能進(jìn)行評(píng)價(jià)。其中,針對(duì)模型輸出的對(duì)算法組件對(duì)的排序,采用模型輸出二元排序分?jǐn)?shù)的全連接層的輸出,并劃分閾值,作為排序打分。其中,組件1 排序高于組件2 排序的閾值設(shè)置為0.85,組件1 排序低于組件2 排序的閾值設(shè)置為0.15。在模型訓(xùn)練過(guò)程中,采用早停策略,在第40 個(gè)epoch 時(shí),模型在測(cè)試集上的準(zhǔn)確率達(dá)到0.92,在訓(xùn)練集上的準(zhǔn)確率達(dá)到0.98。模型訓(xùn)練過(guò)程中的損失值最低為0.17。

依據(jù)本節(jié)所構(gòu)建的自組織模型,進(jìn)一步使用3.2 節(jié)中的算法組件集構(gòu)成的路徑,依據(jù)算法組件間的排序分值對(duì)其進(jìn)行自組織,最終構(gòu)建出自組配的算法路徑,以驗(yàn)證算法路徑自組織模型的有效性?;诒? 中的路徑步驟數(shù)據(jù),路徑自組織模型給出其中算法組件對(duì)的排序概率分值,如表7所示。

表7 算法組件對(duì)間的排序分值Tab.7 Ranking scores among pairs of algorithm components

根據(jù)排序算法,輸出最終的算法路徑,如表8 所示。根據(jù)模型輸出的分值數(shù)據(jù),可以看到,模型能夠很好地利用從算法源代碼中所學(xué)到的先驗(yàn)路徑排序知識(shí),對(duì)形成算法路徑的組件輸出正確的排序,從而實(shí)現(xiàn)算法路徑中不同算法步驟的自組織,最終實(shí)現(xiàn)算法自組配,生成正確的算法流程路徑。為了進(jìn)一步驗(yàn)證所提出的算法自組配流程的有效性,選取更為復(fù)雜的決策樹(shù)算法,對(duì)其拆分后的代碼組件進(jìn)行組配。拆分得到的決策樹(shù)算法組件統(tǒng)計(jì)如表9 所示。

表8 TF-IDF算法組件自組配結(jié)果Tab.8 Component self-assembling results of TF-IDF algorithm

表9 決策樹(shù)算法組件統(tǒng)計(jì)Tab.9 Component statistics of decision tree algorithm

對(duì)決策樹(shù)組件進(jìn)行組配,輸出的算法路徑功能步驟組配結(jié)果為:1)讀取txt;2)劃分?jǐn)?shù)據(jù);3)計(jì)算信息熵;4)計(jì)算信息增益;5)ID3 選擇特征;6)多數(shù)決定葉子節(jié)點(diǎn)分類;7)生成樹(shù)。

分析組配得到的結(jié)果可以看到,更為復(fù)雜的決策樹(shù)算法上,從拆分得到的組件集合中,模型都能夠很好地挖掘功能不同的組件子集,并通過(guò)路徑發(fā)現(xiàn)與排序模型對(duì)算法組件進(jìn)行自組織,最終生成順序正確的算法流程,驗(yàn)證了本文所構(gòu)建的算法自組配方法的有效性。

3.4 面向業(yè)務(wù)需求的算法路徑自組配

本文評(píng)估基于單個(gè)業(yè)務(wù)需求,對(duì)于面向業(yè)務(wù)流程的自組配評(píng)估,僅需對(duì)流程上的各個(gè)步驟的評(píng)估指標(biāo)進(jìn)行平均即可得到業(yè)務(wù)流程的評(píng)估結(jié)果,因此采用的評(píng)估方式基于單個(gè)業(yè)務(wù)需求。

對(duì)于業(yè)務(wù)需求q最終組配得到的算法代碼,評(píng)價(jià)指標(biāo)由代碼自組配系統(tǒng)的召回率Rec(Recall)與平均精確度AP(Average Precision)聯(lián)合給出:

其中:GroundTruth為人工標(biāo)注的所有相關(guān)的算法數(shù);p@k為第k個(gè)樣本時(shí)的精確度;rel@k用來(lái)評(píng)估第k個(gè)樣本是否與檢索相關(guān),如果相關(guān)則為1;Rh表示召回的所有算法組件;Rt表示召回的組件中正確的組件數(shù)。

在實(shí)際實(shí)驗(yàn)中發(fā)現(xiàn),對(duì)于特定業(yè)務(wù)需求,算法代碼自組配系統(tǒng)首先根據(jù)算法代碼的向量表示檢索相關(guān)的算法組件,并進(jìn)行自動(dòng)組配。然而,算法組件組配的路徑并不唯一,即對(duì)于同一需求,可能存在多條合理的算法組配路徑實(shí)現(xiàn)這一需求,而自組配系統(tǒng)基于算法代碼表示,給出其中的一條路徑,因此使用人工制定的標(biāo)準(zhǔn)進(jìn)行評(píng)估,難以對(duì)每個(gè)需求都制定一個(gè)標(biāo)準(zhǔn)代碼檢索結(jié)果與組配路徑,導(dǎo)致使用上述評(píng)估指標(biāo)時(shí),自動(dòng)算法組配的指標(biāo)計(jì)算值過(guò)低。

因此,對(duì)上述評(píng)分公式進(jìn)行改進(jìn)。改進(jìn)后的評(píng)分公式不進(jìn)行精確匹配,而對(duì)功能相似度進(jìn)行匹配。對(duì)于排序@k(@表示top)上的代碼組件,如k1為人工選取的代碼組件,k2為自動(dòng)組配系統(tǒng)選取的代碼組件,其相似度sim(k1,k2)為:

其中:代碼組件的向量由網(wǎng)絡(luò)表示模型給出,vec()表示向量,如vec(k1)就是指代碼組件k1的向量?;谏鲜鱿嗨贫扔?jì)算公式,改進(jìn)后的代碼評(píng)分準(zhǔn)則中召回率、精確度的計(jì)算基于相似度閾值而非精確匹配,其中,判斷自動(dòng)組配系統(tǒng)給出的候選代碼組件與人工給出的候選代碼組件是否一致的標(biāo)準(zhǔn)由rel@k給出,即:

其中threshold為人工設(shè)定的相似度閾值。

本文在所有算法組件數(shù)據(jù)集的基礎(chǔ)上共構(gòu)建了3 個(gè)自然語(yǔ)言描述的業(yè)務(wù)需求作為檢索條件,并基于業(yè)務(wù)需求,人工選取排名靠前的20 個(gè)算法組件,作為最優(yōu)檢索排序,并分別使用基線模型與本文提出的檢索模型分別面向所構(gòu)建的業(yè)務(wù)需求進(jìn)行檢索。其中,研究所構(gòu)建的業(yè)務(wù)需求分別為:

query1:“給定多篇txt 格式的文本,讀取文本,并使用BM25 對(duì)讀取后的文檔進(jìn)行排序”。

query2:“基于一篇或多篇txt 格式的文本,使用textrank算法,從文本中包含的內(nèi)容中提取關(guān)鍵詞”。

query3:“給定語(yǔ)料庫(kù),其中包含多篇文本,每篇文本有多行文字,每行文字代表一句話,其中詞由空格隔開(kāi),使用word2vec 算法獲取其中的詞向量”。

在此基礎(chǔ)上,選取信息檢索領(lǐng)域常用的檢索模型作為基線模型,與本文方法進(jìn)行對(duì)比。本文所采用的基線模型為基于關(guān)鍵詞的BM25(Okapi BM25)排序算法,定義如式(20)所示:

其中:k、b為可調(diào)節(jié)的參數(shù),|D|為檢索的文檔的長(zhǎng)度,即為算法組件的詞袋表示的長(zhǎng)度,avgdl為文檔的平均長(zhǎng)度。在基于BM25 的方法中,僅對(duì)業(yè)務(wù)需求的自然語(yǔ)言描述進(jìn)行分詞,將分詞后獲得的詞作為語(yǔ)素,從算法代碼的詞袋表示中,使用字符串匹配的方式進(jìn)行檢索并計(jì)算BM25 分值,作為基線模型。

在實(shí)際檢索時(shí),由于本文所構(gòu)建的算法代碼庫(kù)大多基于英文,因此首先將所制定的query 轉(zhuǎn)為英文,采用檢索得到的算法組件,并依據(jù)相關(guān)性篩選出相關(guān)性過(guò)低的組件,將算法組件輸入本文所構(gòu)建的路徑發(fā)現(xiàn)與自組配模型中,得到自組配的算法流程?;谏鲜鲈u(píng)價(jià)指標(biāo),分別使用不同的算法組件表示方法進(jìn)行實(shí)驗(yàn),并分析最終構(gòu)建出的路徑的結(jié)果?;诼窂桨l(fā)現(xiàn)與自組配模型,本文構(gòu)建了3 種不同的表示模型進(jìn)行實(shí)驗(yàn):基于BM25 檢索與詞袋表示的模型;基于語(yǔ)義擴(kuò)充檢索與詞袋表示的模型;基于語(yǔ)義擴(kuò)充檢索與融合結(jié)構(gòu)、序列表示的模型?;谏鲜鲈u(píng)價(jià)指標(biāo),實(shí)驗(yàn)結(jié)果如表10所示。

表10 基于不同表示方法的檢索對(duì)比實(shí)驗(yàn)結(jié)果Tab.10 Comparative experiment results on retrieval based on different representation methods

分析結(jié)果可見(jiàn),本文所采用的模型與傳統(tǒng)的排序算法相比有較大的提升。在基本結(jié)構(gòu)相似的情況下(對(duì)向量的表示均采用skip-gram/cbow 結(jié)構(gòu)),本文所構(gòu)建的檢索方法能夠較大地提升檢索結(jié)果中相關(guān)算法組件的數(shù)量,從而顯著提高算法組配的結(jié)果,而傳統(tǒng)排序算法僅僅基于分詞后的詞相關(guān)度進(jìn)行排序,因此無(wú)法針對(duì)算法的語(yǔ)義與結(jié)構(gòu)進(jìn)行檢索。僅使用詞袋方法進(jìn)行語(yǔ)義表示的代碼表示方法,無(wú)法有效利用算法的結(jié)構(gòu)信息,因此無(wú)法形成有邏輯的組配路徑,而本文排序模型來(lái)源于源代碼的先驗(yàn)知識(shí),與使用傳統(tǒng)的表示方法相比,有較大的提升,說(shuō)明算法代碼組件及其資源的結(jié)構(gòu)與語(yǔ)義知識(shí)對(duì)于算法的自組配有較大的作用。

4 結(jié)語(yǔ)

本文構(gòu)建了算法路徑自組配模型,為實(shí)現(xiàn)算法結(jié)構(gòu)化管理提供依據(jù)。首先,基于情報(bào)工程算法平臺(tái),對(duì)代碼以最小可復(fù)用單元進(jìn)行拆分,使它與業(yè)務(wù)步驟相對(duì)應(yīng),為算法組配的實(shí)現(xiàn)奠定基礎(chǔ);接著,結(jié)合AST 和CFG 等對(duì)算法代碼進(jìn)行結(jié)構(gòu)提取,并使用GCN 和word2vec 對(duì)算法組件進(jìn)行圖向量表示;然后,在此基礎(chǔ)上使用聚類模型進(jìn)行步驟挖掘,通過(guò)組件對(duì)融合向量計(jì)算進(jìn)行組件間路徑發(fā)現(xiàn);最后,使用排序算法實(shí)現(xiàn)算法路徑自組配。

基于本文提出的自組配算法得到算法組件的自組織路徑后,仍有部分算法組件間的輸入輸出無(wú)法完全使用自動(dòng)化的方式進(jìn)行數(shù)據(jù)流的傳輸,需要人工介入對(duì)數(shù)據(jù)類型的調(diào)整來(lái)進(jìn)行算法管道構(gòu)建。在未來(lái)的工作中,將進(jìn)一步對(duì)算法組件間數(shù)據(jù)的規(guī)范化進(jìn)行研究,并結(jié)合現(xiàn)有自動(dòng)機(jī)器學(xué)習(xí)技術(shù),如超參數(shù)搜索等,進(jìn)一步構(gòu)建效率更高的算法自組配系統(tǒng)。

猜你喜歡
代碼排序組件
無(wú)人機(jī)智能巡檢在光伏電站組件診斷中的應(yīng)用
能源工程(2022年2期)2022-05-23 13:51:50
排序不等式
新型碎邊剪刀盤組件
恐怖排序
U盾外殼組件注塑模具設(shè)計(jì)
節(jié)日排序
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
佛坪县| 镇坪县| 怀集县| 江都市| 宣武区| 屯留县| 额敏县| 贡山| 姚安县| 虹口区| 潢川县| 乌什县| 南皮县| 孙吴县| 东山县| 平阴县| 大石桥市| 新田县| 西平县| 同江市| 宣化县| 桑植县| 崇明县| 时尚| 蕲春县| 离岛区| 张掖市| 桂东县| 城市| 奉贤区| 醴陵市| 陇川县| 北票市| 横峰县| 禄丰县| 汉阴县| 肃南| 西安市| 彰化市| 麻阳| 宽甸|