??? 今天仔細(xì)研究了一下Nutch的org.apache.nutch.anlysis包,其中大多的類都是與Nutch在爬行網(wǎng)頁時候?qū)W(wǎng)頁中的文本分詞解析相關(guān)的。Nutch解析文本類的架構(gòu)得非常好,下面就讓我們來研究下它的架構(gòu)吧,了解清楚之后就可以為我們之后加入中文分詞打下很好的基礎(chǔ)。
??? Nutch分詞的最底層使用的是lucene的Analyzer抽象類,它位于org.apache.lucene.analysis包中,NutchAnalyzer繼承了Analyzer類、實(shí)現(xiàn)了Configurable、Pluggable接口,該抽象類中定義了一個公有的抽象方法tokenStream(String fieldName, Reader reader)返回的類型是TokenStream。該方法是用于分析文本,其后的具體類中在這個方法中實(shí)現(xiàn)了從文本中提取索引詞組的策略、算法。而返回的TokenStream類是即可以從文本或者從查詢詞組中枚舉token序列的抽象類,在Lucene中繼承了它的具體類有Tokenizer、TokenFilter。
??? NutchAnalyzer類是Nutch中擴(kuò)展分析文本的擴(kuò)展點(diǎn),所有用于解析文本的插件都得實(shí)現(xiàn)這個擴(kuò)展點(diǎn)。
對于Analyzer一個典型的擴(kuò)展就是首先建立一個Tokenizer(org.apache.lucene.analysis.Tokenizer),它是用于將Reader中讀入的Stream分解成最原始的詞組(Token---org.apache.lucene.analysis.Token),在Tokenzier分解Stream之后,一個或多個TokenFilter會用于過濾這些詞組中無意義的詞組。
??? NutchDocumentAnalyzer類繼承了NutchAnalyzer,其中有三個靜態(tài)私有內(nèi)部類ContentAnalyzer、AnchorFilter、AnchorAnalyzer 它們分別繼承了Analyzer(
org.apache.lucene.analysis.Analyzer)、 TokenFilter(
org.apache.lucene.analysis.TokenFilter)、Analyzer(
org.apache.lucene.analysis.Analyzer)。在ContentAnalyzer中調(diào)用了CommonGrams類(org.apache.nutch.analysis),該類構(gòu)建了一個n-grams的分詞方案,因?yàn)樾枰谒饕锌紤]詞組的出現(xiàn)頻率,并且實(shí)現(xiàn)了對n-grams方案詞組查詢的優(yōu)化措施。在n-grams方案中單個的詞組同樣會被該方案索引,索引期間大量使用了Token(
org.apache.lucene.analysis.Token)的各種方法,并且還會調(diào)用nutch/conf/nutch-default.xml中analysis.common.terms.file的配置屬性。
??? 其上各個類與接口的uml圖如下:

??? 對應(yīng)前面一篇文章就可以再仔細(xì)研究Nutch其他結(jié)構(gòu)就可以大概知道如何在Nutch中加入中文的分詞方法了,從分析中我們可以看出來,Nutch的分詞大量使用了Lucene的基本抽象類或接口,這也是與兩個項(xiàng)目的主持人同為
Doug Cutting分不開的,當(dāng)然了Lucene的良好架構(gòu)也奠定了各種應(yīng)用對其擴(kuò)展使用的基礎(chǔ)。
??? 本文依據(jù)《創(chuàng)作共用約定》之“署名
-禁止派生
-非商業(yè)用途”方式發(fā)布,即你可以免費(fèi)拷貝、分發(fā)、呈現(xiàn)和表演當(dāng)前作品,但是必須基于以下條款:
對于任何二次使用或分發(fā),你必須讓其他人明確當(dāng)前作品的授權(quán)條款。
在得到作者的明確允許下,這里的某些條款可以放棄。