小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

搜索引擎系統(tǒng)學(xué)習(xí)與開發(fā)實踐總結(jié)

 jianjun0921 2006-11-19

 
查看文章
 
搜索引擎系統(tǒng)學(xué)習(xí)與開發(fā)實踐總結(jié)
2006-07-23 20:14

一、搜索引擎概述
搜索引擎的發(fā)展歷史
在互聯(lián)網(wǎng)發(fā)展初期,網(wǎng)站相對較少,信息查找比較容易。然而伴隨互聯(lián)網(wǎng)爆炸性的發(fā)展,普通網(wǎng)絡(luò)用戶想找到所需的資料簡直如同大海撈針,這時為滿足大眾信息檢索需求的專業(yè)搜索網(wǎng)站便應(yīng)運而生了。
  現(xiàn)代意義上的搜索引擎的祖先,是1990年由蒙特利爾大學(xué)學(xué)生Alan Emtage發(fā)明的Archie。雖然當(dāng)時World Wide Web還未出現(xiàn),但網(wǎng)絡(luò)中文件傳輸還是相當(dāng)頻繁的,而且由于大量的文件散布在各個分散的FTP主機中,查詢起來非常不便,因此Alan Emtage想到了開發(fā)一個可以以文件名查找文件的系統(tǒng),于是便有了Archie。
  Archie工作原理與現(xiàn)在的搜索引擎已經(jīng)很接近,它依靠腳本程序自動搜索網(wǎng)上的文件,然后對有關(guān)信息進行索引,供使用者以一定的表達式查詢。由于Archie深受用戶歡迎,受其啟發(fā),美國內(nèi)華達System Computing Services大學(xué)于1993年開發(fā)了另一個與之非常相似的搜索工具,不過此時的搜索工具除了索引文件外,已能檢索網(wǎng)頁。
  當(dāng)時,“機器人”一詞在編程者中十分流行。電腦“機器人”(Computer Robot)是指某個能以人類無法達到的速度不間斷地執(zhí)行某項任務(wù)的軟件程序。由于專門用于檢索信息的“機器人”程序象蜘蛛一樣在網(wǎng)絡(luò)間爬來爬去,因此,搜索引擎的“機器人”程序就被稱為“蜘蛛”程序。
  世界上第一個用于監(jiān)測互聯(lián)網(wǎng)發(fā)展規(guī)模的“機器人”程序是Matthew Gray開發(fā)的World wide Web Wanderer。剛開始它只用來統(tǒng)計互聯(lián)網(wǎng)上的服務(wù)器數(shù)量,后來則發(fā)展為能夠檢索網(wǎng)站域名。
  與Wanderer相對應(yīng),Martin Koster于1993年10月創(chuàng)建了ALIWEB,它是Archie的HTTP版本。ALIWEB不使用“機器人”程序,而是靠網(wǎng)站主動提交信息來建立自己的鏈接索引,類似于現(xiàn)在我們熟知的Yahoo。
  隨著互聯(lián)網(wǎng)的迅速發(fā)展,使得檢索所有新出現(xiàn)的網(wǎng)頁變得越來越困難,因此,在Matthew Gray的Wanderer基礎(chǔ)上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進。其設(shè)想是,既然所有網(wǎng)頁都可能有連向其他網(wǎng)站的鏈接,那么從跟蹤一個網(wǎng)站的鏈接開始,就有可能檢索整個互聯(lián)網(wǎng)。到1993年底,一些基于此原理的搜索引擎開始紛紛涌現(xiàn),其中以JumpStation、The World Wide Web Worm(Goto的前身,也就是今天Overture),和Repository-Based Software Engineering (RBSE) spider最負盛名。
  然而JumpStation和WWW Worm只是以搜索工具在數(shù)據(jù)庫中找到匹配信息的先后次序排列搜索結(jié)果,因此毫無信息關(guān)聯(lián)度可言。而RBSE是第一個在搜索結(jié)果排列中引入關(guān)鍵字串匹配程度概念的引擎。
  最早現(xiàn)代意義上的搜索引擎出現(xiàn)于1994年7月。當(dāng)時Michael Mauldin將John Leavitt的蜘蛛程序接入到其索引程序中,創(chuàng)建了大家現(xiàn)在熟知的Lycos。同年4月,斯坦福(Stanford)大學(xué)的兩名博士生,David Filo和美籍華人楊致遠(Gerry Yang)共同創(chuàng)辦了超級目錄索引Yahoo,并成功地使搜索引擎的概念深入人心。從此搜索引擎進入了高速發(fā)展時期。目前,互聯(lián)網(wǎng)上有名有姓的搜索引擎已達數(shù)百家,其檢索的信息量也與從前不可同日而語。比如最近風(fēng)頭正勁的Google,其數(shù)據(jù)庫中存放的網(wǎng)頁已達30億之巨!還有百度其存放的網(wǎng)頁也有6億多。
  隨著互聯(lián)網(wǎng)規(guī)模的急劇膨脹,一家搜索引擎光靠自己單打獨斗已無法適應(yīng)目前的市場狀況,因此現(xiàn)在搜索引擎之間開始出現(xiàn)了分工協(xié)作,并有了專業(yè)的搜索引擎技術(shù)和搜索數(shù)據(jù)庫服務(wù)提供商。象國外的Inktomi(已被Yahoo收購),它本身并不是直接面向用戶的搜索引擎,但向包括Overture(原GoTo,已被Yahoo收購)、LookSmart、MSN、HotBot等在內(nèi)的其他搜索引擎提供全文網(wǎng)頁搜索服務(wù)。國內(nèi)的百度也屬于這一類,搜狐和新浪用的就是它的技術(shù)。因此從這個意義上說,它們是搜索引擎的搜索引擎。
現(xiàn)在一提到搜索引擎,人們往往想到的是Google、百度、雅虎、搜狐等。那么究竟什么是搜索引擎呢?“搜索引擎”實際上是為人們提供在internet網(wǎng)上利用關(guān)鍵詞來進行全文檢索的一種網(wǎng)頁檢索工具。
搜索引擎分類
  搜索引擎按其工作方式主要可分為三種,分別是全文搜索引擎(Full Text Search Engine)、目錄索引類搜索引擎(Search Index/Directory)和元搜索引擎(Meta Search Engine)。全文搜索引擎是最廣泛也是用得最多的一種,一般所說的搜索引擎都指的是全文搜索引擎。

