今天仔细研究了一下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图如下:
对应前面一篇文章就可以再仔细研究Nutch其他结构就可以大概知道如何在Nutch中加入中文的分词方法了,从分析中我们可以看出来,Nutch的分词大量使用了Lucene的基本抽象类或接口,这也是与两个项目的主持人同为
Doug Cutting分不开的,当然了Lucene的良好架构也奠定了各种应用对其扩展使用的基础。
本文依据《创作共用约定》之“署名
-禁止派生
-非商业用途”方式发布,即你可以免费拷贝、分发、呈现和表演当前作品,但是必须基于以下条款:
对于任何二次使用或分发,你必须让其他人明确当前作品的授权条款。
在得到作者的明确允许下,这里的某些条款可以放弃。