【正文】
P r o d u c e11 M a n a g e b y1 1 圖 索引建立 子 系統(tǒng)部分領(lǐng)域模型 系統(tǒng) 概要 設(shè)計(jì) 在需求分析階段, 產(chǎn)生的用例模型和領(lǐng)域模型帶入設(shè)計(jì)階段,現(xiàn)在可以大概設(shè)計(jì)系統(tǒng)的構(gòu)架,如圖 所示。在熟悉了搜索引擎建立的過(guò)程后,可以對(duì)其架構(gòu)進(jìn)行設(shè)計(jì),可以在流程中看出資源文件就像是一批材料,索引建立 子 系統(tǒng)就像是工廠,將材料加工輸出成品,所以可以將該流程設(shè)計(jì)成流水線形式,可以將資 源路徑作為流水線上的材料,疵品被剔除掉,經(jīng)過(guò)流水線的一系列操作后,索引最后輸出。 在實(shí)體設(shè)計(jì)的上層是 Entity,它繼承自 Object 類,是所有實(shí)體的父類 。 ① 基于分裝器的網(wǎng)頁(yè)文本信息抽取技術(shù),該方法屬于傳統(tǒng)的網(wǎng)頁(yè)信息抽取方法。該方法對(duì)網(wǎng)頁(yè)正文信息的抽取依賴閾值 P 和 T,閾值 P 決定了選擇網(wǎng)頁(yè)正 文的文本塊。在現(xiàn)今比較流行的開(kāi)源項(xiàng)目中, HtmlParser 是基于分裝器的技術(shù),而基于統(tǒng)計(jì)的技術(shù)要自己來(lái)分析設(shè)計(jì)一種算法。 + e x t r a c t ( ) t a r g e t F i l e P a t h : s t r i n gE x t r a c t o r+ e x t r a c t ( ) t a r g e t F i l e P a t h . . .H t m l E x t r a c t o r+ e x t r a c t ( ) t a r g e t F i l e P a t h . . .H t m l E x t r a c t o r F o r M o v i e+ e x t r a c t ( ) t a r g e t F i l e P a t h . . .H t m l E x t r a c t o r F o r P a g e+ e x t r a c t ( ) t a r g e t F i l e P a t h . . .H t m l E x t r a c t o r F o r I m a g e 圖 抽取器 之間 關(guān)系圖 (3) 中文 正文抽取算法設(shè) 計(jì) 對(duì)于影視和圖片的抽取利用基于分裝器的方法, 只要目標(biāo)網(wǎng)頁(yè)結(jié)構(gòu)比較穩(wěn)定,并對(duì)目標(biāo)網(wǎng)頁(yè)進(jìn)行分析, 就很容易利用 HtmlParser 進(jìn)行內(nèi)容抽取。 其實(shí)這種方法總結(jié)起來(lái)就有兩個(gè)條件:內(nèi)容塊長(zhǎng)度相對(duì)較大并且除去這個(gè)內(nèi)容塊剩下的內(nèi)容塊長(zhǎng)度波動(dòng)相對(duì)較小。 在 Document 設(shè)計(jì)過(guò)程中使用 Factory 模式, DocumentFactory 可以根據(jù)對(duì)象進(jìn)行識(shí)別然后建立對(duì)應(yīng)的 Document。 提到分詞,尤其是中文分詞,是建立索引的重點(diǎn),也是難點(diǎn),因?yàn)橹形氖鞘澜缟献顝?fù)雜的語(yǔ)言之一,想對(duì)中文進(jìn)行完全精確的分詞,能夠正確的表達(dá)其內(nèi)在的含義,幾乎是不可能的。它是基于詞典分詞技術(shù)。 基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建 –16– + a d d E n t i t y ( ) i n d e x W r i t e rI n d e x B u i l d e r+ a d d E n t i t y ( ) . . .J E I n d e x B u i l d e r+ a d d E n t i t y ( ) . . .I C T _ I n d e x B u i l d e r+ a d d E n t i t y ( ) . . .S t a n d a r d I n d e x B u i l d e r 圖 索引建造器 之間 關(guān)系圖 (5) 處理器設(shè)計(jì) 處理器設(shè)計(jì)的目的是讓它完成像工廠流水線的功能,它的任務(wù)就是要將各種部件組合起來(lái),形成流水線,此過(guò)程可以是執(zhí)行的或是執(zhí)行一次 。參考著名的搜索引擎如百度、谷歌和雅虎等,可以將首頁(yè)設(shè)計(jì)成 如圖 所示。 當(dāng)然這種方法實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,對(duì)于本項(xiàng)目比較適合。將得到的 文件放入 reports 中,最后返回 reports。//遞歸調(diào)用 crawFile 方法 else (files[i].getAbsolutePath())。它的作用是過(guò)濾無(wú)價(jià)值文件 。 public boolean containsTag(Tag tag, String path) 過(guò)程描述: filtrateUnvaluedFile 方法是抽象的,沒(méi)有實(shí)現(xiàn)。 其中 NodeFilterFactor 是自己定義的節(jié)點(diǎn)過(guò)濾器工廠,它可以產(chǎn)生指定的節(jié)點(diǎn)過(guò)濾器。 最后返回 valuableReports 對(duì)象,此過(guò)程中用到了 isValuable 方法,以下是對(duì) isValuable方法的描述: 基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建 –21– isValuable 主要的功能是檢驗(yàn) Html 文件是否包含某些標(biāo)記, 它是結(jié)合實(shí)體 xml 配置文件進(jìn)行檢驗(yàn)的,比如影視實(shí)體的配置文件如下所示: movie tag key=pic type=div attribute type=classmain_home_movie_pics/attribute /tag …… /movie 其中可以很清楚的看到對(duì) tag 的描述,比如上例中, Html 文件應(yīng)該包含 div class=” main_home_movie_pics”/div標(biāo)記 , 可以通過(guò) EntityExtractorAssistant 的 實(shí)例 ass 抽取信息, EntityExtractorAssistant是基于 Dom4J 的 xml 解析器 。 ② 基于統(tǒng)計(jì)的抽取器基本實(shí)現(xiàn) 抽取器的實(shí)現(xiàn)部分主要集中在篩選算法上,其利用了標(biāo)準(zhǔn)方差的計(jì)算方法,實(shí)現(xiàn)過(guò)程如下: int sum = 0。 i len。 // 計(jì)算方差 double err = 。 val *= val。 最后關(guān)閉 IndexWriter 實(shí)例 ,結(jié)束添加實(shí)體。 用戶接口 子 系統(tǒng) (1) 搜索器基本實(shí)現(xiàn) 搜索器的實(shí)現(xiàn)需要有 Lucene 技術(shù)的支持。 這樣會(huì)返回更符合用戶要求的信息,但也會(huì)帶來(lái)效率問(wèn)題。 (2) 在分詞模塊 , 使用 中科院 分詞器 、 JE 和 StandardAnalyzer 分析器 ,實(shí)現(xiàn)了的中文分詞,能夠更有效的索引于 網(wǎng)頁(yè)、影視及圖片 相關(guān)的信息。而且由于系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)都采用了面向?qū)ο蟮姆椒ǎ谙到y(tǒng)的可繼承性和重用性方面都有利于將來(lái)的完善和改進(jìn)。 首先,衷心感謝我的導(dǎo)師 趙晶瑩 老師。 最后要感謝我的 父母 ,是他們?cè)谖疑砗笠恢敝С治?,給我愛(ài)與關(guān)懷,在我遇到困難的時(shí)候鼓勵(lì)我,在我有收獲時(shí)為我高興。 趙 老師熱情的為人、嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度 以及 強(qiáng)烈的責(zé)任心,都是我學(xué)習(xí)的楷模,對(duì)于我的學(xué)習(xí)和將來(lái)的工作生 活都將是一筆寶貴的財(cái)富。因此,還 需要 進(jìn)行深入的研究,以提高整個(gè)系統(tǒng)的性能。 (4) 開(kāi)發(fā)了 基于 Ajax 技術(shù)的用戶接口子系統(tǒng),有效、快捷的完成搜索任務(wù) 。 基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建 –24– 結(jié) 論 基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建,此課題的設(shè)計(jì)開(kāi)發(fā)終于完成,在此過(guò)程中,遇到了困難,也收獲了新知 。其實(shí)在這個(gè)過(guò)程中對(duì)分詞器的選取應(yīng)用了三個(gè)分詞器 JE, ICTCLAS 和StandardAnalyzer,三個(gè)分詞器原理已經(jīng)在設(shè)計(jì)中提到, 因?yàn)樵跇?gòu)造索引用到的分詞器和對(duì)輸入的詞進(jìn)行切分的分詞器是一個(gè),必須相同。 hasExist 方法主要是判斷索引中是否含有了實(shí)體信 息, 其中 以 Entity 中的屬性keyAttribute 為關(guān)鍵值檢查。 } // 計(jì)算標(biāo)準(zhǔn)方差 return (err) / ( * (double) num)。 i len。 基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建 –22– sum += sizeBlock[i]。 int len = 。 (3) Extractor 抽取器基本實(shí)現(xiàn) ① 基于分裝器的抽取器基本實(shí)現(xiàn) 以 HtmlExtractorForMovie 為例描述一下這類抽取器的基本實(shí)現(xiàn) ,如下: 基于分裝器的抽取器主要的工作在于如何利用分裝器將某些標(biāo)記下的內(nèi)容提取出來(lái),比如說(shuō) div class=” main_home_movie_pics”/div標(biāo)記下有需要的內(nèi)容。 ③ HtmlFileFilterForMovie 類基本實(shí)現(xiàn) 該類 繼承自 HtmlFileFilter 類 。 containsTag 方法實(shí)現(xiàn)的主要原理 : 首先實(shí)例化 對(duì)象 parser,Parser 是分裝器, 可以解析 Html 文件。 ② HtmlFileFilter 類基本實(shí)現(xiàn) HtmlFileFilter 類也是一個(gè)抽象類,繼承自 FileFilter 類。 在這里只描述部分類實(shí)現(xiàn),如下: ① FileFiler 類基本實(shí)現(xiàn) 主要方法: public abstract FileResultSet filtrateUnvaluedFile(FileResultSet source)。 i 。 基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建 –18– 4 系統(tǒng)的實(shí)現(xiàn) 系統(tǒng)包框架的構(gòu)建 索引建立子系統(tǒng) SoBa_SearchEngineCore1_0 是 SoBa 搜索引擎的核心主要是 資源整理,索引建立,日志建立等工作,源文件包結(jié)構(gòu)及說(shuō)明如下: 包 存放類構(gòu)造類,作用是可以利用類路徑構(gòu)造實(shí)例 ; 包存放 配置文件操作類包 ; 包存放 Document 制造工廠 ; 包存放 實(shí)體類 ; 包存放 實(shí)體集類 ; 包存 放 抽取器類; 包存放 抽取器實(shí)現(xiàn)類 ; 包存 放節(jié)點(diǎn)過(guò)濾器實(shí)現(xiàn)類 ; 存放文件有關(guān)的操作,主要是文件爬蟲(chóng)和文件路徑結(jié)果集 類 ; 存放文件過(guò)濾器的實(shí)現(xiàn)類 ; 存放文件過(guò)濾類; 存放為影視服務(wù)的類; 存放為網(wǎng)頁(yè)服務(wù)的類; 存放幫助類; 存放圖片處理類,主要是圖片拷貝類; 存放與索引有關(guān)的類,主要是索引構(gòu)造器; 存放索引構(gòu)造器的實(shí)現(xiàn)類; 存放日志操作類; 存放處理器類; 存放 利用 ICTCLAS 對(duì)實(shí)體進(jìn)行分詞的類; 存放正文抽取算法類; 存放對(duì) xml 操作類; 存放對(duì)于 ICTCLAS 分詞器類; config 存放配置文件 ; data 存放 ICTCLAS 分詞所用的數(shù)據(jù)文件; 基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建 –19– entities 存放實(shí)體 xml 配置文件 ; log 存放日志文件; config、 data、 entities 和 log 文件夾 與 src 源文件夾是同一級(jí),在工程根目錄下。在得到搜索結(jié)果后,通常,結(jié)果的數(shù)量眾多,無(wú) 法在一個(gè)頁(yè)面內(nèi)顯示。它們之間的關(guān)系圖如圖 所示。 在本項(xiàng)目中 ,將三者都整合了進(jìn)來(lái)。 現(xiàn)在比較流行的分詞方式有單字分詞、二分法和基于詞典三種,其中單字 就是將中文文本分詞時(shí),以字為單位進(jìn)行切分,但是這種方法需要復(fù)雜的單字匹配算法,以及大量 的 CPU 運(yùn)算 ;二分法就是將每?jī)蓚€(gè)字當(dāng)作一個(gè)詞語(yǔ)進(jìn)行切分,然后建立索引,這種方式會(huì)產(chǎn)生一些無(wú)詞義的詞條,這樣就會(huì)浪費(fèi)當(dāng)量的索引空間;基于詞典的分詞是通過(guò)構(gòu)造一個(gè)常用詞詞典來(lái)對(duì)所遇到的文本進(jìn)行詞語(yǔ)的 切分。 一個(gè)標(biāo)準(zhǔn)的分析器由兩部分組成一部分時(shí)分詞器,另一部分是過(guò)濾器。 (4) 索引建造器設(shè)計(jì) 這里要基于 Lucene 檢索工具 包的支持, Lucene 提供了 從索引建立到搜索的一系列工具 ,這可以使開(kāi)發(fā)者方便的開(kāi)發(fā)一個(gè)索引建立及搜索的框架 。在用輸入流讀取文件的時(shí)候,將開(kāi)始標(biāo)記放入棧中,繼續(xù)讀取數(shù)據(jù),直到對(duì)應(yīng)的結(jié)束標(biāo)記出現(xiàn),這個(gè)基于 Lucene 與 Heritrix 的搜索引擎構(gòu)建 –15– 就是一個(gè)內(nèi)容塊,將其放入樹(shù)節(jié)點(diǎn)中,這樣就可以很方便的將 Html 文件構(gòu)造成一樹(shù)結(jié)構(gòu)。 在 抽取器 設(shè)計(jì)中 , 影視和圖片的抽取器基于 分裝器技術(shù),而網(wǎng)頁(yè)抽取器是基于統(tǒng)計(jì)技術(shù) ,出于這樣的考慮是因?yàn)橛耙暫蛨D片在網(wǎng)頁(yè)中的結(jié)構(gòu)比較固定,比如說(shuō)圖片,一般都封裝在 img 標(biāo)記中,這樣利用分裝器很容易就可以抽取出來(lái),而對(duì)于網(wǎng)頁(yè)的抽取就不那么容易了,大量的網(wǎng)站中的網(wǎng)頁(yè)結(jié)構(gòu)不是相同的,存在很大的差異, 不適合利用分裝器抽取,所以選取了更為便捷的方式,基于統(tǒng)計(jì)的抽取技術(shù)。但仍然有一些普遍性問(wèn)題有待進(jìn)一步改善。分裝器(也稱為:包裝器)是一個(gè)程序,它根據(jù)一定的信息模式識(shí)別知識(shí)從特定的信息源中抽取相關(guān)內(nèi)容,并以特定形式加以表示。 實(shí)體關(guān)系圖如圖 所示。 系統(tǒng) 詳細(xì) 設(shè)計(jì) 在框架設(shè)計(jì)中,簡(jiǎn)要的設(shè)計(jì)出來(lái)了各個(gè)子系統(tǒng)的整體流程,下面則是對(duì) 索引建 立 子系統(tǒng)和 用戶接口