全文搜索引擎
  全文搜索引擎是名副其實的搜索引擎,國外具代表性的有Google、Fast/AllTheWeb、AltaVista、Inktomi、Teoma、WiseNut等,國內(nèi)著名的有百度(Baidu)、中國搜索等。它們都是通過從互聯(lián)網(wǎng)上提取的各個網(wǎng)站的信息(以網(wǎng)頁文字為主)而建立的數(shù)據(jù)庫中,檢索與用戶查詢條件匹配的相關(guān)記錄,然后按一定的排列順序?qū)⒔Y(jié)果返回給用戶,因此他們是真正的搜索引擎。
  從搜索結(jié)果來源的角度,全文搜索引擎又可細分為兩種,一種是擁有自己的檢索程序(Indexer),俗稱“蜘蛛”(Spider)程序或“機器人”(Robot)程序,并自建網(wǎng)頁數(shù)據(jù)庫,搜索結(jié)果直接從自身的數(shù)據(jù)庫中調(diào)用,如上面提到的7家引擎;另一種則是租用其他引擎的數(shù)據(jù)庫,并按自定的格式排列搜索結(jié)果,如Lycos引擎。

目錄索引
目錄索引雖然有搜索功能,但在嚴(yán)格意義上算不上是真正的搜索引擎,僅僅是按目錄分類的網(wǎng)站鏈接列表而已。用戶完全可以不用進行關(guān)鍵詞(Keywords)查詢,僅靠分類目錄也可找到需要的信息。目錄索引中最具代表性的莫過于大名鼎鼎的Yahoo雅虎。其他著名的還有Open Directory Project(DMOZ)、LookSmart、About等。國內(nèi)的搜狐、新浪、網(wǎng)易搜索也都屬于這一類。

元搜索引擎 (META Search Engine)

  元搜索引擎在接受用戶查詢請求時,同時在其他多個引擎上進行搜索,并將結(jié)果返回給用戶。著名的元搜索引擎有InfoSpace、Dogpile、Vivisimo等(元搜索引擎列表),中文元搜索引擎中具代表性的有搜星搜索引擎。在搜索結(jié)果排列方面,有的直接按來源引擎排列搜索結(jié)果,如Dogpile,有的則按自定的規(guī)則將結(jié)果重新排列組合,如Vivisimo。
  除上述三大類引擎外,還有以下幾種非主流形式:
  1、集合式搜索引擎:如HotBot在2002年底推出的引擎。該引擎類似META搜索引擎,但區(qū)別在于不是同時調(diào)用多個引擎進行搜索,而是由用戶從提供的4個引擎當(dāng)中選擇,因此叫它“集合式”搜索引擎更確切些。
  2、門戶搜索引擎:如AOL Search、MSN Search等雖然提供搜索服務(wù),但自身即沒有分類目錄也沒有網(wǎng)頁數(shù)據(jù)庫,其搜索結(jié)果完全來自其他引擎。
  3、免費鏈接列表(Free For All Links,簡稱FFA):這類網(wǎng)站一般只簡單地滾動排列鏈接條目,少部分有簡單的分類目錄,不過規(guī)模比起Yahoo等目錄索引來要小得多?! ?br>  由于上述網(wǎng)站都為用戶提供搜索查詢服務(wù),為方便起見,我們通常將其統(tǒng)稱為搜索引擎。
搜索引擎組成及工作原理
搜索引擎系統(tǒng)一般由蜘蛛(也叫網(wǎng)頁爬行器)、切詞器、索引器、查詢器幾部分組成。蜘蛛負責(zé)網(wǎng)頁信息的抓取工作,一般情況下切詞器和索引器一起使用,它們負責(zé)將抓取的網(wǎng)頁內(nèi)容進行切詞處理并自動進行標(biāo)引,建立索引數(shù)據(jù)庫。查詢器根據(jù)用戶查詢條件檢索索引數(shù)據(jù)庫并對檢索結(jié)果進行排序和集合運算,如并集、交集運算,再提取網(wǎng)頁簡單摘要信息反饋給查詢用戶。
Google搜索引擎從功能上同樣分為三大部分:網(wǎng)頁爬行、標(biāo)引入庫和用戶查詢。網(wǎng)頁爬行主要負責(zé)網(wǎng)頁的抓取,由URL服務(wù)器、爬行器、存儲器、分析器和URL解析器組成, 爬行器是該部分的核心;標(biāo)引入庫主要負責(zé)對網(wǎng)頁內(nèi)容進行分析,對文檔進行標(biāo)引并存儲到數(shù)據(jù)庫里,由標(biāo)引器和分類器組成,該模塊涉及許多文件和數(shù)據(jù),有關(guān)于桶的操作是該部分的核心;用戶查詢主要負責(zé)分析用戶輸入的檢索表達式,匹配相關(guān)文檔,把檢索結(jié)果返回給用戶,由查詢器和網(wǎng)頁級別評定器組成,其中網(wǎng)頁等級的計算是該部分的核心。其總體系統(tǒng)結(jié)構(gòu)下圖所示。

搜索引擎的主要工作流程是:首先從蜘蛛開始,蜘蛛程序每隔一定的時間(象google一般是28天)自動啟動并讀取網(wǎng)頁URL服務(wù)器上的URL列表,按深度優(yōu)先或廣度優(yōu)先算法,抓取各URL所指定的網(wǎng)站,將抓取的網(wǎng)頁分配一個唯一文檔ID(DocId),存入文檔數(shù)據(jù)庫。一般在存入文檔數(shù)據(jù)庫之前進行一定的壓縮處理。并將當(dāng)前頁上的所的超連接存入到URL服務(wù)器中。在進行抓取的同時,切詞器和索引器將已經(jīng)抓取的網(wǎng)頁文檔進行切詞處理,并按詞在網(wǎng)頁中出現(xiàn)的位置和頻率計算權(quán)值,然后將切詞結(jié)果存入索引數(shù)據(jù)庫。整個抓取工作和索引工作完成后更新整個索引數(shù)據(jù)庫和文檔數(shù)據(jù)庫,這樣用戶就可以查詢最新的網(wǎng)頁信息。查詢器首先對用戶輸入的信息進行切詞處理,并檢索出所有包含檢索詞的記錄,通過計算網(wǎng)頁權(quán)重和級別對查詢記錄進行排序并進行集合運算,最后從文檔數(shù)據(jù)庫中提取各網(wǎng)頁的摘要信息反饋給查詢用戶。
二、網(wǎng)絡(luò)蜘蛛
概述
蜘蛛(即Web Spider),實際上是一個基于HTTP協(xié)議的網(wǎng)絡(luò)應(yīng)用程序。網(wǎng)絡(luò)蜘蛛是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁,從網(wǎng)站某一個頁面(通常是首頁)開始,讀取網(wǎng)頁的內(nèi)容,并抽取出網(wǎng)頁中的其它超鏈接地址,然后通過這些鏈接地址尋找下一個網(wǎng)頁,這樣一直循環(huán)下去,直到把這個網(wǎng)站所有的網(wǎng)頁都抓取完為止。
在抓取網(wǎng)頁的時候,網(wǎng)絡(luò)蜘蛛一般有兩種策略:廣度優(yōu)先和深度優(yōu)先。廣度優(yōu)先是指網(wǎng)絡(luò)蜘蛛會先抓取起始網(wǎng)頁中鏈接的所有網(wǎng)頁,然后再選擇其中的一個鏈接網(wǎng)頁,繼續(xù)抓取在此網(wǎng)頁中鏈接的所有網(wǎng)頁。這是最常用的方式,因為這個方法可以讓網(wǎng)絡(luò)蜘蛛并行處理,提高其抓取速度。深度優(yōu)先是指網(wǎng)絡(luò)蜘蛛會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路之后再轉(zhuǎn)入下一個起始頁,繼續(xù)跟蹤鏈接。這個方法有個優(yōu)點是網(wǎng)絡(luò)蜘蛛在設(shè)計的時候比較容易。
主要組成
根據(jù)抓取過程蜘蛛主要分為三個功能模塊,一個是網(wǎng)頁讀取模塊主要是用來讀取遠程Web服務(wù)器上的網(wǎng)頁內(nèi)容,另一個是超鏈分析模塊,這個模塊主要是分析網(wǎng)頁中的超鏈接,將網(wǎng)頁上的所有超鏈接提取出來,放入到待抓取URL列表中,再一個模塊就是內(nèi)容分析模塊,這個模塊主要是對網(wǎng)頁內(nèi)容進行分析,將網(wǎng)頁中所有超標(biāo)志去掉只留下網(wǎng)頁文字內(nèi)容。蜘蛛的主要工作流程如下圖所示:
首先蜘蛛讀取抓取站點的URL列表,取出一個站點URL,將其放入未訪問的URL列表(UVURL列表)中,如果UVURL不為空剛從中取出一個URL判斷是否已經(jīng)訪問過,若沒有訪問過則讀取此網(wǎng)頁,并進行超鏈分析及內(nèi)容分析,并將些頁存入文檔數(shù)據(jù)庫,并將些URL放入已訪問URL列表(VURL列表),直到UVRL為空為止,此時再抓取其他站點,依次循環(huán)直到所有的站點URL列表都抓取完為止。


