实现NUTCH中文分词的代码修改方法

阅读: 评论:0

实现NUTCH中文分词的代码修改方法

实现NUTCH中文分词的代码修改方法

现在实现基本中文分词功能的代码和软件模块很多,性能也还可以,但是怎样将其应用到NUTCH中的方法介绍相对较少,下面我就实现NUTCH中文分词的NUTCH代码修改方法与步骤,抛砖引玉的介绍一下。

 

代码修改的切入点是通过对NUTCH处理中文的切分器Tokenizer的修改或者替换(这里介绍的是替换),使中文分词由单字切分变为词语切分。对于相关的NUTCH基本知识,我就不赘述了。因为NUTCH的检索功能基于Lucene,所以你用来替换的切分器必须满足Lucene的Tokenizer特征,最主要的是保证输入与输出相符,分词后输出的必须是Token流。幸运的是,现存的分词程序或软件模块基本上都满足此需要,即使有所偏差,一般通过对其输入输出的修改就可以满足需要。我前面提供给大家的那个分词程序就可以经过简单修改应用于NUTCH中。

 

设我们实现中文分词功能模块的主类名为MYTokenizer,package为org.apache. MYTokenizer,将模块假如项目后,NUTCH代码修改如下:

 

(需要修改或新增的行后有注释,否则其它行只是为了定位,不修改)

一、修改orgapachenutchanalysis下的NutchAnalysis.jj文件(此文件由JACC生成)

文件第33行附近:

 import org.apache.nutch.searcher.Query.Clause;

 

 import org.apache.lucene.analysis.StopFilter;

+import org.apache. nutch.analysis. myt. MYTokenizer; //新增此行,加入你的切分器

 

 import java.io.*;

 import java.util.*;

 

文件第8 1行附近:

 PARSER_END(NutchAnalysis)

 

 TOKEN_MGR_DECLS : {

/** use MYTokenizer to process cjk character */  //新增此行注释

 private MYTokenizer myTokenizer = null;   //新增此行

/** a global cjk token */    //新增此行注释

private org.apache.lucene.analysis.Token cjkToken = null;        //新增此行,输出流

 

/** start offset of cjk sequence */     //新增此行注释

private int cjkStartOffset = 0;    //新增此行

 

   /** Constructs a token manager for the provided Reader. */

   public NutchAnalysisTokenManager(Reader reader) {

 

文件第106行附近:

}

 

   // chinese, japanese and korean characters

| <SIGRAM: <CJK> >    //删除此行

| <SIGRAM: (<CJK>)+ >   //新增此行(#行)

 

//以下所有行均为新增,紧接上行代码(#行)书写

 {

 /**

 * use an instance of myTokenizer, myTokenizer, hold the maximum

 * matched cjk chars, and cjkToken for the current token;

 * reset matchedToken.image Text();

 * reset matchedToken.beginColumn use cjkToken.startOffset();

 * dColumn dOffset();

 * backup the last char when the next cjkToken is valid.

 */

 if(myTokenizer == null) {

 myTokenizer = new MYTokenizer (new String()));

 cjkStartOffset = matchedToken.beginColumn;

 try {

 cjkToken = ();

 } catch(IOException ioe) {

 cjkToken = null;

 }

 }

 

 if(cjkToken != null && !Text().equals("")) {

//sometime the myTokenizer returns an empty string, is it a bug?

matchedToken.image = Text();

matchedToken.beginColumn = cjkStartOffset + cjkToken.startOffset();

dColumn = cjkStartOffset + dOffset();

try {

cjkToken = ();

} catch(IOException ioe) {

cjkToken = null;

}

if(cjkToken != null && !Text().equals("")) {

input_stream.backup(1);

}

}

 

if(cjkToken == null || Text().equals("")) {

myTokenizer = null;

cjkStartOffset = 0;

 }

}

 

二、修改orgapachenutchsearcher下的Summarizer.java文件(此处修改为提高搜索性能)

文件第189行附近:

将原代码段

if (Text())) {

excerpt.Text());

            excerpt.add(new Fragment(text.substring(offset, t.startOffset())));

            excerpt.add(new Highlight(text.substring(t.startOffset(),t.endOffset())));

            offset = t.endOffset();

            endToken = Math.min(j+SUM_CONTEXT, tokens.length);

          }

修改为:

if (Text())) {

if(offset * 2 == (t.startOffset() + t.endOffset() )) { // cjk bi-gram

                  excerpt.Text().substring(offset - t.startOffset()));

                  excerpt.add(new Fragment(text.substring(t.startOffset() + 1,offset)));

                  excerpt.add(new Highlight(text.substring(t.startOffset() + 1 ,t.endOffset())));

              }
              else {
                   excerpt.Text());

                   excerpt.add(new Fragment(text.substring(offset, t.startOffset())));

                   excerpt.add(new Highlight(text.substring(t.startOffset() ,t.endOffset())));

              }

              offset = t.endOffset();

              endToken = Math.min(j+SUM_CONTEXT, tokens.length);

}    

 

为了提高运行效率,你的分词模块在运行中最好可以将词表读入内存。至于代码修改的原理,说来话长,容后再叙。

 

本文章出处。

本文发布于:2024-01-31 21:41:48,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170670851231545.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:分词   中文   代码   方法   NUTCH
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23