为nutch 添加中文分词插件

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

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

3.       小结

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

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

源文件下载

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

 

 

   

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值