專利名稱:一種基于語義的代碼搜索方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種代碼搜索方法,尤其涉及一種基于語義的代碼搜索方法。
背景技術(shù):
目前的代碼搜索引擎例如Google code search、Koders主要是對(duì)網(wǎng)絡(luò)中的一些 開源項(xiàng)目的文件進(jìn)行檢索,忽略了大型blog或論壇中的代碼片段,導(dǎo)致搜索的范圍比較狹 隘。它們主要采用全文索引技術(shù)對(duì)公開發(fā)布的代碼文件進(jìn)行索引,從而對(duì)所搜索的代碼進(jìn) 行快速定位,但是他們沒有對(duì)代碼的結(jié)構(gòu)化信息進(jìn)行識(shí)別,不能精確的定位類名、方法名、 變量等描述信息,使得搜索結(jié)果不夠準(zhǔn)確。當(dāng)前一些主流的搜索引擎存在以下缺陷1、代碼搜索范圍小,僅對(duì)網(wǎng)絡(luò)中一些開 源項(xiàng)目的文件進(jìn)行檢索;2、搜索結(jié)果不準(zhǔn)確,因?yàn)闄z索的方式是全文檢索,無法利用代碼的 結(jié)構(gòu)化信息(如類名、方法名、變量名)進(jìn)行檢索。因此現(xiàn)有搜索技術(shù)存在著僅依賴關(guān)鍵字、 搜索范圍局限等不足。
發(fā)明內(nèi)容
為了解決上述問題中的不足之處,本發(fā)明提供了一種基于語義的代碼搜索方法。為解決以上技術(shù)問題,本發(fā)明采用的技術(shù)方案是一種基于語義的代碼搜索方法, 方法的實(shí)現(xiàn)所采用的系統(tǒng)分為數(shù)據(jù)收集模塊、數(shù)據(jù)分析模塊、數(shù)據(jù)排序模塊、用戶交互模 塊;數(shù)據(jù)收集模塊中的爬蟲工具JoBo可以在配置文件中預(yù)先設(shè)定一些網(wǎng)站地址,爬 蟲工具JoBo再?gòu)念A(yù)先設(shè)定的論壇和博客上抓取代碼源,達(dá)到最快最有效的抓取網(wǎng)頁;爬蟲工具JoBo抓取到的代碼源,采用開源工具JDT中的抽象語法樹AST框架來進(jìn) 行語義分析;數(shù)據(jù)排序模塊可以根據(jù)用戶輸入的關(guān)鍵字匹配、分析得到相應(yīng)的搜索結(jié)果后,綜 合考慮五方面的因素關(guān)鍵字在代碼中出現(xiàn)的次數(shù)、注釋部分在代碼中所占的比例、代碼長(zhǎng) 度是否在上下界之內(nèi)、是否提供了代碼出處的鏈接、與用戶喜好的匹配程度;每一因素的取 值乘上相應(yīng)的權(quán)重后求和得出代碼的綜合評(píng)分,通過數(shù)據(jù)排序?qū)⑺阉鹘Y(jié)果按照分值從高到 底依次排列展現(xiàn)給用戶。本發(fā)明一方面調(diào)用主流的代碼搜索引擎獲得排名靠前的搜索結(jié)果,另一方面利用 網(wǎng)絡(luò)爬蟲從大型的blog或論壇中抓取代碼片段,增加了代碼的搜索量,使得搜索結(jié)果更加 豐富;而對(duì)于網(wǎng)絡(luò)爬蟲爬出來的文件應(yīng)用Java開發(fā)工具(JDT)中的抽象語法樹(AST)進(jìn)行 解析,給代碼標(biāo)注上了類名、方法名、變量等語義信息,使得用戶可以針對(duì)這些描述信息進(jìn) 行搜索,提高了搜索結(jié)果的查準(zhǔn)率;對(duì)于最后展現(xiàn)出來的搜索結(jié)果用戶可以進(jìn)行投票、添加 標(biāo)簽等操作,這將有利于搜索結(jié)果排序的優(yōu)化。本發(fā)明利用了現(xiàn)有最好的Google code、KoderS等搜索引擎,并在此基礎(chǔ)上做了相 應(yīng)的擴(kuò)展,如語義信息識(shí)別、排序等;通過配置爬蟲定義搜索范圍,由此提高搜索的效率和查準(zhǔn)的精度;考慮用戶喜好,依照代碼質(zhì)量若干因素的綜合評(píng)分對(duì)搜索結(jié)果進(jìn)行排序。
下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明。圖1為本發(fā)明的系統(tǒng)結(jié)構(gòu)示意圖。圖 2 為 SearchCal 1 類圖。圖 3 為 DataAnalysis 類圖。圖 4 為 ResultItem 類圖。圖5為JoBo網(wǎng)頁爬蟲搜索流程圖。ICS :ICodekarch,代碼搜索引擎軟件。JoBo 爬蟲程序的一種。JDT Java:開發(fā)工具(Java development tools),用于解析 java 文件的結(jié)構(gòu)。Ontology 本體,是共享概念模型的形式化規(guī)范說明
具體實(shí)施例方式本發(fā)明所采用的系統(tǒng)分為四大模塊數(shù)據(jù)收集模塊(Data Collection)、數(shù)據(jù)分析 模塊(Data Analysis)、數(shù)據(jù)排序模塊(Data Sort)、用戶交互模塊(User Interact ion)。下面分別闡述每一模塊的實(shí)現(xiàn)方案1、數(shù)據(jù)收集模塊ICS數(shù)據(jù)源的獲取有兩個(gè)途徑一是調(diào)用目前市場(chǎng)主流的代碼搜索引擎Google Code karch和Koders,根據(jù)用戶輸入的關(guān)鍵字獲取前10頁的搜索結(jié)果(為了提高搜索 效率,在對(duì)查準(zhǔn)率影響不大的前提下系統(tǒng)截取前十頁作為搜索結(jié)果);二是利用爬蟲工具 JoBo,在配置文件中預(yù)先設(shè)定一些網(wǎng)站地址,例如CSDN、CVS知識(shí)庫(kù)、Subversion知識(shí)庫(kù)等, 在系統(tǒng)空閑的時(shí)刻爬蟲會(huì)自動(dòng)搜尋該網(wǎng)站下的代碼源上傳至服務(wù)器。搜索調(diào)用(karchCall)部分就是實(shí)現(xiàn)了調(diào)用主流的搜索引擎獲得相應(yīng)的搜索 結(jié)果。調(diào)用原理是采用 java. net. HttpURLConnection 對(duì)象,根據(jù) GoogleCode Search 和 Koders的搜索鏈接,獲取相應(yīng)的響應(yīng)內(nèi)容(xml格式的數(shù)據(jù))。圖2是該功能實(shí)現(xiàn)的類圖 其中兩個(gè)方法getResult0fGoogle和getResutlOfKoders分別用于獲取兩個(gè)代碼搜索引 擎的搜索結(jié)果。爬蟲(Crawler)部分是利用爬蟲工具JoBo從預(yù)先設(shè)定的論壇和博客上抓取代碼 源,Jobo是一個(gè)基于Java的開源的爬蟲工具,它采用IP搜索策略和深度優(yōu)先搜索策略進(jìn) 行搜索,以達(dá)到最快最有效的抓取網(wǎng)頁的效果。2、數(shù)據(jù)分析模塊在數(shù)據(jù)收集模塊獲取到數(shù)據(jù)源之后,需要對(duì)形式各樣、結(jié)構(gòu)不一的數(shù)據(jù)進(jìn)行再次 處理,統(tǒng)一成同一結(jié)構(gòu)的數(shù)據(jù),方便后期的用戶查詢,這一功能是通過數(shù)據(jù)分析模塊實(shí)現(xiàn) 的。因?yàn)閿?shù)據(jù)源來自兩個(gè)途徑,所以分析過程也分為兩個(gè)部分,一是對(duì)外部搜索引擎搜索結(jié) 果的分析;二是對(duì)爬蟲抓取的代碼源的分析。調(diào)用外部引擎返回的結(jié)果為xml文本文件,我們采用開源工具h(yuǎn)tmlparser在 xml文件中提取系統(tǒng)需要的信息。類org. htmlparser. NodeFilter利用xml中的tag標(biāo)簽,進(jìn)行文本內(nèi)容劃分,類org. htmlparser. NodeList儲(chǔ)存劃分后提取到的信息,劃分的過 程可以進(jìn)行多次,直至找到滿足需要的信息。圖3為該功能實(shí)現(xiàn)的類圖其中兩個(gè)方法 getResultltemOfGoogle 禾口 getResutlItemOfKoders 分別用于對(duì) Google、Koders 兩個(gè)代碼 搜索引擎的搜索結(jié)果進(jìn)行分析,返回我們自定義的ResultItem結(jié)構(gòu)的數(shù)據(jù)列表。ResultItem的類圖如圖4所示,包含文件名稱(fileName)、文件鏈接 (fileLink)、預(yù)覽區(qū)域的文本內(nèi)容(codePreview)、預(yù)覽文本的鏈接(codePreviewLink)、 代碼源的文本內(nèi)容(codeSource)、代碼源的鏈接(codeSourceLink)、代碼源的主域名 (codeSourcePage)、代碼協(xié)議(codeLicense)、代碼協(xié)議的鏈接(codeLicenseLink)、代碼 ip- Γ (codeLanguage),胃;窗、。而對(duì)于爬蟲工具JoBo抓取到的代碼源,我們采用開源工具JDTCJavaDevelopment Tools)中的抽象語法樹AST (Abstract Syntax Tree)框架來進(jìn)行語義分析。AST理解語言 元素之間的關(guān)系。它可以識(shí)別象局部變量、實(shí)例變量、表達(dá)式以及if語句等六十多種不同 的語言元素。我們通過AST可以獲取到每一個(gè)Java文件中的import列表、方法列表、變量 列表、包名、類名、注釋信息等等。這些信息都以entity對(duì)象的形式存入到數(shù)據(jù)庫(kù)中。3、數(shù)據(jù)排序模塊根據(jù)用戶輸入的關(guān)鍵字匹配、分析得到相應(yīng)的搜索結(jié)果后,需要以怎么的順序排 列呈現(xiàn)給用戶?這部分功能通過數(shù)據(jù)排序(DataSort)實(shí)現(xiàn),數(shù)據(jù)排序綜合考慮五方面的 因素關(guān)鍵字在代碼中出現(xiàn)的次數(shù)、注釋部分在代碼中所占的比例、代碼長(zhǎng)度是否在上、下 界之內(nèi)、是否提供了代碼出處的鏈接、與用戶喜好的匹配程度。每一因素的取值乘上相應(yīng) 的權(quán)重后求和就是代碼的綜合評(píng)分,我們將搜索結(jié)果按照分值從高到底依次排列展現(xiàn)給用 戶。4、用戶交互模塊用戶交互模塊我們提供了注冊(cè)、登陸、上傳代碼范例、投票、打標(biāo)簽等功能。一、Eclipse JDT (Java Development Tools)相關(guān)技術(shù)介紹Eclipse平臺(tái)本身是構(gòu)建工具和應(yīng)用程序的基礎(chǔ)。插入到平臺(tái)中的插件提供了特 殊的能力,使它適合于開發(fā)特定類型的應(yīng)用程序。這一部分是一個(gè)真實(shí)工具的案例,Java 開發(fā)工具(JDT),它向平臺(tái)添加了 Java程序開發(fā)的能力。JDT包含在Eclipse SDK中。JDT 向Eclipse平臺(tái)添加了 Java IDE的能力。JDT作為Eclipse的Java開發(fā)工具,提供了解析Java源文件,編譯為中間代碼 的AST(Abstract Syntax Tree)的結(jié)構(gòu),可以在更高層次上修改代碼,比如Eclipse中 的Refactor就可以高度智能話的修改代碼。JDT實(shí)際上是將Java代碼構(gòu)建成一個(gè)基于 DOM結(jié)構(gòu)的抽象語法樹AST (Abstract Syntax Tree)。代碼中的每個(gè)部分都對(duì)應(yīng)一個(gè)節(jié)點(diǎn) ASTNode,許多的ASTNode就構(gòu)成了這個(gè)抽象的語法樹。Java Class 一般對(duì)應(yīng)Compilation Unit node,該節(jié)點(diǎn)也是AST樹上的頂點(diǎn)。我們也可以使用AST動(dòng)態(tài)生成代碼或修改代碼。主要過程入下(a)得到j(luò)ava源文件或是他對(duì)應(yīng)的compiIationUint (CU),然后由AST. setSource ()設(shè)定,再由AST. create ()創(chuàng)建一個(gè)AST樹,返回根節(jié)點(diǎn),ASTNode.(b)使用ASTRewrite修改源文件,將結(jié)果保存在TextEditor對(duì)象中(c)使用apply ()方法實(shí)現(xiàn)這些修改。
二、JoBo爬蟲技術(shù)簡(jiǎn)介本發(fā)明所采用的技術(shù)手段是利用JoBo爬蟲。JoBo爬蟲是一個(gè)用于下載整個(gè)Web 站點(diǎn)的簡(jiǎn)單工具。它本質(zhì)是一個(gè)Web Spider0與其它下載工具相比較它的主要優(yōu)勢(shì)是能夠 自動(dòng)填充form(如自動(dòng)登錄)和使用cookies來處理session。JoBo還有靈活的下載規(guī) 則(如通過網(wǎng)頁的URL,大小,MIME類型等)來限制下載。由于JoBo爬蟲程序簡(jiǎn)單、輕量 級(jí)且易于集成等特征,我們的搜索引擎采用它作為代碼搜索的爬蟲程序,它是以java實(shí)現(xiàn) 的。JoBo網(wǎng)頁爬蟲采用的搜索策略為IP搜索策略加上深度優(yōu)先搜索策略的結(jié)合策 略。具體流程如圖5所示。
權(quán)利要求
1. 一種基于語義的代碼搜索方法,其特征在于方法的實(shí)現(xiàn)所采用的系統(tǒng)分為數(shù)據(jù)收 集模塊、數(shù)據(jù)分析模塊、數(shù)據(jù)排序模塊、用戶交互模塊;所述數(shù)據(jù)收集模塊中的爬蟲工具JoBo可以在配置文件中預(yù)先設(shè)定一些網(wǎng)站地址,爬 蟲工具JoBo再?gòu)念A(yù)先設(shè)定的論壇和博客上抓取代碼源,達(dá)到最快最有效的抓取網(wǎng)頁;所述爬蟲工具JoBo抓取到的代碼源,采用開源工具JDT中的抽象語法樹AST框架來進(jìn) 行語義分析;所述數(shù)據(jù)排序模塊可以根據(jù)用戶輸入的關(guān)鍵字匹配、分析得到相應(yīng)的搜索結(jié)果后,綜 合考慮五方面的因素關(guān)鍵字在代碼中出現(xiàn)的次數(shù)、注釋部分在代碼中所占的比例、代碼長(zhǎng) 度是否在上下界之內(nèi)、是否提供了代碼出處的鏈接、與用戶喜好的匹配程度;每一因素的取 值乘上相應(yīng)的權(quán)重后求和得出代碼的綜合評(píng)分,通過數(shù)據(jù)排序?qū)⑺阉鹘Y(jié)果按照分值從高到 底依次排列展現(xiàn)給用戶。
全文摘要
本發(fā)明公開了一種基于語義的代碼搜索方法,其采用的系統(tǒng)分為數(shù)據(jù)收集、分析、排序、用戶交互四大模塊;數(shù)據(jù)收集模塊中的爬蟲工具JoBo可以在配置文件中預(yù)先設(shè)定一些網(wǎng)站地址,再?gòu)念A(yù)先設(shè)定的論壇和博客上抓取代碼源,達(dá)到最快最有效的抓取網(wǎng)頁;爬蟲工具JoBo抓取到的代碼源,采用開源工具JDT中的抽象語法樹AST框架來進(jìn)行語義分析;數(shù)據(jù)排序模塊根據(jù)用戶輸入的關(guān)鍵字匹配,分析得到相應(yīng)的搜索結(jié)果后,綜合考慮五方面的因素,通過數(shù)據(jù)排序?qū)⑺阉鹘Y(jié)果按照分值從高到底依次排列展現(xiàn)給用戶。本發(fā)明在利用現(xiàn)有最好搜索引擎的基礎(chǔ)上,對(duì)語義信息識(shí)別、排序做了相應(yīng)的擴(kuò)展,通過配置爬蟲定義搜索范圍,提高了搜索效率和查準(zhǔn)精度并可以考慮用戶喜好。
文檔編號(hào)G06F17/30GK102063488SQ20101061210
公開日2011年5月18日 申請(qǐng)日期2010年12月29日 優(yōu)先權(quán)日2010年12月29日
發(fā)明者劉通, 洪宏, 錢巨, 黃志球 申請(qǐng)人:南京航空航天大學(xué)