• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于神經(jīng)網(wǎng)絡(luò)融合模型的源代碼注釋自動(dòng)生成

      2021-04-22 07:25:04周其林劉旭東
      關(guān)鍵詞:詞法源代碼編碼器

      周其林, 王 旭, 劉旭東

      1. 中國(guó)人民大學(xué)新聞傳播實(shí)驗(yàn)中心, 北京 100872 2. 北京航空航天大學(xué)計(jì)算機(jī)學(xué)院, 北京 100191 3. 北京航空航天大學(xué)大數(shù)據(jù)科學(xué)與腦機(jī)智能高精尖創(chuàng)新中心, 北京 100191

      0 引 言

      研究發(fā)現(xiàn),在軟件維護(hù)和演化過(guò)程中,開(kāi)發(fā)者會(huì)耗費(fèi)大量的時(shí)間來(lái)閱讀和理解源代碼片段,為了節(jié)省時(shí)間,開(kāi)發(fā)者通常采用閱讀功能性注釋或僅閱讀關(guān)鍵代碼兩種策略[1]. 但這兩種方法并不總是高效,SourceForge、GitHub、Google Code等超大規(guī)模的軟件庫(kù)上包含海量的軟件和信息[2],里面眾多代碼片段缺少相應(yīng)的功能注釋?zhuān)詣?dòng)生成源代碼的注釋可以幫助開(kāi)發(fā)者了解代碼功能,實(shí)現(xiàn)關(guān)鍵代碼的快速定位.

      代碼注釋自動(dòng)生成是一種面向軟件代碼的自然語(yǔ)言生成系統(tǒng) (natural language generation),使用程序語(yǔ)言片段作為輸入,生成該代碼片段相應(yīng)的功能注釋. 傳統(tǒng)的代碼注釋生成遵循自然語(yǔ)言生成的一般模式,工作流程包括兩個(gè)部分:內(nèi)容選擇與文本生成. 內(nèi)容選擇部分檢索當(dāng)前代碼片段最相關(guān)的文本,注釋生成部分使用檢索到的文本內(nèi)容生成代碼注釋[3]. 內(nèi)容選擇常采用關(guān)鍵詞抽取[4]、主題模型[5-7]等方法,這個(gè)階段的文本生成并不過(guò)分強(qiáng)調(diào)生成注釋的流暢性,對(duì)代碼功能的準(zhǔn)確表達(dá)是更重要的目標(biāo),注釋的表示形式有以關(guān)鍵詞組合[4],以主題詞和關(guān)鍵詞作為代碼注釋描述[6]等方式.該類(lèi)注釋生成方法存在較大缺陷,一是生成的文本注釋可讀性不好、流暢度差,二是缺少對(duì)代碼詞法、語(yǔ)法等深層信息的利用.

      隨著深度學(xué)習(xí)的興起,基于神經(jīng)網(wǎng)絡(luò)的代碼注釋生成模型得到快速發(fā)展,性能全面超過(guò)傳統(tǒng)注釋生成方法. IYER等[8]在 2016年第一個(gè)提出將添加注意力的循環(huán)神經(jīng)網(wǎng)絡(luò)模型CODENN用于注釋生成. CODENN將代碼視作單詞 (Token) 序列挖掘詞法語(yǔ)義,通過(guò)順序生成目標(biāo)單詞得到相應(yīng)注釋文本. ALLAMANIS等[9]在2016年使用基于注意力的卷積模型生成平均長(zhǎng)度為3個(gè)詞的短注釋?zhuān)摲椒ㄉ傻奈谋咀⑨屘滩荒苋姹磉_(dá)給定代碼片段的功能語(yǔ)義. 在代碼的語(yǔ)法信息利用方面,HU等[10]于2017年將抽象語(yǔ)法樹(shù)遍歷得到語(yǔ)法序列,再使用基于注意力的Seq2Seq模型生成注釋?zhuān)撃P驮诶谜Z(yǔ)法信息生成注釋方面進(jìn)行了嘗試.

      相比傳統(tǒng)方法,上述基于神經(jīng)網(wǎng)絡(luò)的代碼注釋自動(dòng)生成方法取得了較好的結(jié)果,但它們?nèi)鄙賹?duì)源代碼詞法和語(yǔ)法信息的深度挖掘,包括源代碼中標(biāo)識(shí)符的特殊構(gòu)成方式以及兩者的融合表征等. 因此,如何更有效利用源代碼的詞法和語(yǔ)法信息指導(dǎo)注釋的自動(dòng)生成是本文的研究重點(diǎn).

      針對(duì)源代碼注釋自動(dòng)生成任務(wù),本文基于編碼器(Encoder)-解碼器(Decoder)框架開(kāi)展研究,Encoder是針對(duì)輸入代碼片段的功能語(yǔ)義編碼器,學(xué)到的語(yǔ)義編碼向量需要能夠更加全面準(zhǔn)確的表達(dá)代碼片段的功能;Decoder是生成功能注釋的自然語(yǔ)言解碼器,利用編碼器學(xué)到的功能語(yǔ)義編碼向量,使用循環(huán)神經(jīng)網(wǎng)絡(luò)序列生成符合功能語(yǔ)義的自然語(yǔ)言注釋?zhuān)诰幋a器和解碼器中,通過(guò)維護(hù)源代碼單詞字典和自然語(yǔ)言單詞詞表,并對(duì)其中的每個(gè)Token進(jìn)行Embedding計(jì)算得到詞向量,Embedding得到詞向量的過(guò)程參與模型訓(xùn)練.

      1 基于詞法信息的注釋生成模型

      通過(guò)利用編碼器-解碼器神經(jīng)網(wǎng)絡(luò)架構(gòu),注釋生成模型將源代碼片段視作Token序列,并進(jìn)一步將標(biāo)識(shí)符拆分為SubToken,然后將源代碼序列進(jìn)行詞嵌入表征(Embedding)后得到編碼向量序列X=(x1,x2,…,xm).經(jīng)過(guò)LSTM循環(huán)編碼得到編碼向量序列H=(h1,h2,…,hm),Encoder循環(huán)編碼得到語(yǔ)義編碼向量序列C=(c1,c2,…,cm),ct=ht+1,C是學(xué)習(xí)到的語(yǔ)義功能編碼,是對(duì)代碼片段詞法語(yǔ)義的向量表達(dá). 最后,考慮到不同單詞對(duì)語(yǔ)義貢獻(xiàn)的權(quán)重差異,采用注意力機(jī)制進(jìn)行解碼從而生成注釋.

      1.1 標(biāo)識(shí)符切割

      標(biāo)識(shí)符切割算法:蛇形命名法直接基于下劃線(xiàn)分割即可,對(duì)于匈牙利命名法和駝峰命名法基于命名法規(guī)則設(shè)計(jì)正則表達(dá)式進(jìn)行切割,通過(guò)命名法規(guī)則將標(biāo)識(shí)符Tokeni切割為(Ti1,Ti2,…,Tit),最后將切割后的Token序列按照原有位置組合得到SubToken序列,在輸入代碼片段中使用SubToken序列替換掉原有Token,將新的子標(biāo)識(shí)符代碼序列輸入編碼器-解碼器序列生成框架,用于訓(xùn)練生成代碼注釋.

      1.2 基于注意力機(jī)制的注釋生成

      解碼器采用循環(huán)神經(jīng)網(wǎng)絡(luò)LSTM進(jìn)行序列解碼得到注釋文本. 注釋生成從開(kāi)始標(biāo)識(shí)符的編碼向量y0開(kāi)始,y0=emb(′′),然后解碼器通過(guò)循環(huán)解碼生成注釋的語(yǔ)義向量h′t,h′t=LSTM(yt-1,h′t-1),最后使用注意力模塊解碼得到y(tǒng)t,直至解碼得到終結(jié)符為止,yt計(jì)算方法如下:

      yt=Attention(context,h′t)

      (1)

      得到注釋文本序列Y=(y1,y2,…,yn),基于詞表檢索yt得到相應(yīng)單詞從而組合生成注釋.

      為了考慮解決長(zhǎng)距離依賴(lài)問(wèn)題,同時(shí)照顧到源代碼單詞對(duì)語(yǔ)義貢獻(xiàn)的權(quán)重差異,本模型添加了注意力機(jī)制,注意力機(jī)制計(jì)算LSTM編碼器中間狀態(tài)序列(h1,h2,…,hm)的向量加權(quán)和ct,計(jì)算公式如下:

      (2)

      (3)

      (4)

      以團(tuán)隊(duì)為基礎(chǔ)的學(xué)習(xí)(team-based learning,TBL)的教學(xué)模式是由美國(guó)Oklahoma大學(xué)Michaelsen教授于70年代創(chuàng)立[5],與傳統(tǒng)以授課為基礎(chǔ)的學(xué)習(xí)有著明顯的不同,TBL不再以教學(xué)為主體,而是以學(xué)生為中心,是一種以團(tuán)隊(duì)為基礎(chǔ),提倡學(xué)生自主學(xué)習(xí),著重提高學(xué)生分析和解決問(wèn)題的能力,更好地激發(fā)學(xué)生的學(xué)習(xí)潛能,將學(xué)生培養(yǎng)成終身學(xué)習(xí)者為目標(biāo)的新型教學(xué)模式,這種教學(xué)模式,尤其適合進(jìn)行分組的病理實(shí)習(xí)課。

      (5)

      2 基于語(yǔ)法信息的注釋生成模型

      上一節(jié)基于詞法信息的序列生成模型,將源代碼視為T(mén)oken序列,序列生成的假設(shè)是有限前序依賴(lài),認(rèn)為當(dāng)前的Token只受到位于其前面位置Token的影響. 實(shí)際上對(duì)代碼而言,不同Token之間的相互依賴(lài)關(guān)系與語(yǔ)法結(jié)構(gòu)相關(guān). 從語(yǔ)法分析角度看,代碼片段的抽象語(yǔ)法樹(shù)AST(abstract syntax tree)體現(xiàn)了Token在語(yǔ)法層面的依賴(lài)關(guān)系,這種依賴(lài)關(guān)系是程序功能的重要依據(jù). 因此,可以基于抽象語(yǔ)法樹(shù)AST進(jìn)行語(yǔ)法信息的捕捉并生成相應(yīng)的注釋.

      本節(jié)在編碼器階段利用AST的依賴(lài)關(guān)系構(gòu)建得到堆棧序列,接著對(duì)堆棧序列使用循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行編碼,從而得到源代碼的語(yǔ)法結(jié)構(gòu)信息.

      為了利用源代碼語(yǔ)法信息,使用ANTLR4[11]得到源代碼片段的語(yǔ)法樹(shù)AST,為了將其轉(zhuǎn)化為堆棧序列,本文基于深度優(yōu)先遍歷設(shè)計(jì)了AST堆棧序列生成算法AST_LDR. 首先,使用詞法解析程序得到對(duì)應(yīng)代碼片段的Token序列,然后遞歸下降遍歷語(yǔ)法樹(shù)AST,在每條文法規(guī)則子程序前后加入括號(hào)輸出和節(jié)點(diǎn)輸出,即可解析得到該語(yǔ)法片段對(duì)應(yīng)的堆棧序列.

      算法1:AST堆棧序列生成算法AST_LDR輸入:AST樹(shù)Tree輸出:對(duì)應(yīng)的遞歸系列Rs1: Initialize: Set Rs = [ ]2: if(tree!=NULL)3: Rs+=tree.data4: if(tree -> left):5: Rs+=‘(’6: Rs+=AST_LDR(tree)7: Rs+=‘)’8: if(tree->right):9: Rs+=‘(’10: Rs+=AST_LDR(tree)11: Rs+=‘)’12: Return Rs

      圖1 抽象語(yǔ)法樹(shù)序列生成Fig.1 Token sequence generation using AST

      圖1所示的語(yǔ)法樹(shù)AST利用AST堆棧序列生成算法AST_LDR得到的堆棧序列Rs.

      Rs:h0(h1(x1h3(x2x3x4))x5h2(x6x7)).

      在編碼器階段,使用LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)對(duì)上述代碼堆棧序列進(jìn)行編碼. 由于堆棧序列利用抽象語(yǔ)法樹(shù)的依賴(lài)關(guān)系進(jìn)行構(gòu)建,因此可以有效捕捉源代碼的語(yǔ)法信息. 接著,使用全局注意力機(jī)制和LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行注釋的解碼生成.

      3 詞法語(yǔ)法融合模型

      本文3.1和3.2節(jié)中設(shè)計(jì)的模型分別從詞法、語(yǔ)法的角度挖掘了代碼片段的功能語(yǔ)義,均在一定程度上挖掘了代碼片段的功能,本節(jié)設(shè)計(jì)一個(gè)詞法、語(yǔ)法功能語(yǔ)義融合的功能語(yǔ)義編碼器,學(xué)到更全面的功能語(yǔ)義編碼向量,然后利用融合得到的編碼向量進(jìn)行注釋文本的序列生成.

      3.1 語(yǔ)義融合框架

      利用3.1和3.2節(jié)中的詞法和語(yǔ)法編碼器Lexical Encoder(code)和Syntax Encoder(AST),可以分別得到兩種編碼向量,結(jié)果如下:

      Hcode,Ccode=Encodercode(Code)

      (6)

      Hast,Cast=Encoderast(Ast)

      (7)

      Cmulti=lstm(Ccode,Cast)

      (8)

      如圖2所示,兩個(gè)編碼器得到的語(yǔ)義編碼向量Ccode、Cast通過(guò)LSTM門(mén)控記憶單元融合得到功能語(yǔ)義編碼向量Cmulti. 然后,針對(duì)得到的融合編碼向量Cmulti,使用LSTM循環(huán)解碼生成注釋序列.

      ht=LSTM(ht-1,yt-1,Attn)

      (9)

      式中h0=Cmulti,y0=emb(′′).

      圖2 融合注釋生成模型網(wǎng)絡(luò)結(jié)構(gòu)Fig.2 Neural network fusion model architecture

      3.2 融合注意力機(jī)制

      本模型使用注意力機(jī)制對(duì)兩個(gè)解碼器的各個(gè)狀態(tài)進(jìn)行加權(quán)求和,計(jì)算方法如下:

      (10)

      (11)

      (12)

      (13)

      其中,分別計(jì)算詞法編碼器的注意力編碼和語(yǔ)法編碼器的注意力編碼,然后將兩者的注意力編碼向量和隱藏層進(jìn)行拼接,再使用一個(gè)線(xiàn)性層變換維度,從而得到注釋生成階段的隱藏層編碼. 最后使用LSTM 循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行注釋的解碼生成.

      4 數(shù)據(jù)獲取

      在基于神經(jīng)網(wǎng)絡(luò)的源代碼注釋自動(dòng)生成方法中,訓(xùn)練數(shù)據(jù)的有效獲取是研究工作的基礎(chǔ). 由于開(kāi)源社區(qū)GitHub等擁有大量真實(shí)的項(xiàng)目源代碼,這些代碼和其對(duì)應(yīng)的注釋可以用于構(gòu)造數(shù)據(jù)集,圖3是一則選自GitHub的真實(shí)Java代碼片段,該方法上方的注釋描述了代碼功能,其中注釋的第一條語(yǔ)句描述可以作為本段代碼的功能注釋標(biāo)注.

      圖3 Java代碼片段及其注釋Fig.3 one Java code fragment and its comment

      在已有工作中,HU等提出的模型TL-CodeSum[12]使用了GitHub中2015—2016年創(chuàng)建且Star數(shù)至少為20的Java項(xiàng)目代碼構(gòu)建數(shù)據(jù)集. 該數(shù)據(jù)集共計(jì)87136條數(shù)據(jù). 由于該數(shù)據(jù)集重復(fù)度較高,本文將TL-CodeSum數(shù)據(jù)集去重后再按照8∶1∶1劃分訓(xùn)練集、驗(yàn)證集、測(cè)試集,去重后的數(shù)據(jù)集命名為MiniTL,MiniTL共有數(shù)據(jù)71494條.

      5 模型訓(xùn)練

      本文在數(shù)據(jù)集MiniTL對(duì)模型進(jìn)行訓(xùn)練,損失函數(shù)使用負(fù)對(duì)數(shù)似然函數(shù).所有模型中代碼和注釋的Embedding維度均設(shè)為400,詞法和語(yǔ)法兩個(gè)編碼器的功能語(yǔ)義編碼向量維度設(shè)為400,語(yǔ)義編碼融合向量維度設(shè)為400,輸入序列長(zhǎng)度設(shè)為1000,注釋文本序列長(zhǎng)度設(shè)為30,編碼器Encoder的詞表大小設(shè)為50000,解碼器Decoder的詞表大小設(shè)為30000. 優(yōu)化算法使用隨機(jī)梯度下降算法SGD進(jìn)行訓(xùn)練使得損失函數(shù)盡量小,學(xué)習(xí)率設(shè)為0.95,將Batch大小設(shè)為64,最終訓(xùn)練50輪次.使用Titan XP進(jìn)行訓(xùn)練,比較不同方法的性能.

      6 評(píng)測(cè)指標(biāo)

      為了評(píng)估源代碼注釋的生成質(zhì)量,本文使用自動(dòng)測(cè)評(píng)指標(biāo)BLEU、METEOR、召回率、準(zhǔn)確率、F1-Score測(cè)評(píng)注釋生成質(zhì)量. 其中,BLEU (bilingual evaluation understudy) 是IBM在2002年提出的一種基于n-gram共現(xiàn)的機(jī)器翻譯自動(dòng)評(píng)測(cè)方法[13]. METEOR是2005年由LAVIE提出的基于召回率的自然語(yǔ)言評(píng)測(cè)指標(biāo)[14].同時(shí)計(jì)算最優(yōu)候選注釋與人工注釋之間的召回率、準(zhǔn)確率、F1-Score,綜合這些指標(biāo)評(píng)估自動(dòng)生成的注釋和人工注釋之間的相似性、度量模型的注釋生成質(zhì)量.

      7 實(shí)驗(yàn)結(jié)果

      表1顯示了3段代碼通過(guò)不同的注釋生成模型生成的質(zhì)量對(duì)比,與真實(shí)注釋文本比較可以看出,基于神經(jīng)網(wǎng)絡(luò)的注釋生成模型都具有較好的可讀性. 同時(shí)直觀看出本文提出的融合模型Multi-NN對(duì)代碼片段功能的描述更準(zhǔn)確,驗(yàn)證了融合詞法和語(yǔ)法信息對(duì)代碼功能語(yǔ)義表征起到的重要作用.

      本文使用指標(biāo)BLEU4、METEOR、準(zhǔn)確率、召回率、F1-Score進(jìn)行評(píng)測(cè),這些指標(biāo)從不同角度體現(xiàn)了注釋的生成質(zhì)量,值越高表示注釋生成的質(zhì)量越好,評(píng)測(cè)結(jié)果如表2所示.

      從表2中可以看出應(yīng)用了命名法切割算法的SubCode2NL模型注釋生成效果有較大提升,在各個(gè)指標(biāo)上均優(yōu)于直接使用Token序列的Code2NL模型,同時(shí)SubCode2NL優(yōu)于CODENN模型,并且在多個(gè)指標(biāo)上優(yōu)于TL-CodeSum模型,驗(yàn)證了命名法切割算法的有效性. 同時(shí)對(duì)比Code2NL和基于詞法信息的注釋生成模型AST2NL得知,僅利用抽象語(yǔ)法樹(shù)捕捉語(yǔ)法信息生成注釋的質(zhì)量相對(duì)較差,和CODENN模型生成質(zhì)量相當(dāng). 對(duì)比本文提出的Multi-NN融合模型可知,融合了詞法和語(yǔ)法信息的神經(jīng)網(wǎng)絡(luò)融合模型在各個(gè)性能指標(biāo)上表現(xiàn)最優(yōu).

      表1 不同模型的注釋生成結(jié)果對(duì)比Tab.1 Comments generation results comparison

      表2 不同模型的評(píng)測(cè)結(jié)果(百分?jǐn)?shù))Table 2 Evaluation results %

      8 結(jié) 論

      源代碼注釋自動(dòng)生成是一個(gè)非常具有挑戰(zhàn)性的任務(wù),當(dāng)前的研究在詞法信息挖掘、融合詞法和語(yǔ)法信息這兩個(gè)方面都存在較大局限. 本文設(shè)計(jì)的命名法切割算法可以有效捕捉詞法信息,同時(shí)基于抽象語(yǔ)法樹(shù)的依賴(lài)關(guān)系編碼實(shí)現(xiàn)了對(duì)語(yǔ)法結(jié)構(gòu)信息的挖掘,本文設(shè)計(jì)了基于神經(jīng)網(wǎng)絡(luò)融合生成模型,實(shí)現(xiàn)了對(duì)詞法和語(yǔ)法信息的混合編碼,通過(guò)實(shí)驗(yàn)驗(yàn)證發(fā)現(xiàn),合適的融合機(jī)制確實(shí)能夠獲得質(zhì)量更高的混合編碼向量,生成的注釋在BLEU4、METEOR等測(cè)評(píng)指標(biāo)上均實(shí)現(xiàn)了顯著提升.

      猜你喜歡
      詞法源代碼編碼器
      人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
      基于TXL的源代碼插樁技術(shù)研究
      基于FPGA的同步機(jī)軸角編碼器
      軟件源代碼非公知性司法鑒定方法探析
      應(yīng)用于詞法分析器的算法分析優(yōu)化
      基于PRBS檢測(cè)的8B/IOB編碼器設(shè)計(jì)
      談對(duì)外漢語(yǔ)“詞法詞”教學(xué)
      揭秘龍湖產(chǎn)品“源代碼”
      JESD204B接口協(xié)議中的8B10B編碼器設(shè)計(jì)
      電子器件(2015年5期)2015-12-29 08:42:24
      多總線(xiàn)式光電編碼器的設(shè)計(jì)與應(yīng)用
      双柏县| 尉犁县| 隆德县| 达日县| 齐齐哈尔市| 安塞县| 远安县| 彰武县| 古交市| 仁布县| 郑州市| 方山县| 马鞍山市| 抚宁县| 雅江县| 荆州市| 临漳县| 紫金县| 东阳市| 郑州市| 壶关县| 闵行区| 临夏县| 仲巴县| 溧阳市| 石泉县| 陆河县| 惠州市| 柘城县| 延边| 勐海县| 沿河| 精河县| 宜都市| 周至县| 万源市| 固安县| 泊头市| 韶关市| 永安市| 遂昌县|