關(guān)鍵技術(shù)
1、 多線程技術(shù):由于抓取的站點URL相當(dāng)多,采用單線程蜘蛛抓取時速度不夠,也不能滿足實際的需要。因而需要多線程技術(shù)來創(chuàng)建多個蜘蛛線程來同時抓取,以提高速度。
2、 網(wǎng)頁抓取:網(wǎng)頁抓取是基于HTTP協(xié)議之上的,網(wǎng)頁上的資源有多種,有網(wǎng)頁,有Word文檔也有其他類型的文件,這樣抓取時需要判斷URL所指向資源的類型。
3、 超鏈分析:超鏈分析是一個比較重要的環(huán)節(jié),需要對HTML的各種標(biāo)志(tag)有一個很全面的了解。需要反復(fù)測試,考慮各種情形的發(fā)生。
超鏈分析時從網(wǎng)頁里提取出來的是相對于當(dāng)前頁的相對URL,因而需要根據(jù)當(dāng)前頁的絕對URL將提取的這個URL轉(zhuǎn)換成絕對URL。在此過程中需要根據(jù)ParentURL(就是當(dāng)前頁的URL)作出各種判斷。各種情況判斷如下圖所示:

經(jīng)驗總結(jié)
商業(yè)化的蜘蛛需要抓取上億的網(wǎng)頁,因而抓取速度是一個關(guān)鍵,另外蜘蛛需要自動運行,盡是減少人工的參與,因而系統(tǒng)的性能也是一個很重要的關(guān)鍵,系統(tǒng)能夠在發(fā)生異常的時候自動進行處理,防止程序的退出和死機。本人認為有一些細節(jié)需要注意:
1、 系統(tǒng)應(yīng)該使用多線程,使用多個蜘蛛同時抓取,在可能的情況下,最好是做成分布式的蜘蛛程序,蜘蛛應(yīng)該分布地網(wǎng)絡(luò)上多臺服務(wù)器上協(xié)同抓取網(wǎng)頁,這樣速度會更快,更符合我們的實際應(yīng)用。
2、 對于同一網(wǎng)站的網(wǎng)頁應(yīng)該采用同一個HttpConnection這樣有效地節(jié)省創(chuàng)建一個連接的時間,另外對于抓取的URL采用域名緩沖機制(可在網(wǎng)關(guān)一級上實現(xiàn)),這樣抓取時減少由域名到IP地址的轉(zhuǎn)換時間以及重復(fù)的域名轉(zhuǎn)換。若能做到這一步將會大大減少抓取時間,因為訪問一URL時每次都要進行域名到主機IP地址的轉(zhuǎn)換。
3、 最好是能夠?qū)⒆x取網(wǎng)頁、超鏈分析及網(wǎng)頁內(nèi)容分析三部分分開來做,讓它們并行協(xié)同工作,這樣效率會更高。因為在這三個過程中網(wǎng)頁讀取比起其他兩個功能來說是一個長任務(wù),最耗時間。當(dāng)抓取完一網(wǎng)頁后,在抓取下一網(wǎng)頁的時候讓去執(zhí)行超鏈分析和內(nèi)容分析。這樣在下一網(wǎng)頁抓取完成之前超鏈分析和內(nèi)容分析任務(wù)就能完成,抓取任務(wù)不會延遲,這樣節(jié)省了一些時間。
三、切詞器
概述
1、 概述
眾所周知,英文是以詞為單位的,詞和詞之間是靠空格隔開,而中文是以字為單位,句子中所有的字連起來才能描述一個意思。例如,英文句子I am a student,用中文則為:“我是一個學(xué)生”。計算機可以很簡單通過空格知道student是一個單詞,但是不能很容易明白“學(xué)”、“生”兩個字合起來才表示一個詞。把中文的漢字序列切分成有意義的詞,就是中文分詞,有些人也稱為切詞。我是一個學(xué)生,分詞的結(jié)果是:我 是 一個 學(xué)生。
2、切詞算法
現(xiàn)有的分詞算法可分為三大類:基于字符串匹配的分詞方法、基于理解的分詞方法和基于統(tǒng)計的分詞方法。
  1)、基于字符串匹配的分詞方法
  這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個“充分大的”機器詞典中的詞條進行匹配,若在詞典中找到某個字符串,則匹配成功(識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向匹配和逆向匹配;按照不同長度優(yōu)先匹配的情況,可以分為最大(最長)匹配和最?。ㄗ疃蹋┢ヅ?;按照是否與詞性標(biāo)注過程相結(jié)合,又可以分為單純分詞方法和分詞與標(biāo)注相結(jié)合的一體化方法。常用的幾種機械分詞方法如下:
  a)正向最大匹配法(由左到右的方向);
  b)逆向最大匹配法(由右到左的方向);
  c)最少切分(使每一句中切出的詞數(shù)最小)。
  還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結(jié)合起來構(gòu)成雙向匹配法。由于漢語單字成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高于正向匹配,遇到的歧義現(xiàn)象也較少。統(tǒng)計結(jié)果表明,單純使用正向最大匹配的錯誤率為1/169,單純使用逆向最大匹配的錯誤率為1/245。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統(tǒng),都是把機械分詞作為一種初分手段,還需通過利用各種其它的語言信息來進一步提高切分的準(zhǔn)確率。
  一種方法是改進掃描方式,稱為特征掃描或標(biāo)志切分,優(yōu)先在待分析字符串中識別和切分出一些帶有明顯特征的詞,以這些詞作為斷點,可將原字符串分為較小的串再來進行機械分詞,從而減少匹配的錯誤率。另一種方法是將分詞和詞類標(biāo)注結(jié)合起來,利用豐富的詞類信息對分詞決策提供幫助,并且在標(biāo)注過程中又反過來對分詞結(jié)果進行檢驗、調(diào)整,從而極大地提高切分的準(zhǔn)確率。
  2)、基于理解的分詞方法
  這種分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果,但這種方法需要大量的詞法、句法、語義知識。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現(xiàn)象。它通常包括三個部分:分詞子系統(tǒng)、句法語義子系統(tǒng)、總控部分。在總控部分的協(xié)調(diào)下,分詞子系統(tǒng)可以獲得有關(guān)詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由于漢語語言知識的籠統(tǒng)、復(fù)雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基于理解的分詞系統(tǒng)還處在試驗階段。
  3)、基于統(tǒng)計的分詞方法
  從形式上看,詞是穩(wěn)定的字的組合,因此在上下文中,相鄰的字同時出現(xiàn)的次數(shù)越多,就越有可能構(gòu)成一個詞。因此字與字相鄰共現(xiàn)的頻率或概率能夠較好的反映成詞的可信度??梢詫φZ料中相鄰共現(xiàn)的各個字的組合的頻度進行統(tǒng)計,計算它們的互現(xiàn)信息。定義兩個字的互現(xiàn)信息,計算兩個漢字X、Y的相鄰共現(xiàn)概率?;ガF(xiàn)信息體現(xiàn)了漢字之間結(jié)合關(guān)系的緊密程度。當(dāng)緊密程度高于某一個閾值時,便可認為此字組可能構(gòu)成了一個詞。這種方法只需對語料中的字組頻度進行統(tǒng)計,不需要切分詞典,因而又叫做無詞典分詞法或統(tǒng)計取詞方法。但這種方法也有一定的局限性,會經(jīng)常抽出一些共現(xiàn)頻度高、但并不是詞的常用字組,例如“這一”、“之一”、“有的”、“我的”、“許多的”等,并且對常用詞的識別精度差,時空開銷大。實際應(yīng)用的統(tǒng)計分詞系統(tǒng)都要使用一部基本的分詞詞典(常用詞詞典)進行串匹配分詞,同時使用統(tǒng)計方法識別一些新的詞,即將串頻統(tǒng)計和串匹配結(jié)合起來,既發(fā)揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結(jié)合上下文識別生詞、自動消除歧義的優(yōu)點。
