`

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

阅读更多

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

 

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

 

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

 

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

一、修改org\apache\nutch\analysis下的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 use cjkToken.termText();

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

 * reset matchedToken.endColumn use cjkToken.endOffset();

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

 */

 if(myTokenizer == null) {

 myTokenizer = new MYTokenizer (new StringReader(image.toString()));

 cjkStartOffset = matchedToken.beginColumn;

 try {

 cjkToken = myTokenizer.next();

 } catch(IOException ioe) {

 cjkToken = null;

 }

 }

 

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

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

matchedToken.image = cjkToken.termText();

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

matchedToken.endColumn = cjkStartOffset + cjkToken.endOffset();

try {

cjkToken = myTokenizer.next();

} catch(IOException ioe) {

cjkToken = null;

}

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

input_stream.backup(1);

}

}

 

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

myTokenizer = null;

cjkStartOffset = 0;

 }

}

 

二、修改org\apache\nutch\searcher下的Summarizer.java文件(此处修改为提高搜索性能)

文件第189行附近:

将原代码段

if (highlight.contains(t.termText())) {

excerpt.addToken(t.termText());

            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 (highlight.contains(t.termText())) {

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

                  excerpt.addToken(t.termText().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.addToken(t.termText());

                   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);

}    

 

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

 

本文章出处http://blog.donews.com/52se

分享到:
评论

相关推荐

    实验报告(利用Nutch和IKanalyzer构造中文分词搜索引擎)

    在Nutch 1.2中集成IKAnalyzer,需要修改NutchAnalysis.jj文件,将SIGRAM规则调整为支持连续的汉字,然后在代码中初始化IKTokenizer,使其能够处理输入的文本流。通过这种方式,Nutch现在能够对抓取的网页内容进行...

    nutch-2.1源代码

    Nutch的源代码包含了整个项目的完整实现,包括爬虫、索引器、搜索器以及相关的配置和文档。这对于开发者和研究者来说是一个宝贵的资源,他们可以深入理解搜索引擎的工作原理,学习如何处理大规模的网络数据,或者对...

    nutch开发资料 搜索引擎

    Nutch支持多种中文分词工具,如HanLP、jieba和IK Analyzer等,这些工具能够将中文句子分割成有意义的词语,为后续的索引和查询提供基础。 4. **Nutch工作流程**:Nutch的工作流程主要包括URL发现(抓取种子URL并...

    nutch支持书名号搜索原理解释及代码实现

    2. **分词与词性标注**:在中文环境下,Nutch 可能会使用分词工具,如 IK 分词器或 HanLP,来将文本切分成词汇。但为了处理书名号,需要跳过书名号内的完整词汇,不进行分词。 3. **查询分析**:在用户输入搜索词时...

    Nutch1.0:Nutch1.0修改版(整合中文分词)原始码修改,编译打包-修改

    在这个特定的“Nutch1.0修改版”中,开发者已经对原始代码进行了调整,以整合中文分词功能。这使得Nutch能够更有效地处理中文网页的抓取和索引,从而在中文搜索引擎应用中发挥更大的作用。 中文分词是中文信息处理...

    nutch的插件机制

    - **可扩展性**:通过简单的接口实现,开发者可以轻松地增加新功能,而无需修改Nutch的核心代码。 - **灵活性**:丰富的插件库使得用户可以根据自身需求选择或开发适合的插件。 - **可维护性**:每个插件专注于独立...

    Nutch_插件深入研究

    本部分将简要介绍Nutch插件的实际应用案例,包括中文分词插件、索引字段增强插件等。通过具体实例,读者可以更好地理解Nutch插件是如何在实际场景中发挥作用的,以及如何根据自身需求开发和集成插件。 #### 五、在...

    解决Nutch摘要问题

    5. **优化Nutch源代码**:对于Nutch的源代码进行适当的修改,例如调整摘要长度、改进分词策略等,使其更加符合实际需求。 配合上述方法,我们还可以参考提供的图像和文本资源。"解决摘要问题1.png"、"解决摘要问题2...

    nutch09版本亲测好用

    Nutch 0.9 允许开发者通过修改配置文件来调整其行为,如设置抓取间隔、选择爬行策略、定义解析规则等。这使得 Nutch 可以适应各种不同的需求和场景。 7. **Hadoop 集成**: 在 Nutch 0.9 中,Hadoop 被用来处理...

    apache-nutch的源码

    6. **自定义开发**:Nutch 提供了丰富的插件机制,允许开发者根据需求自定义解析器、索引器、分词器等。通过修改或创建新的插件,你可以实现特定的抓取策略或处理逻辑。 7. **大数据处理**:Nutch是基于Hadoop构建...

    分布式搜索引擎nutch开发

    - **修改配置**:对于高级用户,可能需要调整Nutch的默认行为,例如改变分词规则、增加新的数据源或优化索引策略,这都需要修改配置文件。 - **集成其他系统**:Nutch可以与Solr、Elasticsearch等搜索服务器集成,...

    搭建nutch web开发环境

    1. 使用Git克隆Nutch 1.2的源代码库: ``` git clone https://github.com/apache/nutch.git -b branch-1.2 ``` **构建Nutch** 1. 进入Nutch源代码目录: ``` cd nutch ``` 2. 使用Maven构建Nutch: ``` mvn...

    Nutch 是一个开源Java 实现的搜索引擎(学习资料)----下载不扣分,回帖加1分,童叟无欺,欢迎下载 。不下也来看看啊!!

    1. **Java编程基础**:由于Nutch是用Java编写的,因此理解和修改Nutch源代码需要扎实的Java基础知识。 2. **搜索引擎原理**:理解搜索引擎的基本工作流程,包括爬虫、预处理、索引和查询处理。 3. **Hadoop和...

    apache-nutch-1.4-src.tar.gz_nutch_搜索引擎

    如果你想自定义Nutch,你可以根据项目需求修改配置文件,编写新的插件,或者对现有的代码进行调整。例如,你可以创建一个新的解析器来处理特定格式的网页,或者实现一个特殊的搜索算法以提升搜索质量。 总的来说,...

    \Lucene Nutch和安装说明文旦

    4. **配置文件**: 修改Nutch的配置文件,如`conf/nutch-site.xml`,设置爬虫的基本参数,如抓取间隔、抓取策略等。 5. **初始化数据库**: 创建并初始化HBase或MySQL等数据库,用于存储Nutch抓取的URL和元数据。 6. *...

    nutch2.1最新svn打包

    9. **版本控制**:使用SVN(Subversion)意味着你可以获取到Nutch项目的最新版本,跟踪代码的修改历史,这有利于开发人员协作和代码维护。 10. **社区支持**:作为开源项目,Nutch有一个活跃的开发者社区,提供持续...

    apache-nutch-1.16.rar 已编译好的版本,可以直接导入eclipse、idea

    Nutch 1.16是该项目的一个稳定版本,已经预先编译完成,方便开发者直接在Eclipse或IntelliJ IDEA这样的集成开发环境中导入使用,无需自行配置和编译源代码。 **Nutch的组成部分** 1. **Web爬虫**:Nutch的爬虫负责...

    分享一个Nutch入门学习的资料

    通过阅读提供的Nutch.pdf文档,你可以更深入地了解Nutch的原理、配置、使用方法以及最佳实践。在学习过程中,不断实践操作,结合源码阅读,将有助于更好地理解和掌握Nutch的功能和用法。祝你在Nutch的学习旅程中取得...

    apache nutch 2.2 linux

    4. **配置 Nutch**: 修改 `conf/nutch-site.xml` 文件,设置爬虫的基本参数,如抓取频率、存储路径、Hadoop 配置等。 5. **创建 Hadoop 目录结构**: 在 HDFS 上创建必要的目录,如 segments 和 crawldb。 6. **启动 ...

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    在Nutch中,这个过程由其内部机制自动完成,无需手动编写代码。 搜索时,使用QueryParser解析用户输入的关键词,生成Query对象,再通过IndexSearcher执行搜索,获取ScoreDoc数组,表示匹配的文档及其相关性得分。...

Global site tag (gtag.js) - Google Analytics