??? 今天仔細研究了一下Nutch的org.apache.nutch.anlysis包,其中大多的類都是與Nutch在爬行網頁時候對網頁中的文本分詞解析相關的。Nutch解析文本類的架構得非常好,下面就讓我們來研究下它的架構吧,了解清楚之后就可以為我們之后加入中文分詞打下很好的基礎。
??? Nutch分詞的最底層使用的是lucene的Analyzer抽象類,它位于org.apache.lucene.analysis包中,NutchAnalyzer繼承了Analyzer類、實現了Configurable、Pluggable接口,該抽象類中定義了一個公有的抽象方法tokenStream(String fieldName, Reader reader)返回的類型是TokenStream。該方法是用于分析文本,其后的具體類中在這個方法中實現了從文本中提取索引詞組的策略、算法。而返回的TokenStream類是即可以從文本或者從查詢詞組中枚舉token序列的抽象類,在Lucene中繼承了它的具體類有Tokenizer、TokenFilter。
??? NutchAnalyzer類是Nutch中擴展分析文本的擴展點,所有用于解析文本的插件都得實現這個擴展點。
對于Analyzer一個典型的擴展就是首先建立一個Tokenizer(org.apache.lucene.analysis.Tokenizer),它是用于將Reader中讀入的Stream分解成最原始的詞組(Token---org.apache.lucene.analysis.Token),在Tokenzier分解Stream之后,一個或多個TokenFilter會用于過濾這些詞組中無意義的詞組。
??? NutchDocumentAnalyzer類繼承了NutchAnalyzer,其中有三個靜態私有內部類ContentAnalyzer、AnchorFilter、AnchorAnalyzer 它們分別繼承了Analyzer(org.apache.lucene.analysis.Analyzer)、 TokenFilter(org.apache.lucene.analysis.TokenFilter)、Analyzer(org.apache.lucene.analysis.Analyzer)。在ContentAnalyzer中調用了CommonGrams類(org.apache.nutch.analysis),該類構建了一個n-grams的分詞方案,因為需要在索引中考慮詞組的出現頻率,并且實現了對n-grams方案詞組查詢的優化措施。在n-grams方案中單個的詞組同樣會被該方案索引,索引期間大量使用了Token(org.apache.lucene.analysis.Token)的各種方法,并且還會調用nutch/conf/nutch-default.xml中analysis.common.terms.file的配置屬性。
??? 其上各個類與接口的uml圖如下:
類圖.JPG
??? 對應前面一篇文章就可以再仔細研究Nutch其他結構就可以大概知道如何在Nutch中加入中文的分詞方法了,從分析中我們可以看出來,Nutch的分詞大量使用了Lucene的基本抽象類或接口,這也是與兩個項目的主持人同為Doug Cutting分不開的,當然了Lucene的良好架構也奠定了各種應用對其擴展使用的基礎。






??? 本文依據《創作共用約定》之“署名-禁止派生-非商業用途”方式發布,即你可以免費拷貝、分發、呈現和表演當前作品,但是必須基于以下條款:
  • 署名:你必須明確標明作者的名字。

  • 非商業用途:你不可將當前作品用于商業目的。

  • 禁止派生:你不可更改、轉變或者基于此作品重新構造為新作品。

對于任何二次使用或分發,你必須讓其他人明確當前作品的授權條款。

在得到作者的明確允許下,這里的某些條款可以放棄。