到底哪種分詞算法的準(zhǔn)確度更高,目前并無定論。對于任何一個成熟的分詞系統(tǒng)來說,不可能單獨依靠某一種算法來實現(xiàn),都需要綜合不同的算法。筆者了解,海量科技的分詞算法就采用“復(fù)方分詞法”,所謂復(fù)方,相當(dāng)于用中藥中的復(fù)方概念,即用不同的藥才綜合起來去醫(yī)治疾病,同樣,對于中文詞的識別,需要多種算法來處理不同的問題。
3、關(guān)鍵問題
  1)通用詞表和切分規(guī)范
  漢語的語素和單字詞,合成詞和短語之間沒有清晰的界限。語言學(xué)界雖然對于詞在概念上有一個十分清晰的定義,即,“詞是最小的能夠獨立活動的有意義的語言成分。”但從一些詞典的編撰中,我們?nèi)匀豢煽闯鲆恍┥鲜鼋缦揠y以區(qū)分的問題。比如:“聽見”“看見”在很多詞典中都有收錄,但是有類似結(jié)構(gòu)的“聞見”卻沒有收錄。在建立分詞系統(tǒng)詞表時,仍然對于收詞的標(biāo)準(zhǔn)難以把握,例如:“雞蛋”是詞,那么“鴨蛋、鵪鶉蛋”是否也作為詞收入詞表?至今為止,分詞系統(tǒng)仍然沒有一個統(tǒng)一的具有權(quán)威性的分詞詞表作為分詞依據(jù)。這不能不說是分詞系統(tǒng)所面臨的首要問題。除了分詞詞表,還有一個概念值得我們注意,即“分詞單位”。從計算機進行分詞的過程來看,其輸出的詞串我們稱之為“切分單位”或“分詞單位”?!缎畔⑻幚碛矛F(xiàn)代漢語分詞規(guī)范》中對于“分詞單位”也有一個定義:“漢語信息處理使用的、具有確定的語義或語法功能的基本單位。包括本規(guī)范的規(guī)則限定的詞和詞組?!庇纱丝梢姡畔⑻幚碇蟹衷~單位的定義比傳統(tǒng)意義上的詞更寬泛些。這也就避開了理論上對于詞的界定難以把握的困擾。分詞系統(tǒng)可以面向解決實際問題的需求和真實語料中使用的頻繁程度來規(guī)定“分詞單位”。分詞單位可以是同詞表中詞完全一致,也可以是包含未登錄詞識別以及一些詞法分析的切分單位, 例如,一些人名、地名、機構(gòu)名、外國人譯名,應(yīng)予以識別和切分。一些動詞和形容詞重疊結(jié)構(gòu),如“高高大大”、“甜甜蜜蜜”等;一些附加詞,如后綴,“親和性”、“熱敏性”等;都可以作為分詞單位予以識別和切分。因此,對于一個分詞系統(tǒng)而言,制定一個一致性的分詞單位切分規(guī)范無疑也是一個重要的問題。
2)歧義切分字段
  分詞系統(tǒng)要處理的第二個關(guān)鍵問題是文本中歧義切分字段的判別。漢語中歧義切分字段最基本有以下兩種類型:
  交集型歧義字段,據(jù)統(tǒng)計,這種歧義字段占全部歧義字段的85%以上。[4]所以這也是分詞系統(tǒng)所要重點解決的問題。在字段ABC中,這里,A,B,C分別代表有一個或多個漢字組成的字串。A,AB,BC,C分別都是詞表中的詞,則稱該字段為交集型歧義字段。如:“中國/人”,“中/國人”兩種切分結(jié)果。
