nutch 中添加中文分词 修改代码法 使用插件法

来源:互联网 发布:真人rpg游戏数据 编辑:程序博客网 时间:2024/04/30 15:58

Nutch中如何实现中文分词功能

Nutch对中文查询时默认采用的分词器为NutchAnalyzer,对中文默认采用单字切分.这种效果不是很理想,我们可以自定义切词器,以实现对中文支持,注意网上对如何添加中文分词功能有很多介绍但不全也不完整,对Nutch添加中文分词一定要在检索端和查询端同时更改。

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

1.直接修改nutch的系统代码,对默认的分词器代码进行修改使其使用自定义中文分词程序.

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

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

进行分词解析。

一,通过修改代码的方式实现对中文的支持

你需要用到的工具有:javacc antJE分词包。

1.对建立索引所用分词工具的修改

将下载的中文分词包放到lib目录下,改名为analysis-zh.jar(当然,你也可以不用改)。找到下面文件

src/java/org/apache/nutch/analysis/NutchDocumentAnalyzer.java

修改tokenStream方法如下

public TokenStream tokenStream(String fieldName, Reader reader) {

Analyzer analyzer;

analyzer= new MMAnalyzer();

return analyzer.tokenStream(fieldName, reader);

}

注意:由于加入信息的分析类,你需要将该类导入。使用如下语句。

import jeasy.analysis.*;

2.对查询所用分析部分的修改

src/java/org/apache/nutch/analysis/中的NutchAnalysis.jj文件

<SIGRAM: <CJK> >

 

改为:| <SIGRAM: (<CJK>)+ >

 

使用javacc工具将NutchAnalysis.jj生成java文件,共会生成7java文件,将他们拷贝到下面的文件夹中替 换原有文件。

src/java/org/apache/nutch/analysis

如何安装与使用javacc

下载javacc并解压,然后将javacc的主目录添加到环境变量下。进入命令行,输入javacc,如果不出现不能识别该命令之类的说法,证明安装成功。

进入NutchAnalysis.jj文件所在的目录,输入javacc NutchAnalysis.jj命令就会生成7java文件了。

3.重新编译工程文件

这里你需要用到ant工具

ant的安装与配置与 javacc类似,下载后解压,然后在path环境变量中加如指向ant下的bin文件夹的路径。

使用:从命令行进入nutch目录中,输入ant命令,它会自动根据当前目录下的build.xml进行重建。重建完毕后会在改目录下产生一个build文件夹。

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

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

二,使用插件机制完成公文分词

   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文件的生成。

生成方法是通过nutch-1.0/src/plugin/languageidentifier/src/java/org/apache/nutch/analysis/lang/NgramProfile.java类来完成.ngp文件的生成。生成命令为:

java org.apache.nutch.analysis.lang.NGramProfile -create <profile-name> <filename> <encoding>

profile-name is the  ISO-639 2-letter codes of the new language.

filename is the name of the file used to build the new language profile (the biggest it is, and the most it contains different sources and subjects the better the profile will be).

encoding is the encoding of the file used to build the new profile (filename).

对于如何生成此文件请查看:http://wiki.apache.org/nutch/LanguageIdentifierPlugin

2.2    建立插件类

我们在这里建立的插件类,在Eclipse中做好Nutch的运行调试使其没有任何错误然后在nutch-1.0/src/plugin/下建立cjkAnalyzer源文件夹,此文件夹应包含插件源文件,build.xml,plugin.xml三个内容。调用的分词器直接用lucene2.0中的CJKAnalyer

具体代码如下.

package org.apache.nutch.analysis.zh;

// JDK imports

import java.io.Reader;

// Lucene imports

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.TokenStream;

// Nutch imports

import 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-default.xml下的plugin.includes如下

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

3.       小结

 

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

注:关于查询端只能是使用代码修改的办法。

原创粉丝点击