李 陣,鈕 俊,王 奎,辛園園
(寧波大學 信息科學與工程學院 浙江 寧波 315211)
在軟件開發(fā)過程中,代碼復用是提高軟件開發(fā)效率的重要手段。目前,互聯網中積累了大量的開源代碼,如知名開源庫GitHub[1]、OSChina[2]、CodePlex[3]等。在編制程序時,程序員可以對這些開源代碼進行復用,從而降低開發(fā)成本。代碼搜索是對其復用的前提。如何從開源軟件中準確地提取高質量的代碼資源并復用到軟件產品中,是提高軟件開發(fā)效率需要解決的重要問題。
針對代碼搜索算法輸入的不同形式,當前已經出現了基于關鍵字、接口、輸入輸出等形式的開源代碼搜索引擎。不同于其他輸入形式的搜索方法,由于方法簽名是開發(fā)者通過一些能表達方法功能的詞語根據駝峰命名法則命名的,所以基于關鍵字的搜索在匹配方法簽名時往往更能體現方法功能的匹配;但針對面向對象語言開發(fā)的開源軟件,當前基于關鍵字的搜索沒有考慮其源代碼具有多種代碼特征[2],或者只考慮了用戶查詢語句與方法簽名的單一匹配而忽視了源代碼的其他重要特征如注釋、類名等。比如源代碼注釋是對代碼功能的描述,其中含有能體現方法功能的大量信息,這些信息對搜索特定功能的源代碼是有幫助的。同理,類名中也含有少量體現代碼功能的信息,而且源代碼中各特征之間會有一定的聯系。匹配時不能僅僅匹配單一方法名或者將多個代碼特征轉化成純文本進行搜索而不考慮各代碼特征的重要度,因此,將方法簽名、源代碼注釋、方法體等代碼特征結合起來應用于代碼搜索中。
源代碼的注釋有描述代碼功能的作用,根據描述的對象不同分為類注釋與方法注釋。在代碼搜索中,對于代碼功能模塊來說,當搜索定位到方法為功能模塊的最小單位時,則與方法相關的代碼特征的重要程度會比較大。不同類型的注釋對代碼搜索的準確度都有貢獻,且貢獻度不一樣。方法注釋的貢獻度要大于類注釋。文獻[5]雖然也是基于關鍵字搜索并考慮了多個代碼特征,但是沒有對注釋進行分類,且未區(qū)分不同類型注釋的重要性程度。另外對于方法簽名來說,開發(fā)者在命名需要實現的功能模塊時,通常使用具有代表性的可以概括這些模塊功能的有意義的名稱,但考慮名稱的簡潔性,方法簽名往往只是由若干個單詞組合而成,所以一個完整的方法簽名往往不能完全描述出方法實現的功能??紤]到代碼注釋通常有描述方法功能的作用,注釋中往往含有方法簽名中未包含的關鍵詞。針對結合注釋的搜索在一定程度上滿足了基于語義的匹配。
搜索代碼時,將注釋與方法簽名和方法體等代碼特征分別與查詢語句進行匹配。根據不同代碼特征的重要程度對匹配結果進行加權組合,制定評分機制,得到代碼方法與查詢語句的相似度評分。根據結果評分對代碼方法進行排序,得到結果列表。
傳統源代碼搜索主要是識別用戶查詢語句與方法簽名之間的相關度而將相關度最大的方法返還給用戶,這在一定程度上忽視了源代碼的其他代碼特征。文獻[4]通過識別查詢語句與應用程序編程接口(Application Programming Interface,API)的關系來提高搜索準確度。文獻[5]通過分析查詢詞在方法簽名中扮演的角色來確定相關的源代碼,并整合四個部分內容:查詢詞在剩余代碼中的使用率、查詢詞在方法簽名中的語義角色、查詢詞在方法簽名中的頭部距離以及分析源代碼的哪個位置比較有利于相關性最大化。文獻[6]通過對Google經典算法PageRank的修改并應用在代碼函數之間的調用上,從而找出“流行度”最大的函數,然后結合對源代碼內容的匹配,返給用戶最相關的源代碼。文獻[7]通過代碼克隆技術,識別克隆代碼并根據函數調用關系找出被調用最多的克隆代碼。但這些研究都忽視了源代碼中一個比較重要的代碼特征:代碼注釋。
源代碼搜索是將從開源平臺上獲取的源代碼資源收集起來構成本地代碼倉庫;對倉庫中的源代碼進行預處理,建立源代碼對應的抽象語法樹(Abstract Syntax Tree, AST)[8]并從中識別出對搜索有用的代碼特征并建立索引;用處理過的用戶查詢語句在索引文件中搜索出相關的代碼文件并計算相似度;根據相似度評分對結果進行排序。具體流程如圖1所示。
圖1 代碼搜索引擎流程 Fig. 1 Flow chart of code search engine
2.1.1 源代碼獲取
現在一些開源搜索引擎如GitHub、CodePlex等積累了大量的開源項目,這為源代碼搜索的研究提供了“原材料”。本文從GitHub中獲取源代碼。
2.1.2 代碼特征識別
本文從三個代碼特征:注釋、方法簽名、方法體入手,對獲取的源代碼進行處理。通過建立并遍歷源代碼文件的AST,提取出源代碼中的這三種代碼特征。其中,方法模塊的功能往往需要包名、類名和方法名的結合才能完整地描述出來。比如用戶希望搜索到連接MySQL數據庫的方法實現,識別出來的描述性的名稱有包名:org.com.Mysql、類名:Connection、方法簽名:getConnection(),此時識別完整路徑上的名稱才能滿足精確的查找。重構后的方法簽名為:org.com.Mysql.Connection.getConnection()。本文針對傳統的方法簽名進行重構,在原有的方法簽名前加上方法所屬類的類名及包名。
2.1.3 代碼特征索引的建立
對所有代碼特征進行文本標準化,然后對代碼特征建立索引。在面向對象的語言中,所有方法都隸屬于一個具體的類,則針對每個方法可能存在對應的方法注釋和屬于該類的類注釋。每一個代碼方法為一個搜索單位,建立索引時其對應一個Document,而Document是Lucene框架中存放在索引中的對象,每個Document根據不同代碼特征分成多個域(Field)。因為針對注釋這一代碼特征來說分為類注釋與方法注釋,所以在注釋層次將分為兩個域,最終針對索引中的Document會有4個域。這4個域隸屬于一個Document,也就是針對每個方法將4種代碼特征規(guī)約在一起。在建立索引的同時可以指定每個域所占有的權重。
2.2.1 查詢語句預處理
本文假定用戶輸入的查詢語句為自然語言,這樣可以使具有不同開發(fā)經驗的開發(fā)者都可以使用代碼搜索引擎。軟件開發(fā)初學者不必糾結于以何種格式的輸入才能準確地找到結果,但是必須要對查詢語句作一定的處理,使之可以用來匹配我們識別出來的代碼特征。
2.2.2 搜索索引
在不同的域中,對建立的倒排索引進行搜索,找出與查詢語句相關的Document。Document中的任何域對應的代碼特征與查詢語句相關,則定義Document與之相關。將各種相關的代碼特征按照不同權重組合,給出多特征下的代碼特征總的相關度,這里的相關度是處理過的查詢語句與每個Document中4個域表示的代碼特征轉化為等維向量后的余弦相似度分數。查詢語句與每種代碼特征的相關度分數在沒有權重影響下取值區(qū)間為[0,1],0表示查詢語句與該代碼特征不相關。其中任何一種代碼特征與查詢語句的相關度分數不為零,則表明包含該代碼特征的Document是與查詢語句相關的,而Document對應的代碼方法能被檢索到并返回。
2.2.3 排序
根據返回結果相似度分數的高低,對返回結果進行排序并將排好序的結果列表返回給用戶。
源代碼的不同類型注釋在相關度匹配中的重要程度不同。在以源代碼中的方法為搜索單位時,類注釋的重要程度要小于方法注釋。根據重要程度對各類型注釋賦予不同的權重。圖2 是識別并處理不同類型注釋的流程。
將源代碼轉換為對應的抽象語法樹。抽象語法樹作為源代碼的語法結構表示,在源代碼分析和代碼復用中起著重要作用。在抽象語法樹中每個節(jié)點都有相應的節(jié)點類型,根據不同節(jié)點類型來訪問節(jié)點的值。圖3所示為一般抽象語法樹的部分節(jié)點類型樹。在EclipseJDT[9]中,抽象語法樹的根節(jié)點表示為CompilationUnit;在PackageDeclaration中獲取包名;在TypeDeclaration中包含類注釋和類名。BodyDeclaration節(jié)點下還有MethodDeclaration類型的節(jié)點,可以從中獲取方法注釋、方法名和方法體。
圖2 不同類型注釋處理流程 Fig. 2 Flow chart of processing different types of comments
圖3 抽象語法樹節(jié)點類型樹 Fig. 3 Node type tree of AST
本文使用EclipseJDT中的ASTParser與ASTNode對源代碼抽象語法樹進行創(chuàng)建與訪問。根據Java設計模式中的訪問者模式編寫訪問類,提取出不同類型的注釋與相應的方法簽名、類名、包名以及方法體等代碼特征。
對查詢語句及不同類型的注釋進行處理,包括文本標準化、去除停詞、詞干提取等操作。對其他種類的代碼特征作同樣的預處理。
3.2.1 文本標準化
文本標準化主要包括去除代碼注釋與查詢語句中的標點符號以及對其分詞。由于源代碼中的方法名基本上是由很多單詞組合在一起,通常是從第二個單詞開始首字母大寫,而注釋有對方法功能的語義描述功能,其中可能也存在組合的單詞。因此,本文采用大小寫分詞算法[4]。Lucene檢索包中已經封裝好了基本的分詞模塊。針對普通的英文語句,Lucene能進行分詞并去除其中的停詞[10]以及詞干的提取,但是針對源代碼,開發(fā)者往往在命名方法簽名時,通常使用駝峰命名法則,所以Lucene自帶的分詞模塊不能滿足針對源代碼的分詞。本文在Lucene分詞模塊的基礎上設計了針對駝峰命名的詞語的分詞模塊。
3.2.2 去除停詞
為了比較完整地描述方法的功能,開發(fā)者往往會使用一些詞語修飾關鍵詞,這就會導致注釋中包含了一些對搜索沒有幫助的詞語,在搜索引擎領域中這樣的詞語稱為停詞。本階段去除這些停詞,比如冠詞a、the,系動詞 is、are和副詞how等。
3.2.3 詞干提取
由于自然語言中的英文單詞在句子中會根據不同語態(tài)使用相應形式的單詞,針對不同形式存在的單詞,必須保證能夠匹配到。比如用戶輸入關鍵詞find時,像finding、finds等詞語都要被識別出,反之亦然。處理過程即把所有關鍵詞的詞干提取出來作為關鍵詞進行匹配,本文使用PorterStem算法[11]進行詞干提取。
在相似度評分的過程中,需要對注釋建立索引。本文用傳統搜索引擎中的倒排索引算法。
3.3.1 倒排索引
通常在某篇文章中找某個關鍵詞的時候,需要建立文章號與關鍵詞的對應關系,然后通過文章號找到文章中的關鍵詞。所謂倒排索引,就是將這種關系逆轉過來,通過關鍵詞來找到包含該關鍵詞的文章號。如表1和表2表示的關系。
表1 文章中包含的關鍵詞Tab. 1 Keywords in the articles
表2 關鍵詞對應的文章號Tab. 2 Article numbers correspond to keywords
對于索引中的關鍵詞按照字典順序排序,通過二元搜索算法找到查詢語句中的關鍵詞在注釋中的文章號,之后將注釋和查詢語句通過向量空間模型轉化為一定維度的向量,進而求兩者之間的相關度評分。
3.3.2 向量空間模型
本文使用向量空間模型[12]來實現查詢語句與注釋的匹配。將提取出來的注釋轉化為以關鍵詞權重為元素的n維向量,其中n為關鍵詞的個數。每個元素的權重使用全文檢索技術中比較流行的TF-IDF(Term Frequency-Inverse Document Frequency)方法。
定義1 詞頻(Term Frequency, TF),即關鍵詞在注釋中出現的頻率,計算公式如下:
(1)
定義2 逆文檔頻率(Inverse Document Frequency, IDF)表示關鍵詞的普遍重要性,計算公式如下:
(2)
其中:D表示注釋總數,|{d|ti∈d}|表示包含關鍵詞ti的注釋數目。關鍵詞i的權重記為Wi,計算公式如下:
Wi=TFi, j×IDFi
(3)
3.3.3 注釋余弦相似度計算
將不同類型的注釋轉化為以關鍵詞權重為元素的向量后,將用經過處理后的用戶查詢語句轉化為與注釋相同維度的向量。通常查詢語句中的關鍵詞的數量比較少,對于在注釋中出現而在查詢語句中沒有出現的關鍵詞,將查詢語句向量相對應的權重設為零以保證未在查詢語句中出現的關鍵詞在計算相似度時貢獻度為零。注釋向量設為V(a)={W1,a,W2,a,…,Wn,a},查詢語句向量為V(q)={W1,q,W2,q,…,Wn,q},計算兩個向量的余弦相似度依據如下公式:
(4)
其中:分子是查詢語句向量與注釋向量的點積,分母是2個向量的歐幾里得距離的乘積。
在建立索引的過程中,以每個Java文件中方法為單位建立一個索引Document,在Document中添加4個Field:類注釋(Class Comment, CC)、方法注釋(Function Comment, FC)、方法簽名(Function Signature, FS)、方法體(Function Body, FB)。將處理后的查詢語句在每個域中進行匹配,得到查詢語句與各代碼特征的相關度評分。任何一個域所代表的代碼特征與查詢語句的相關度評分不為0,則表明該Document是與查詢語句相關的。其中在建立索引的過程中,為每個Field設置一定的權重,以計算每個查詢語句與搜索結果總的相關度評分。
由于第3章中在建立倒排索引的過程中,詞典中的關鍵詞都是按照字典順序排序的,所以本文使用高效的二元搜索算法來實現對索引的搜索,只要關鍵詞同時出現在查詢語句與代碼特征中,則該代碼特征所對應的Document便能被檢索到,從而得到有相關性的源代碼文件Document,然后根據不同的權重分別計算查詢語句與源代碼文件中各代碼特征的相關度評分。
對不同類型的注釋在建立索引時賦予不同的權重,然后計算注釋與查詢語句的相似度并結合不同權重的影響直接對搜索結果進行優(yōu)化。針對注釋階段的匹配,給出計算注釋方面的匹配分數Sc(Scoring Comments),計算公式如下:
Sc(c,q)=αSim(q,CC)+(1-α)Sim(q,FC)
(5)
其中:Sim(q,CC)表示查詢語句與類注釋的余弦相似度。Sim(q,FC)表示查詢語句與方法注釋的余弦相似度。α表示類注釋在注釋方面中占有的權重,(1-α)表示方法注釋占有的權重。由于方法注釋在注釋方面的重要性大于類注釋,所以1-α大于0.5,在此固定α的值為0.2。
針對方法對象Sf(Scoring Function)的匹配包括查詢語句與方法簽名匹配以及查詢語句與方法體的匹配,其相關度得分依據如下公式計算:
Sf(F,q)=Sim(q,FS)+βSim(q,FB)
(6)
其中:Sim(q,FS)表示查詢語句與方法簽名的余弦相似度,Sim(q,FB) 表示查詢語句與方法體的余弦相似度。β表示相對于方法簽名,方法體在計算相關度的重要性。根據已有的研究[6],β的值一般取0.1。
針對用戶搜索的結果(即代碼方法),本文對方法對象與注釋對象的相關評分進行權重分配并計算最終的相關度分數,其計算公式如下:
S(F,q)=Sf(F,q)+λSc(c,q)
(7)
其中:Sf(F,q)是由式(6)計算出的查詢語句與方法對象的相關度評分,Sc(c,q)是由式(5)計算出的查詢語句與不同類型注釋的綜合相關度評分,λ表示在方法對象和注釋對象在計算相關度評分過程中的貢獻度。由于注釋是對方法對象的補充說明與描述,在計算相關度評分的過程中的貢獻度遠遠大于方法對象中的方法體,故本文在此定義λ的取值區(qū)間為[0.2,0.8]。
根據式(7)查詢語句與代碼特征的相關度評分對代碼特征代表的結果排序,返還給用戶。本文選取所有相關結果中的前30個結果,因為用戶往往只關心排在前面的結果,排序相對靠后的結果對用戶的幫助不大。
由于在軟件的開發(fā)過程中,針對一個規(guī)模比較大的軟件來說,難免會出現功能相似的模塊。這種情況下,用戶往往傾向于復用已實現相應功能的代碼以實現另一種功能。這種情況會導致在這個軟件中有大量的代碼是重復的,如果用戶在搜索代碼時返回大量功能相似的代碼,則會增加用戶查找結果的工作量。本文通過采用SimHash算法[13]對相似代碼進行去重。
5.1.1 源代碼選取
從當前最為流行的開源網站平臺Github上下載51個Java開源項目,總大小為1.04 GB,這些項目中共有42 709個類,357 912個方法。選取的標準是比較開源項目在Github上的Star與Fork值,值大的優(yōu)先考慮。往往這些開源項目較為穩(wěn)定,在大量開發(fā)人員的共同開發(fā)下,這些項目的源代碼在代碼質量上優(yōu)于一些剛成型的開源軟件,并且這些開源代碼中會存在大量的描述代碼功能的各類注釋。
5.1.2 開發(fā)工具包
本文通過遍歷源代碼的抽象語法樹來識別各類代碼特征,其中在遍歷抽象語法樹的過程中使用了EclipseJDT中的ASTParser和ASTNode工具包;在為代碼特征建立索引并分配權重和搜索的過程中通過修改Lucene6.2.1全文檢索開發(fā)工具包源碼達到自己的搜索目的。
5.1.3 查詢語句的搜集
根據以往研究[14]和一些軟件開發(fā)者的查詢日志,本文搜集到15條查詢語句,如表3所示。
表3 查詢語句列表Tab. 3 List of query statements
在信息檢索與統計學分類領域中最常用的度量標準為準確率與召回率。準確率(precision)表示檢索出的相關結果占所有檢索出的結果的比例。召回率(Recall)表示檢索出的相關結果占所有相關結果的比例。由于本文的相關性取決于主觀判斷,所以無法在大量的源代碼中確定具體數目的相關代碼,而且當前也沒有評測查詢語句與代碼是否相關的自動化判定方法,所以也無法計算出基于準確率與召回率的F-measure的評價指標,故本文放棄使用基于準確率-召回率的評價標準。
由于源代碼的數量巨大,經過查詢后返回的結果數量也是非常多的,但是用戶往往只關注排在最前面的結果,所以本文選擇基于排序的評價指標Precision@K。Precision@K表示設定一個閾值K,在檢索結果到第K個結果是正確召回為止,排序結果的相關度。Precision@K(簡寫為P@K)的計算公式如下:
P@K=n/MK
(8)
其中:n表示在第K個結果是正確召回的前提下相關結果的數目,MK表示到第K個結果正確召回時總的返回結果個數。
因為P@K只能表示單點的策略效果,故引入Average_Precision@K評價標準,Average_Precision@K表示設定一個閾值K,在檢索結果到第K個正確召回為止,排序結果的相關度。Average_Precision@K(簡寫為AP@K)的計算公式如下:
(9)
其中j表示不大于K的閾值。
因為涉及到一個策略在滿足所有查詢語句查詢的結果,所以需引入Mean_Average_Precision@K(簡寫為MAP@K),MAP表示的是搜索查詢結果Average_Precision@K值的均值,其計算公式如下:
(10)
其中:Q表示查詢語句集合,i表示第i個查詢語句,本實驗總共搜集到15個查詢語句。Mij表示在第i個查詢語句查詢時第j個結果正確召回時的返回結果總數。
在返回的結果序列中,第一個相關結果在序列中的位置可以反映出搜索算法的好壞。MRR(Mean Reciprocal Rank)是國際上對搜索算法進行評價的通用機制,即第一個相關結果在結果序列中位置的度量指標,其計算公式如下:
(11)
其中:Q表示查詢語句集合,i表示第i個查詢語句,ranki表示第i個查詢語句搜索返回的第一個相關結果在結果序列中的位置。選擇這個度量指標的原因是開發(fā)者往往找到第一個相關結果時便能滿足搜索要求。第一個結果越靠前表明搜索算法越好。
5.3 實驗結果
在基于關鍵詞的搜索當中,Krugle可以命中包含查詢關鍵字的源代碼文件,同本文的搜索方式大致相同,所以為了驗證本文提出的加入注釋與重構方法簽名的方法,在基于權重分配的條件下是否有效,選擇與Krugle進行對比實驗。在對返回的實驗結果是否相關的問題上,由于相關性的判斷是由人為判斷的,所以為了盡可能地減少由于人為主觀性帶來的誤差,本文選擇編程經驗近似的3名開發(fā)人員對實驗結果相關性進行判斷,并且將3名開發(fā)人員各自分開進行獨立的判斷,在3名開發(fā)人員同時將結果定為相關的時候,才將結果記錄為相關。
上述實驗結果是在默認權重下的實驗結果,其中注釋權重默認設為0.4。針對查詢語句集中的append string to file的實驗結果如表4所示??梢钥闯?,準確率提升最少有8%,平均提升12%左右。一個查詢語句對比結果的參考價值往往不高。
表4 單一查詢語句AP@K實驗結果 %Tab. 4 AP@K experiment results of single query statement %
下面對所有查詢語句進行實驗對比后得到MAP@K參數如表5所示。
表5 復合查詢語句MAP@K實驗結果 %Tab. 5 MAP@K experiment results of multiple query statements %
由表5可以看出,在15條查詢語句的實驗對比下,本文的方法在相關結果排序上總體提升將近10%,這說明本文方法在提升搜索準確率上是有效的。為了使搜索優(yōu)化度最大化,通過調整注釋的權重,找出使MAP@K參數最大的權重系數。通過調整權重,得到實驗曲線如圖6所示,其中KMAP@7為Krugle搜索的MAP@7值。
在調整權重的實驗中得出本文方法在不同權重下的MRR值與使用Krugle搜索的MRR值,由于Krugle沒有考慮權重影響,所以Krugle針對本文的查詢語句集合Q的MRR值是不變的。實驗結果數據如表6所示。
圖6 不同權重系數結果對比 Fig. 6 Comparison of the results of different weight coefficients 表6 MRR實驗結果 Tab. 6 Experiment results of MRR
權重本文方法Krugle權重本文方法Krugle0.20.750.600.60.6900.600.40.720.600.80.6730.60
通過圖6可以看出不是注釋權重越大,搜索效率提升越明顯。當權重系數為0.8時,本文方法的搜索效率與Krugle就相差不多了(圖中MAP@7與KMAP@7的趨勢)。這說明,注釋這一代碼特征確實可以幫助提升搜索效率,但是,過大的權重也會增加查詢語句中對查詢不起主要作用的關鍵詞的搜索得分,從而會在一定程度上限制搜索準確度的提升。所以本文在默認權重為0.4情況下得到效率提升將近10%,在0.2權重下提升大于10%。而表6的實驗數據表明本文搜索方法在MRR的度量上是優(yōu)于Krugle的,即在使用本文方法搜索的返回結果序列中,針對15條查詢語句的第一個相關結果的綜合位置比Krugle得到的結果靠前,說明在搜索中加入注釋這一代碼特征并考慮權重可以提升代碼搜索準確度。在MAP@K與MRR度量標準下的實驗對比結果說明本文方法是有效的。
在基于關鍵字的源代碼搜索研究中,本文在對單一代碼特征識別與匹配的基礎上,考慮其他代碼特征對搜索結果的影響,增加了對注釋的匹配和方法簽名的重構,并且考慮了多個代碼特征的權重問題。通過與已有代碼搜索引擎的實驗結果進行對比,多個代碼特征在不同權重影響下提升了代碼搜索準確度。
本文在方法簽名的重構中沒有考慮類名、包名的權重問題,在匹配重構后的方法簽名時類名、包名與方法名在搜索過程中的貢獻度是相同的,但是開發(fā)人員在編碼過程中,往往在命名方法名與類名時會加以區(qū)分,這就會導致重構后的方法簽名中方法名與類名、包名對搜索的貢獻度是不一樣的,所以在匹配方法簽名時會影響搜索結果的準確度。后續(xù)可以對評分機制作出改進,如考慮對類名和包名賦予不同的權重,以期進一步提高代碼搜索的準確度。
參考文獻(References)
[1] Github. Github [DB/OL]. [2017- 01- 02]. https://github.com.
[2] Open Source China. OSChina [DB/OL]. [2017- 01- 02]. https://www.oschina.net.
[3] Microsoft. CodePlex [DB/OL]. [2017- 01- 02]. https://www.codeplex.com.
[4] 呂飛.基于搜索的代碼推薦技術研究[D].上海:上海交通大學,2015.(LYU F. Research on search based code recommendation techniques [D]. Shanghai: Shanghai Jiao Tong University, 2015.)
[5] HILL E, POLLOCK L, VIJAY-SHANKER K. Improving source code search with natural language phrasal representations of method signatures [C] // Proceedings of the 2011 26th IEEE/ACM International Conference on Automated Software Engineering. Piscataway, NJ: IEEE, 2011: 524-527.
[7] ISHIHARA T, HOTTA K, HIGO Y, et al. Reusing reused code [C]// Proceedings of the 2013 20th Working Conference on Reverse Engineering. Washington, DC: IEEE Computer Society, 2013: 457-461.
[8] 林澤琦,趙俊峰,謝冰.一種基于圖數據庫的代碼結構解析與搜索方法[J].計算機研究與發(fā)展,2016,53(3):531-540.(LIN Z Q, ZHAO J F, XIE B. A graph database based method for parsing and searching code structure [J]. Journal of Computer Research and Development, 2016, 53(3): 531-540.)
[9] 劉石,李合,王嘯吟,等.基于語法與語義分析的代碼搜索結果優(yōu)化[J].計算機科學,2009,36(8):165-168.(LIU S, LI H, WANG X Y, et al. Enhancement of code search results using syntax and semantic analysis [J]. Computer Science, 2009, 36(8): 165-168.)
[10] HAIDUC S, ROSA G D, BAVOTA G, et al. Query quality prediction and reformulation for source code search: the Refoqus tool [C]// Proceedings of the 2013 35th International Conference on Software Engineering. Washington, DC: IEEE Computer Society, 2013: 1307-1310.
[11] PORTER M F. An algorithm for suffix stripping [J]. Program, 1980, 14(3): 130-137.
[12] ASWANI KUMAR C, RADVANSKY M, ANNAPURNA J. Analysis of a vector space model, latent semantic indexing and formal concept analysis for information retrieval [J]. Cybernetics and Information Technologies, 2016, 12(1): 34-48.
[13] 陳春玲,陳琳,熊晶,等.基于Simhash算法的重復數據刪除技術的研究與改進[J].南京郵電大學學報(自然科學版),2016,36(3):85-91.(CHEN C L, CHEN L, XIONG J, et al. Research and improvement of data de-duplication based on Simhash algorithm [J]. Journal of Nanjing University of Posts and Telecommunications (Natural Science Edition), 2016, 36(3): 85-91.)
[14] BAJRACHARYA S K, OSSHER J, LOPES C V. Leveraging usage similarity for effective retrieval of examples in code repositories [C]// FSE ’10: Proceedings of the 18th ACM SIGSOFT International Symposium on Foundations of Software Engineering. New York: ACM, 2010: 157-166.
LIZhen, born in 1992, M. S. candidate. His research interests include open source search.
NIUJun, born in 1976, Ph. D., associate professor. His research interests include service computing, open source search.
WANGKui, born in 1988, M. S. candidate. His research interests include open source search.
XINYuanyuan, born in 1993, M. S. candidate. Her research interests include open source search.