組合型歧義在字段ABC中, A,B,AB 分別都是詞表中的詞,則稱該字段為交集型歧義字段。如:他/具有/非凡/的/才能/。/ 只有/他/才/能/舉起/這/個/重物/。/
3)未登錄詞識別
  我們知道,詞表中不能囊括所有的詞。一方面是因為語言在不斷的發(fā)展和變化,新詞會不斷的出現(xiàn)。另一方面是因為詞的衍生現(xiàn)象非常普遍,沒有必要把所有的衍生詞都收入辭典中。
  特別是人名、地名等專有名詞,在文本中有非常高的使用頻度和比例。而且由于未錄詞引入的分詞錯誤往往比單純的詞表切分歧義還要嚴(yán)重。這就要求分詞系統(tǒng)具有一定的未登錄詞識別能力,從而提高分詞的正確性。 除了人名、地名的識別,我們認為,分詞系統(tǒng)還需要有一定的詞法分析能力,從而解決衍生詞和復(fù)合詞等詞匯平面上的問題,為進一步的中文信息處理提供堅實的基礎(chǔ)。
切分原理
1、 詞庫組織
本人采用的是基于詞表匹配的分詞方法,因而詞庫是分詞系統(tǒng)的基礎(chǔ)。整個分詞過程實際上就是在詞詞上的查找匹配過程,因而詞庫的組織相當(dāng)重要。
對于詞表存放在一個文本文件里,每一個詞條由兩項組成,一個是詞的ID(WordId)、另一個就是詞本身。同時在詞表上加上靜態(tài)索引,本人對詞表進行分組管理并在上面添加三級索引。首先對詞條按字?jǐn)?shù)分組,字?jǐn)?shù)相同的詞條放在同一組里,并對詞表按首漢字的內(nèi)碼從小到大排序。一級索引是加在各個分組上,一級索引記錄了各分組的開始位置,再根據(jù)下一分組的起始位置可以確定當(dāng)前分組的終止位置。二級索引是加在一級索引內(nèi)部的,在同一組內(nèi)部由于有很多的詞條,二級索引是按詞的首漢字內(nèi)碼建立的,它加在以不同漢字開頭的詞條組中,這樣通過三級索引可以進一步縮小查找范圍。另外在漢字中以有些字開頭的詞條過多,這樣進行匹配的次數(shù)過多,不利于提高匹配速度。因而在二級索引的基礎(chǔ)之上添加一個三級索引,它是按照一定的密度間隔添加,我設(shè)定了一個默認的合理的值就是每隔50個詞條添加一個三級索引,同樣三級索引也是根據(jù)漢字內(nèi)碼添加的(三級索引和二級索引的定義相同)。詞條及索引的定義如下:
//根據(jù)漢字內(nèi)碼建立的索引結(jié)點(二級和三級索引)
typedef struct CodeIndexNode{
char KeyValue[17];
int nIndex;
}CodeIndex;

//根據(jù)詞語字?jǐn)?shù)建立的一級索引結(jié)點
typedef struct WordsIndexNode{
int nKeyCount;
int nKeyBeginIndex;
int nKeyEndIndex;
int CodeIndexCount;
CArrayHexIndex;
}WordsIndex;

//關(guān)鍵字結(jié)點
typedef struct KeyWordNode{
CString strKeyWord; //關(guān)鍵字
int nID; //關(guān)鍵字ID
};
詞表及一級、二級、三級索引之間的關(guān)系如下圖所示:

2、 切分方法
由于采用的是基于詞庫匹配的正向最大匹配算法(通常簡稱為MM法),其基本思想為:設(shè)D為詞典,MAX表示D中的最大詞長,str為待切分的字串。MM法是每次從str中取長度為MAX的子串與D中的詞進行匹配。若成功,則該子串為詞,指針后移MAX個漢字后繼續(xù)匹配,否則子串逐次減一進行匹配。所以主要切詞過程如下:(流程圖如下圖所示)


