




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于Java的搜索引擎Nutch中文搜索技術(shù)研究 摘要:Nutch是一個(gè)優(yōu)秀的基于Java的開放源碼搜索引擎,為了使它能夠支持中文搜索,本文在分析了Nutch結(jié)構(gòu)的基礎(chǔ)上,采用詞表分詞技術(shù)和前向匹配分詞算法對(duì)中文信息進(jìn)行分詞,以JavaCC腳本實(shí)現(xiàn)上下文相關(guān)文法中文分析模塊,成功實(shí)現(xiàn)了Nutch中文搜索功能。關(guān)鍵詞:搜索引擎; 分詞; 正規(guī)Abstract: In order to enable Chinese search in Nutch, which is an excellent Java-
2、based open source search engine, this paper analyses the structure of Nutch and separates words in Chinese information based on Chinese dictionary and forward matching algorithm. Chinese analysis module is generated by JavaCC script; that results in supporting Chinese search in Nutch.Key words: Sear
3、ch Engine; Word Segmentation; Regular Expression1 前言搜索引擎1是當(dāng)今網(wǎng)絡(luò)應(yīng)用的核心問題,已經(jīng)受到各企業(yè)和研究部門的廣泛關(guān)注。Lucene和Nutch是針對(duì)國(guó)外英文系統(tǒng)環(huán)境的搜索引擎,本文在研究了中文分詞技術(shù)和JavaCC技術(shù)的基礎(chǔ)上,成功地實(shí)現(xiàn)了Lucene和Nucth的中文分析模塊,使Lucene和Nucth能夠?qū)崿F(xiàn)中文信息檢索。2 Nutch分析Lucene是開放源碼的基于Java的全文檢索引擎,其貢獻(xiàn)者Doug Cutting是一位資深全文索引/檢索專家。作為一個(gè)全文檢索系統(tǒng),在進(jìn)行檢索之前需要建立索引,索引的過程是先讀取文章中的詞語,
4、然后一一存放在稱為倒排索引文件的索引數(shù)據(jù)庫(Index Database)中。索引數(shù)據(jù)庫記錄了詞語出現(xiàn)的位置,頻率等相關(guān)信息,以備后面讀取。Nutch是Cutting創(chuàng)建的另一個(gè)Java開源項(xiàng)目,目的是提供全功能的搜索引擎,其底層借助了Lucene的部分功能,并且索引結(jié)構(gòu)與Lucene兼容。Lucene和Nutch并沒有規(guī)定數(shù)據(jù)源的格式,而只提供了一個(gè)通用的結(jié)構(gòu)(Document對(duì)象)來接受索引的輸入,因此輸入的數(shù)據(jù)源可以是數(shù)據(jù)庫、WORD文檔、PDF文檔和HTML文檔,只要能夠設(shè)計(jì)相應(yīng)的解析轉(zhuǎn)換器將數(shù)據(jù)源構(gòu)造成Docuement對(duì)象即可進(jìn)行索引。對(duì)于大批量的數(shù)據(jù)索引,還可以通過調(diào)整Index
5、erWrite的文件合并頻率屬性(MergeFactor)來提高批量索引的效率。用戶輸入查詢字符串(Query String),然后經(jīng)過分析器的分析,就會(huì)產(chǎn)生一個(gè)Query對(duì)象。真正搜索時(shí),使用IndexSearcher類的search方法,它返回Hits對(duì)象。通過遍歷Hits對(duì)象的所有文檔(document),就可以找到所有被搜索到的文章(頁面)。查詢字符串的語法定義為Query := ( Clause )*Clause := "+", "-" TERM ":" ( TERM | "(" Query "
6、)")中間的邏輯包括:and or + - &&|等符號(hào),而且還有"短語查詢"和針對(duì)西文的前綴/模糊查詢等??偟膩碚f,這是其他很多搜索引擎都不具備的功能。通過修改QueryParser的語法生成腳本,還可以修改或擴(kuò)展查詢分析器的功能,使它更加適用于中文環(huán)境。所有的問題都通過一個(gè)額外抽象層來方便以后的擴(kuò)展和重用,通過重新實(shí)現(xiàn)來達(dá)到自己的目的,而對(duì)其他模塊而不需要??梢院?jiǎn)單的應(yīng)用入口Searcher, Indexer,并調(diào)用底層一系列組件協(xié)同的完成搜索任務(wù)。所有的對(duì)象的任務(wù)都非常專一,比如搜索過程QueryParser分析將查詢語句轉(zhuǎn)換成一系列的精確查
7、詢的組合(Query),通過底層的索引讀取結(jié)構(gòu)IndexReader進(jìn)行索引的讀取,并用相應(yīng)的打分器給搜索結(jié)果進(jìn)行打分/排序等。所有的功能模塊原子化程度非常高,因此可以通過重新實(shí)現(xiàn)而不需要修改其他模塊。除了靈活的應(yīng)用接口設(shè)計(jì),Lucene和Nutch還提供了一些適合大多數(shù)應(yīng)用的語言分析器實(shí)現(xiàn)(SimpleAnalyser,StandardAnalyser),這也是新用戶能夠很快上手的重要原因之一。 3 Nutch中文搜索3.1 中文分詞在搜索引擎和各種語言處理的需要中,分詞可以說是最基本的操作。漢
8、語句子是由詞語組成的,人們?cè)谑褂脻h語時(shí),可以直接理解并使用它。對(duì)于計(jì)算機(jī),是不可能達(dá)到人類的智能的,也不能理解人類語言。但是,由于人類仍然希望計(jì)算機(jī)能理解人類的語言,并且迫切的希望使用在各種商業(yè)和技術(shù)領(lǐng)域中,因此提出了計(jì)算機(jī)形式文法。但是現(xiàn)有形式文法是建立在事先分詞的基礎(chǔ)上的。對(duì)于某些語言,單詞之間有特定的符號(hào)隔開(一般是空格),所以沒有任何分詞的困難。而漢語與其他語言都有很大的不同,漢字之間沒有空格。如果想繼續(xù)沿用西方的形式文法理論處理漢語,那么必然涉及到中文分詞問題。在系統(tǒng)實(shí)現(xiàn)中使用詞表分詞。詞表中文分詞的原理,是根據(jù)現(xiàn)有詞庫進(jìn)行字符串模式匹配,把長(zhǎng)的字符串分割為若干個(gè)詞庫中已經(jīng)存在的詞語
9、即可。因此,制作詞庫成為必須的,詞庫中詞語的選擇也要慎重。系統(tǒng)選擇的是一個(gè)大小為53301個(gè)中文詞語,按照拼音順序排列的文本格式的詞庫,詞語之間使用回車符隔開。這個(gè)詞庫在使用時(shí),要全部調(diào)入內(nèi)存。為此,使用哈希表來實(shí)現(xiàn)。這是因?yàn)樵~庫是使用最頻繁的公有資源,把詞庫的調(diào)入和查詞工作封裝到WordDataBase類中,這是一個(gè)靜態(tài)類作為公有資源使用,不允許產(chǎn)生多個(gè)實(shí)例。分詞系統(tǒng)同時(shí)為L(zhǎng)ucene索引器、Lucene查詢分析器和Nutch分析器提供服務(wù)。詞庫選擇的好壞,直接影響著Lucene和Nutch的表現(xiàn)。對(duì)于Lucene來說,是否收入長(zhǎng)詞語并沒有多大關(guān)系。因?yàn)長(zhǎng)ucene可以將相對(duì)短的詞語進(jìn)行索引
10、,查詢時(shí),不會(huì)造成什么影響。例如,“中華人民共和國(guó)”這個(gè)詞語并不存在于詞庫中,而是“中華”,“人民”,“共和國(guó)”三個(gè)詞語存在。在索引時(shí),這三個(gè)詞語被連續(xù)的索引。Lucene查詢分析器將“中華人民共和國(guó)”解釋為一個(gè)短語查詢對(duì)象(PhraseQuery),由三個(gè)TermQuery組成,分別是“中華”,“人民”,“共和國(guó)”。由于PhraseQuery查詢要求索引中的詞語順序必須與組成它的TermQuery的順序一致且必須連續(xù),因此在查詢時(shí)同樣能正確的查到。如此一來,似乎可以不再需要詞庫,直接對(duì)每一個(gè)漢字做索引就可以了。這樣做當(dāng)然沒有任何問題,有些搜索引擎就是這么做的。但是為了查準(zhǔn)率,這樣做就有一個(gè)缺
11、點(diǎn),即分詞中的交叉歧義和包含歧義問題。由于是在無語義的情況下分詞,只能作某些字符串運(yùn)算(實(shí)際上是字符串模式匹配)來進(jìn)行分詞,因此出現(xiàn)了不同的分詞策略。每一種策略的分詞結(jié)果可能不同,這完全依賴于詞庫。所有的分詞方法為:前向遞增最大匹配分詞、前向遞減最大匹配分詞、前向遞增最小匹配分詞、前向遞減最小匹配分詞、后向遞增最大匹配分詞、后向遞減最大匹配分詞、后向遞增最小匹配分詞和后向遞減最小匹配分詞,共計(jì)8種方法。系統(tǒng)實(shí)現(xiàn)了4種前向分詞方法,基本上就可以滿足需要。由于現(xiàn)代漢語文章中,充斥著大量的英文單詞甚至句子,尤其是計(jì)算機(jī)方面。鑒于英文是世界上使用最廣泛的語言,中文文章中含有另外的語言的可能性不大。英文
12、分詞是很簡(jiǎn)單的,根據(jù)空格作為分隔符即可。但是,還有一些特殊的單詞,必須要考慮。另外涉及到一個(gè)重要問題,也是最復(fù)雜的一個(gè)問題,就是漢字之間的空格如何處理。一般來講,漢字之間不可能出現(xiàn)空格。在計(jì)算機(jī)中,有時(shí)候?yàn)槊鞔_區(qū)分漢字,也人為地加上空格。處理方法是決不可以把空格當(dāng)作中文的詞語分隔符,因?yàn)榭崭褚话闱∏∈浅霈F(xiàn)在詞語的中間。對(duì)于整個(gè)分詞系統(tǒng)來說,還應(yīng)該允許用戶自由選擇需要的詞語,即提供過濾功能。系統(tǒng)允許用戶設(shè)置中文詞語,英文詞語,中文停止詞,英文停止詞分別是否要加入結(jié)果Word列表中。停止詞表示一種語言中的大量出現(xiàn)且無關(guān)緊要的通用詞語,例如助詞、嘆詞和介詞等。這些信息預(yù)先定義在WordDataBas
13、e中。對(duì)于中文來說,“的”,“地”,“得”等都可以作為停止詞。對(duì)于英文,則有“this”,“are”,“the”等。3.2 JavaCC分析JavaCC是集分詞和語法分析與一身的針對(duì)Java語言的文本自動(dòng)分詞軟件包,類似于Unix系統(tǒng)中的LEX和YACC工具。JavaCC把這兩者的功能結(jié)合,形成了一個(gè)功能強(qiáng)大的分析工具。用戶只需寫出分析腳本,JavaCC就會(huì)生成符合用戶要求的類,用來進(jìn)行詞法和語法分析。JavaCC使用了自動(dòng)機(jī)的理論,而不是遞歸下降分析,Lucene和Nutch正是利用JavaCC這個(gè)十分強(qiáng)大的工具,生成系統(tǒng)的分詞器。JavaCC的語法定義是由正規(guī)式(Regular Expre
14、ssion)來完成的。在這里,指的是上下文無關(guān)文法。理解形式文法的定義,才能更好的理解和使用JavaCC。在一種語言中,存在非終結(jié)符和終結(jié)符兩種單詞。正規(guī)式就定義了一個(gè)非終結(jié)符怎樣被替換為另一個(gè)字符串。正規(guī)式可以描述一種語言,符合該正規(guī)式定義的所有句子都是這個(gè)語言的句子?;蛘?,正規(guī)式描述了正規(guī)文法,又稱線性文法,或上下文無關(guān)文法。稱為線性,是因?yàn)檫@種文法可以從前到后順序的被指定為一個(gè)句子。JavaCC的語法定義功能十分強(qiáng)大,可以做幾乎所有的限制和指定。它提供了四種正規(guī)式類型regexpr_kind := "TOKEN" | "SPECIAL_TOKEN
15、" | "SKIP" | "MORE" TOKEN: 它表示語法中的單詞(Token),這個(gè)段中的正規(guī)式規(guī)定了這種語言中單詞的語法,即分詞的依據(jù)。單詞管理器(TokenManager)依據(jù)每一個(gè)正規(guī)式來匹配下一個(gè)單詞,這是按照最大匹配規(guī)則進(jìn)行的。如果有多個(gè)匹配,那么選擇最長(zhǎng)的單詞返回。如果有幾種正規(guī)式產(chǎn)生了相同長(zhǎng)度的最長(zhǎng)單詞,那么以較笨重正規(guī)式的順序,返回最先定義的正規(guī)式產(chǎn)生的單詞。單詞管理器匹配出要返回的單詞后,即返回給語法分析器。SPECIAL_TOKEN: 在SPECIAL_TOKEN段寫出的正規(guī)式規(guī)定了特殊單詞。
16、特殊單詞也是一種單詞,但是并不起實(shí)際的作用,也不能從getNextToken中訪問到。它的訪問方式是從Token類的specialToken屬性來讀取。對(duì)于一種語言,如果某些單詞不起語法的作用,但也是句子的一部分,那么可以使用特殊單詞。例如編程語言中的注釋。SKIP: 由SKIP段產(chǎn)生的單詞被跳過(即忽略)。當(dāng)我們不惜望出現(xiàn)某種模式的單詞時(shí),即可使用SKIP段。MORE: 當(dāng)一個(gè)單詞不能一次被產(chǎn)生,而必須逐漸產(chǎn)生時(shí),則使用MORE。未完成的Token被存儲(chǔ)在一個(gè)StringBuffer對(duì)象中,我們可以任意修改。所謂正規(guī)式,實(shí)際就是產(chǎn)生式。它的語法格式j(luò)avacode_production :=
17、 "JAVACODE" java_return_type java_identifier "(" java_parameter_list ")" java_block JAVACODE產(chǎn)生式可以寫入任何Java代碼,也可以寫EBNF(擴(kuò)展的Backus-Naur范式)。實(shí)際上,在某種程度上上下文無關(guān)語言就變成了上下文相關(guān)語言,因?yàn)镴ava代碼可以處理有關(guān)語境的信息。例如,在修改的腳本加入了代碼以后,就是一個(gè)上下文相關(guān)語言。有時(shí)候,當(dāng)EBNF無法自行描述語法時(shí),也可以借助“
18、無所不能的”Java代碼。例如下面的代碼,非終結(jié)符 "skip_to_matching_brace"的作用是跳過完整匹配的括號(hào)。實(shí)際上,這個(gè)工作是EBNF無法完成的,因?yàn)樗枋龅牟皇蔷€性文法。但是,使用Java代碼可以很容易的解決 JAVACODE void skip_to_matching_brace() Token tok; int nesting = 1; while (true) tok = getToken(1); if (tok.kind = LBRACE) nesting+; if (tok.kind = RBRACE)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 業(yè)務(wù)授權(quán)委托合同范例
- 代理中價(jià)合同范例
- 入住公寓保潔合同范例
- 中鐵23局招聘合同范例
- 產(chǎn)后恢復(fù)合同范例
- 呼叫中心客服崗前培訓(xùn)體系
- 建設(shè)工程合同試題及答案
- 中考考務(wù)培訓(xùn)解讀
- 抽沙合同 協(xié)議書
- 美容干股合同協(xié)議書
- 線性代數(shù)矩陣
- S22天天高速安慶至潛山段(涼亭至月山)環(huán)境影響報(bào)告書
- 某廠蒸汽管道安裝吹掃及試運(yùn)行方案
- 清華大學(xué)出版社機(jī)械制圖習(xí)題集參考答案(課堂PPT)
- 安徽金軒科技有限公司 年產(chǎn)60萬噸硫磺制酸項(xiàng)目環(huán)境影響報(bào)告書
- 兒科護(hù)理學(xué)智慧樹知到答案章節(jié)測(cè)試2023年石河子大學(xué)
- 兩篇古典英文版成語故事百鳥朝鳳英文版
- GB/T 37573-2019露天煤礦邊坡穩(wěn)定性年度評(píng)價(jià)技術(shù)規(guī)范
- GB/T 19634-2021體外診斷檢驗(yàn)系統(tǒng)自測(cè)用血糖監(jiān)測(cè)系統(tǒng)通用技術(shù)條件
- GB/T 119.1-2000圓柱銷不淬硬鋼和奧氏體不銹鋼
- 勞動(dòng)保障監(jiān)察執(zhí)法課件
評(píng)論
0/150
提交評(píng)論