为nutch 添加中文分词插件

    技术2022-05-11  84

    1.nutch中文分词

    Nutch对中文查询时默认采用的分词器为NutchAnalyzer,对中文默认采用单字切分.这种效果不是很理想,我们可以自定义切词器,以实现对中文支持.

    可以采用的两种方式添加对中文的支持.

    1.       直接修改nutch的系统代码,对默认的分词器代码进行修改

    使其使用自定义中文分词程序.

    2.       采用插件的方式,不修改系统代码的基础上,编写中文分词插件实现对中文

    分词的支持。类似我们在nutch的系统中看到的关于法语和德语解析的插件

    进行分词解析。

    通过修改代码的方式实现对中文的支持,可以看到很多文章介绍.常见的方式类似

    这里.

    而在nutch的系统设计中,采用插件的方式,可以在不修改系统代码的基础上即可实现

    多语言支持功能.我们只需要编写对应的插件部署在系统下即可.

    2.实现中文分词插件步骤

       2.1 插件流程

           当我们对一个插件进行解析时,首先会根据文档内容获取对应的分词解析器.

           这里我们可能有疑问,根据文档内容如何获取对应的分词解析器.这里用到

           另一个插件languageidentifier 语言标示插件,可以通过这个插件获取当前文

           档所属的语言,在每个文档上会添加一个lang的属性.

           NutchAnalyzer analyzer = factory.get(doc.get("lang"));

           Factory AnalyzerFactory会根据不同的语言获取切词器而这里的lang属性则通过 

           Languageidentifier

           我们可能会产生另一个问题,Languageidentifier如何知道当前文档语言类别呢?

           在这里我们首先查看下

           src/plugin/languageidentifier 文件结构   

          

           我们可以看到有很多ngp为扩展名的文件,插件正是通过这些ngp文件来判断文档的语言类型对于中文的我生成的文件为zh.ngp这个文件名代表是解析中文文档使用的ngp关于对应的语言产生的文件信息。可以通过langmappings.properties中定义的信息,可以扩展更多国家的语言支持.ngp文件的生成,可以参看这里.有比较详细的介绍.

    2.2    建立插件类 

    我们在这里建立的插件类,很简单。调用的分词器直接用lucene2.0中的CJKAnalyer

    具体代码如下.

      

    package org.apache.nutch.analysis.zh; // JDK importsimport java.io.Reader; // Lucene importsimport org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.TokenStream; // Nutch importsimport org.apache.nutch.analysis.NutchAnalyzer;  /** * A simple Chinese Analyzer that wraps the Lucene one. * @author sy zhang */public class CJKAnalyzer extends NutchAnalyzer {        private final static Analyzer ANALYZER =                       new org.apache.lucene.analysis.cjk.CJKAnalyzer();         /** Creates a new instance of CJKAnalyzer */    public CJKAnalyzer() { }      public TokenStream tokenStream(String fieldName, Reader reader) {        return ANALYZER.tokenStream(fieldName, reader);    }    /*     * it's only for test     */    public static void main(String[] args) throws Exception  {      Analyzer analyzer = new CJKAnalyzer();      String fieldName ="test";      String test="这是一个简单测试this is a cjk test";      char[] testArray =test.toCharArray();      java.io.Reader r = new java.io.CharArrayReader(testArray);          TokenStream t = analyzer.tokenStream(fieldName, r);            org.apache.lucene.analysis.Token token =null;      try      {      token = t.next();      }      catch(Exception ex)      {              }      while(token!=null)      {         System.out.println(token.termText());         try         {         token = t.next();         }         catch(Exception ex)         {                     }      }     r.close();              }}

    2.3    建立插件配置信息

    我们需要建立一个插件信息xml文件默认为plugin.xml。在这里定义了插件名称,位置

    调用中需要一些类信息等.具体信息如下:

     

    < property >    < name > plugin.includes </ name >    < value > ...|analysis-(zh)|... </ value >   ... </ property >

     

    2.4    插件使用

    1.       我们通过在源码系统目录下的build.xml差生一个analysis-zh文件夹其中包含analysis-zh.jarplugin.xml文件.在部署的时将此复制到plugin目录下即可。这样我们的插件系统开发基本完成.如下图.

         

    2.       在使用过程中和其他插件方式类似

    我们需要修改nutch-site.xml下的plugin.includes如下

    可以在这里添加其他语言类插件.

    3.       小结

    关于此插件的实现是一个非常简单的中文插件实现的例子.基本上参看法语和德语解析的例子.写的代码也非常少,当然如果对中文分词很好的支持,我们需要定义算法更好一些的分词解析程序。基本的流程还是一样。

    感觉nutch的插件系统设计还是比较灵活,我们不用关心系统内核实现,只需要实现我们需要的功能配置到系统中即可.

    源文件下载

    这个按现在nutch系统的目录结构编写,看能否提交到nutch的plugin中,还不知道怎么提交上去。知道的朋友帮介绍下步骤.先谢了.:)  

     

     

       

     


    最新回复(0)