1)、讀取詞庫,并讀取相應(yīng)的靜態(tài)索引,建立詞庫上的索引;
2)、讀取待切分的字串str;
3)、從待切分字串str中取出一個長度為MAX的子串sstr,到詞典中去匹配,若匹配成功則取下一個長度為MAX的子串進行匹配,否則將子串sstr從后面截去一個字后繼續(xù)匹配,直到匹配成功或者子串sstr中只有一個字為止。若匹配成功則從匹配成功的詞的位置開始再截取下一長度為MAX的子串sstr進行匹配,依次循環(huán)直到將str串匹配完為止。
4)匹配過程:首先根據(jù)子串sstr的長度(這里指的是字?jǐn)?shù))確定一級索引也就是確定分組,這個過程可以二分查找法,也可以采用Hash函數(shù)直接定位,但是由于分組數(shù)很少(不會超過20)因而兩種方法沒有多大的區(qū)別。在確定了分組后再根據(jù)首漢字的內(nèi)碼確定二級索引,因為二級索引是按內(nèi)碼從小到大的順序因而可采用拆半查找方法,找到以后再確定三級索引,這樣將進行匹配的過程縮小到一個很小的范圍,在這個范圍內(nèi)匹配不成功則進行下一個串的匹配。通過確定三級索引確定了進行匹配的最小詞條集。
3、 切分結(jié)果的保存(也就是順排檔數(shù)據(jù)的保存)
由于數(shù)據(jù)量很大,不能全存放在內(nèi)存中,所以每處理完一文檔就將其切分結(jié)果存放到外部文件中,這里可以借助其它關(guān)系型數(shù)據(jù)庫,這有利于于索引器導(dǎo)出數(shù)據(jù)將其導(dǎo)成倒排檔索引文件。主要用到的結(jié)構(gòu)體定義如下:
//Hit結(jié)點
typedef struct HitNode{
int nPos;//位置
HitNode* pNext;//下一hit指針
};
//文檔列表結(jié)點
typedef struct DocListNode{
_int64 nDocID;//DOC ID
int nHits;//詞出現(xiàn)的次數(shù)
float fWeight;//詞在文中的要重
HitNode* pHitHead;//Hit鏈表頭指針
DocListNode* pNext;
};
//一級索引結(jié)點
typedef struct LexIconNode{
int nKeyWordID;//關(guān)鍵字ID
int nDocs;//文檔數(shù)
DocListNode* pDocListHead;//文檔鏈表頭指針
LexIconNode* pNext;
};
在數(shù)據(jù)庫中存放的字段主要有:DocID、WordID、Hit(位置)、Weight(權(quán)值)。這樣索引器導(dǎo)出時將會按WordID和權(quán)值進行排序。
經(jīng)驗總結(jié)
1、 存在的問題
1)、在詞庫組織方面采用靜態(tài)的索引不利于于詞庫的變化,若有一新詞出現(xiàn),則需要重建整個詞庫的索引,因為下標(biāo)都發(fā)生了變量。這不利于詞庫的擴充。
2)、詞的ID分配機制也有些不足,這里的ID都是跟詞的內(nèi)碼相關(guān),也就是跟詞在詞庫中的排序順序有關(guān),這樣若有新詞添加進來后,就會改變其后面所有詞的ID。
3)、切詞的速度不夠快,雖然每秒能達到400多字,但是詞庫比較小,只有5萬多的詞條。若司庫很大時速度會有所下降。
4)、因為漢字是雙字節(jié)表示的,所以在切分之前轉(zhuǎn)換成Unicode,轉(zhuǎn)換成多字節(jié)表示,經(jīng)過測試發(fā)現(xiàn),多字節(jié)轉(zhuǎn)換占用了很大一塊CPU時間,將近占去了40%的時間。
5)、在進行多字節(jié)轉(zhuǎn)換時開設(shè)的緩沖區(qū)為1000個漢字,若需要轉(zhuǎn)換的漢字多于1000則會出錯,但若開設(shè)的緩沖區(qū)過大是對系統(tǒng)資源的浪費。
6)、是一種機械的切詞方法,沒有對歧義詞進行排除和分析。
7)、沒有新詞的識別功能,也就是不通過詞典不能識別切分出新的詞。
2、 改進的方向
1)、詞表組織
在詞表上添加三級索引是一個較好的方法,但是采用靜態(tài)的索引不利于詞庫的擴充,因而詞庫的索引可動態(tài)生成,在讀取詞庫的同時構(gòu)建索引,但是這種方法對于查詢器會產(chǎn)生一個不利影響,因為查詢器也需要讀取詞庫而構(gòu)建索引的過程比較費時間,這樣用戶查詢時會有一定的延時,所以應(yīng)根據(jù)需要采用一種折衷的辦法。
整個切詞過程實際就是在詞表上的查找過程,而詞表相當(dāng)于就是一個查找表,所以這個查找表的組織相當(dāng)關(guān)鍵,它決定切分的速度。所以在這個查找表上必須添加索引來加快速度,本人覺得可以根據(jù)各詞的前兩個漢字的內(nèi)碼建立一個Hash函數(shù)索引,這樣即不需要分組也不需要用二分法來查找,直接定位肯定會減少進行匹配的次數(shù)。但需要解決沖突問題,因為有的詞屬于其他詞的前向子串。
2)、詞條ID分配
詞條ID(WordId)可按入庫的先后順序遞增,不管其內(nèi)碼。但是入庫后應(yīng)該按其內(nèi)碼插入到適當(dāng)?shù)奈恢?。但是在建立倒排檔索引數(shù)據(jù)時應(yīng)該按WordID從小到大排序,這樣對于查詢器可以根據(jù)WordID用Hash函數(shù)直接定位到相應(yīng)的讀取位置。
3)、多字節(jié)轉(zhuǎn)換問題
多字節(jié)轉(zhuǎn)換需要將所有的待切分串都轉(zhuǎn)換成多字節(jié)表示,這個過程相當(dāng)費時,若不需要轉(zhuǎn)換直接切分則會大大提高速度,對于純漢字的字串可以這樣做,但是有中英文混合的字符串就不太適合,因為英文字符只占一個字節(jié)表示,這樣會出現(xiàn)將一個當(dāng)字從中間切開。這樣字符串移位時先判斷其是否是Ansi碼,若是則移一個字節(jié),若不是則移兩個字節(jié)。
4)、歧義識別
5)、新詞識別
新詞的識別,可以按詞頻統(tǒng)計的方法,若某一字串出現(xiàn)的次數(shù)高于某一頻率時可以認為一個詞,將其切分出來。
四、索引器
概述
索引器是搜索引擎系統(tǒng)心須也是很關(guān)鍵的一個環(huán)節(jié),它主要完成將切詞形成的順排檔文檔組織成倒排檔索引數(shù)據(jù)。(索引的合并用拉鏈)
實現(xiàn)原理
1、 索引文件結(jié)構(gòu)
倒排檔索引文件分三個文件保存,一個是存放各詞條索引文件,另一個是各文檔索引文件,再一個就是各詞在文檔中出現(xiàn)的位置信息文件。
1)、順排檔結(jié)構(gòu)
順排檔文檔是以DocID為主序的,每一文檔下存放各自出現(xiàn)的詞的ID及各詞所出現(xiàn)的次數(shù)和具體位置信息,各數(shù)據(jù)項的存儲長度固定。


2)、倒排檔結(jié)構(gòu)

2、 索引數(shù)據(jù)組織
1)、一級索引:一級索引文件屬于記錄式文件,每一記錄大小固定,共有三個數(shù)據(jù)項構(gòu)成,WordID、文檔數(shù)、第一個文檔開始位置。其中WordID是詞典中詞條的ID,文檔數(shù)是指這個詞總共在多少個文檔中出現(xiàn),文檔開始位置是一個文件指針指向二級索引中出現(xiàn)當(dāng)前詞的文檔集中的第一個文檔存儲位置,這個指針是一個長整形值相當(dāng)于指明了是二級索引文件中的第幾條記錄,因為各記錄長度也是固定大小。通過這個指向可以直接定位到二級索引文件讀取位置,然后讀取nDocs個記錄即可,因為它們是存放在連續(xù)的地址空間上。
2)、二級索引:二級索引也是一種記錄式文件,每一記錄有三個數(shù)據(jù)項組成,DocID、出現(xiàn)次數(shù)、第一個Hit位置。其中DocID是文檔的ID,出現(xiàn)次數(shù)指的是當(dāng)前文檔中某一個詞出現(xiàn)的次數(shù),第一個Hit位置也是一個指針,指向Hits文件中的某一位置。通過這個指針就可以直接定位到Hits位置中的讀取位置,這樣連續(xù)讀取nHits個記錄就可以將所有當(dāng)前詞在當(dāng)前文檔中的出現(xiàn)的位置信息都讀入。些文件將屬于同一WordID下的所有文檔記錄按其詞在整個文檔的權(quán)值從大到小排列。
3)、Hits位置信息文件:些文件每一記錄只有一個數(shù)據(jù)項,即Hit位置信息,只記錄了各詞在文檔中出現(xiàn)的位置。將同一詞在同一文檔中的出現(xiàn)位置按出現(xiàn)的先后排列。這樣在讀取文檔并提取摘要時只需對字符串從頭到尾掃描一邊即可,不需要來回掃描。
3、 索引文件導(dǎo)出過程
1)、以文檔為單位處理先將切分結(jié)果處理為順排檔并存入到外部數(shù)據(jù)庫。在此過程中計算各詞的權(quán)值,主要考慮了出現(xiàn)的次數(shù)和出現(xiàn)的位置,若出現(xiàn)在網(wǎng)頁的鏈接文字和title上則其權(quán)值比普通位置高一個數(shù)量級將其設(shè)為0.1,若在其它位置上出現(xiàn),則每出現(xiàn)一次將其權(quán)值加0.01。
2)、將順排檔文件按多種關(guān)鍵字排序,首先按WordID從小到大排序,再按詞的權(quán)值從大到小排序,最后按各詞的出現(xiàn)的先后順序排序。這樣基本形成了倒排檔文件結(jié)構(gòu),再分組統(tǒng)計各詞出現(xiàn)的文檔數(shù)及各文檔中同一詞出現(xiàn)的次數(shù),最后寫到索引文件里即可。(注:這里的權(quán)值是同一詞在同一文檔中所有出現(xiàn)位置的權(quán)值之和)
經(jīng)驗總結(jié)
1、存在的問題

