??? 今天仔細研究了一下Nutch的org.apache.nutch.anlysis包,其中大多的類都是與Nutch在爬行網(wǎng)頁時候?qū)W(wǎng)頁中的文本分詞解析相關的。Nutch解析文本類的架構得非常好,下面就讓我們來研究下它的架構吧,了解清楚之后就可以為我們之后加入中文分詞打下很好的基礎。
??? Nutch分詞的最底層使用的是lucene的Analyzer抽象類,它位于org.apache.lucene.analysis包中,NutchAnalyzer繼承了Analyzer類、實現(xiàn)了Configurable、Pluggable接口,該抽象類中定義了一個公有的抽象方法tokenStream(String fieldName, Reader reader)返回的類型是TokenStream。該方法是用于分析文本,其后的具體類中在這個方法中實現(xiàn)了從文本中提取索引詞組的策略、算法。而返回的TokenStream類是即可以從文本或者從查詢詞組中枚舉token序列的抽象類,在Lucene中繼承了它的具體類有Tokenizer、TokenFilter。
??? NutchAnalyzer類是Nutch中擴展分析文本的擴展點,所有用于解析文本的插件都得實現(xiàn)這個擴展點。
對于Analyzer一個典型的擴展就是首先建立一個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),該類構建了一個n-grams的分詞方案,因為需要在索引中考慮詞組的出現(xiàn)頻率,并且實現(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圖如下:

??? 對應前面一篇文章就可以再仔細研究Nutch其他結構就可以大概知道如何在Nutch中加入中文的分詞方法了,從分析中我們可以看出來,Nutch的分詞大量使用了Lucene的基本抽象類或接口,這也是與兩個項目的主持人同為Doug Cutting分不開的,當然了Lucene的良好架構也奠定了各種應用對其擴展使用的基礎。
??? 本文依據(jù)《創(chuàng)作共用約定》之“署名-禁止派生-非商業(yè)用途”方式發(fā)布,即你可以免費拷貝、分發(fā)、呈現(xiàn)和表演當前作品,但是必須基于以下條款:
??? Nutch分詞的最底層使用的是lucene的Analyzer抽象類,它位于org.apache.lucene.analysis包中,NutchAnalyzer繼承了Analyzer類、實現(xiàn)了Configurable、Pluggable接口,該抽象類中定義了一個公有的抽象方法tokenStream(String fieldName, Reader reader)返回的類型是TokenStream。該方法是用于分析文本,其后的具體類中在這個方法中實現(xiàn)了從文本中提取索引詞組的策略、算法。而返回的TokenStream類是即可以從文本或者從查詢詞組中枚舉token序列的抽象類,在Lucene中繼承了它的具體類有Tokenizer、TokenFilter。
??? NutchAnalyzer類是Nutch中擴展分析文本的擴展點,所有用于解析文本的插件都得實現(xiàn)這個擴展點。
對于Analyzer一個典型的擴展就是首先建立一個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),該類構建了一個n-grams的分詞方案,因為需要在索引中考慮詞組的出現(xiàn)頻率,并且實現(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圖如下:
??? 對應前面一篇文章就可以再仔細研究Nutch其他結構就可以大概知道如何在Nutch中加入中文的分詞方法了,從分析中我們可以看出來,Nutch的分詞大量使用了Lucene的基本抽象類或接口,這也是與兩個項目的主持人同為Doug Cutting分不開的,當然了Lucene的良好架構也奠定了各種應用對其擴展使用的基礎。
??? 本文依據(jù)《創(chuàng)作共用約定》之“署名-禁止派生-非商業(yè)用途”方式發(fā)布,即你可以免費拷貝、分發(fā)、呈現(xiàn)和表演當前作品,但是必須基于以下條款:
署名:你必須明確標明作者的名字。
非商業(yè)用途:你不可將當前作品用于商業(yè)目的。
禁止派生:你不可更改、轉變或者基于此作品重新構造為新作品。
對于任何二次使用或分發(fā),你必須讓其他人明確當前作品的授權條款。
在得到作者的明確允許下,這里的某些條款可以放棄。