1)、需要借助其它數(shù)據(jù)庫系統(tǒng)來存放順排檔數(shù)據(jù),若是用文件系統(tǒng),則按多關(guān)鍵字進行排序時需要反復(fù)進行文件操作,而且需要文件的歸并。這樣效率不高,且容易出錯。
2)、每處理完一文檔就需要導(dǎo)出順排數(shù)據(jù)。
3)、這里考慮的權(quán)值只是對title和鏈接文字中出現(xiàn)的詞進行了考慮,對于其他一些特殊位置沒有考慮,比如加粗文字、內(nèi)容標(biāo)題等沒有考慮。
4)、數(shù)據(jù)的更新比較麻煩。若是全新更新則簡單,只需要用最新的數(shù)據(jù)替換舊數(shù)據(jù)即可,但是若是增量更新則需要將前后兩次的索引文件進行合并,在全并過程中需要考慮排序問題,且三個文件都要考慮,而且它們是相互關(guān)聯(lián)的,需要修改插入點以后所有的數(shù)據(jù)。若進行數(shù)據(jù)刪除同樣存在這樣的問題,也需要修改插入點以后所有的數(shù)據(jù)。因而不利于數(shù)據(jù)的維護。
2、 改進的地方
1)、若要使用戶的查詢結(jié)果更準(zhǔn)確應(yīng)該在切詞和建索引時考慮其它網(wǎng)頁標(biāo)志上的權(quán)值。
2)、若能將倒排檔索引文件組織成數(shù)據(jù)庫系統(tǒng),由數(shù)據(jù)庫系統(tǒng)來管理會大提高系統(tǒng)的效率并在數(shù)據(jù)維護方面有一定的優(yōu)越性。
3)、對于索引的合并用拉鏈的方法有利于合并的速度
4)、對倒排文檔文件采用數(shù)據(jù)庫的管理方法
五、查詢器
概述
查詢器是搜索引擎系統(tǒng)中最后一個環(huán)節(jié),是最終和用戶打交道的用戶搜索界面。查詢器是通過Web頁接受用戶輸入的搜索參數(shù)并切分用戶輸入的字串,訪問倒排檔索引文件檢索出所有符合檢索條件的文檔,并對其進行并集運算和排序運算,最后得到最終的結(jié)果文檔,再從各文檔中提取摘要信息寫入用戶反饋網(wǎng)頁中。由于在檢索過程中需要讀取索引文件并進行一系列的運算,因而查詢器很難用ASP、PHP、JSP等一些服務(wù)器腳本來實現(xiàn),必須通過CGI程序來完成。采用ISAPI來實現(xiàn)是一種很好的選擇,它是運行在Windows平臺上并配合IIS服務(wù)器,是以DLL的形式發(fā)布,用戶的查詢只需要提交給此DLL處理,處理完后會自動以HTML的形式反饋給用戶。
實現(xiàn)原理
1、 所用的數(shù)據(jù)結(jié)構(gòu)定義
//根據(jù)漢字內(nèi)碼建立的索引結(jié)點
typedef struct CodeIndexNode{
char KeyValue[17];
int nIndex;
}CodeIndex;
以上結(jié)構(gòu)體是定義的內(nèi)碼索引結(jié)點,主要用于在詞表上的二級索引和三級索引。是用在詞庫上的結(jié)構(gòu)體。
//根據(jù)詞語字?jǐn)?shù)建立的一級索引結(jié)點
typedef struct WordsIndexNode{
int nKeyCount;
int nKeyBeginIndex;
int nKeyEndIndex;
int CodeIndexCount;
CArrayHexIndex;
}WordsIndex;
這一結(jié)構(gòu)體是用在詞庫上的一級索引結(jié)點結(jié)構(gòu)體。
//關(guān)鍵字結(jié)點
typedef struct KeyWordNode{
CString strKeyWord; //關(guān)鍵字
int nID; //關(guān)鍵字ID
};
這一結(jié)構(gòu)體是詞表的組織結(jié)點。
/********************************************/
////建立索引的數(shù)據(jù)結(jié)構(gòu)體////
//Hit結(jié)點
typedef struct HitNode{
int nPos;//位置
};
//文檔列表結(jié)點
typedef struct DocListNode{
_int64 nDocID;//DOC ID
int nHits;//詞出現(xiàn)的次數(shù)
float fWeight;//詞在文中的要重
long HitHead;//Hit鏈表頭
int nLen;
// DocListNode* pNext;
};
//倒排文件一級索引結(jié)點
typedef struct LexIconNode{
int nKeyWordID;//關(guān)鍵字ID
int nDocs;//文檔數(shù)
long DocListHead;//文檔鏈表頭
int nWLen;//關(guān)鍵字的長度
};
//在查找字符串中存在的關(guān)鍵字列表
typedef struct ResultKeyNode{
int nLen; //關(guān)鍵字的長度(是寬字符型的)
char KeyWord[20];//關(guān)鍵字
int nDocs; //此關(guān)鍵字出現(xiàn)的文檔數(shù)
};
/********************************************/

/********************************************/
//結(jié)果集合運算時的數(shù)據(jù)結(jié)構(gòu)結(jié)點//
typedef struct PosNode{
int nLen;//長度
int nBegin;//開始位置
PosNode* pNext;//下一指針
};
typedef struct FinalDocNode{
_int64 nDocID;
PosNode* pPosHead;
FinalDocNode* pNext;//下一文檔的位置
};
/********************************************/
2、 檢索過程
查詢器的檢索過各主要如下圖所示:

查詢器接受到用戶輸入的查詢串后,先對些串進行切詞,切出一個個的詞,然后對各詞按其詞的WordID從小到大排序,這樣是為了在讀取一級索引文件時只需要掃描一次文件,讀寫磁頭不需要來回移動。然后讀取一級索引文件和二級索引,檢索出各詞所出現(xiàn)的所有文檔ID及各文檔所對應(yīng)的Hits個數(shù)及開始位置。讀取之后對所有切分出的關(guān)鍵詞所檢索出的文檔結(jié)果進行并集和交集運算,得到最終的結(jié)果集,再根據(jù)各文檔的Hits指針信息讀取得到各個Hit,最后根據(jù)文檔ID讀取文檔內(nèi)容,將根據(jù)Hits信息提取簡單摘要信息寫入網(wǎng)頁反饋給用戶。

經(jīng)驗總結(jié)
1、 存在的問題
1)、詞庫的加載和切詞器一樣,所以還需要解決動態(tài)構(gòu)建詞庫索引,但是這樣會浪費一定的CPU時間,對用戶的查詢不利。
2)、每個用戶查詢一次就需要加載一次詞庫這對多用戶查詢是不利的。
3)、查詢結(jié)果的分頁顯示問題,分布顯示基本可以,但是若查詢出的結(jié)果過多,會導(dǎo)致內(nèi)存不足及響應(yīng)慢問題,因而需要解決緩沖區(qū)和分頁調(diào)入策略。
4)、摘要的提取不夠正確,有時將一個詞從中間截斷。
5)、進行并、交集運算的算法不夠好,有待改進。另外進行并交運算是對所有的結(jié)果文檔都進行了并交運算,若查得的結(jié)果文檔過多時會導(dǎo)致內(nèi)存不足和響應(yīng)時間過長問題。并沒有考慮將關(guān)鍵字出現(xiàn)比較全的文檔的提前。
2、 改進
1)、若能解決詞表的Hash函數(shù)索引,則能大加快訪問速度。
2)、若多用戶共享一個詞表則也會節(jié)省一些時間。
3)、檢索文檔時若滿足條件的文檔過多,可分塊讀入,只有用戶移動頁數(shù)到達所需要調(diào)入的文檔時才去讀取文檔信息,否則不進行讀取。
4)、應(yīng)該對查詢結(jié)果按其關(guān)鍵字出現(xiàn)的個數(shù)進行排序,這樣多個關(guān)鍵字同時出現(xiàn)的頁面將會先顯示。
六、系統(tǒng)關(guān)鍵分析
搜索引擎是一個復(fù)雜的綜合系統(tǒng),各個子系統(tǒng)之間是相互協(xié)調(diào),緊密相關(guān)。所以在設(shè)計時需要全面考慮,任何一個環(huán)節(jié)的效率都會影響到整個系統(tǒng)的效率。本人認為主要有如下幾個關(guān)鍵的方面:
1、 蜘蛛的抓取速度
搜索引擎系統(tǒng)需要抓取上億的網(wǎng)頁,因而速度很關(guān)鍵,它影響到整個數(shù)據(jù)的更新周期。在此過程中應(yīng)該設(shè)計分布式的蜘蛛程序,并將抓取工作、超鏈分析及內(nèi)容分析幾個串行工作任務(wù)設(shè)計成并行任務(wù)。
2、 文檔的壓縮
目前本人采用了文本文件來保存各文檔,一個文檔一個文本文件。這種方法在數(shù)據(jù)量很大的情況下會有一些不足,因為在得到文檔的文件名后,在文件下查找文件的過程就會耗去一定的時間,并且不利于管理。因而可以采用一種比較簡單且解壓過程比較快速的壓縮算法,將所有的文檔壓縮到一個文檔數(shù)據(jù)文件里,并在這個壓縮文件上建立一個索引文件,這個索引文件的各個記錄大小固定(其結(jié)構(gòu)可見下圖)。其有三個數(shù)據(jù)項組成,即DocID、開始位置、長度。而索引文件是按文檔ID從小到大排序,這樣給定一個DocID后可以用Hash函數(shù)直接定位到索引文件中具體文檔的信息,得到其開始位置和長度后就可以從壓縮文檔中讀取相應(yīng)的文檔。然后再解壓后進行摘要的摘取。這樣通過這個索引文件可以方便地實現(xiàn)對文檔的維護和管理。


3、 切詞的速度
切詞器的切詞速度也關(guān)鍵,當(dāng)蜘蛛抓取完數(shù)據(jù)后,就由分詞器進行切詞。速度不夠快同樣影響數(shù)據(jù)的更新周期,可將切詞器與蜘蛛一起并行運行,蜘蛛每抓取完一個頁后將其放入切詞緩沖區(qū)中,切詞器循環(huán)檢查緩沖區(qū),若有數(shù)據(jù)則鄧出一個進行切詞處理直到蜘蛛抓取完且緩沖中沒有數(shù)據(jù)為止。這個緩沖中直放入待切分的DocID,這樣切詞器得DocID后去訪問文檔索引,并讀取文檔進行解壓后再進行切詞。
4、 網(wǎng)頁的權(quán)值運算問題
切詞器在切詞過程中就應(yīng)該考慮權(quán)值問題,應(yīng)該定義一套權(quán)值規(guī)范,定義各種超標(biāo)志中間出現(xiàn)的詞應(yīng)該采用什么樣的權(quán)值函數(shù)。這樣切分結(jié)果本身就有了權(quán)值,索引器就可以根據(jù)權(quán)值建立更加合理的倒排索引文件。這直接影響到用戶的查詢結(jié)果。

5、 查詢器的分頁機制
一個實用的搜索引擎有上億的文檔,因而同時出現(xiàn)一個詞的文檔數(shù)也會多達上萬,這樣查詢器在查詢時不可能一次性將所有的文檔都處理一次,只能采用分頁調(diào)入或其他策略來解決這一問題。因為有時的查詢結(jié)果有上千萬條結(jié)果,這樣不可能對所的結(jié)果文檔都進行并、交運算。
6、 系統(tǒng)之間的自動協(xié)調(diào)
搜索引擎系統(tǒng)的各個部分是相互協(xié)調(diào)來工作的,因而若有實現(xiàn)自動工作,需要有一個調(diào)度控制程序來調(diào)度。另外各個部分也需要提供一個供調(diào)度器調(diào)用的接口,這樣調(diào)度器就可以調(diào)用接口控制其工作。但是蜘蛛程序、切詞器等屬于長任務(wù)作業(yè),我們并不能保證在其運行周期內(nèi)不會出錯,所以各系統(tǒng)還需要有一個故障檢測、任務(wù)重啟動功能,這樣才能保證各系統(tǒng)在無人監(jiān)管的情況下自動運行。
七、參考文獻
[1] Google搜索引擎技術(shù)實現(xiàn)探究 化柏林 中國科學(xué)技術(shù)信息研究所
[2] 漢語分詞在中文軟件中的廣泛應(yīng)用 李東 張湘輝 微軟中國研究開發(fā)中心

 



發(fā)表評論:


     
"); //-->
?2006 Baidu

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多