`
turingfellow
  • 浏览: 135189 次
  • 性别: Icon_minigender_1
  • 来自: 福建省莆田市
社区版块
存档分类
最新评论

改写lucene的Analyzer,添加自己的中文分词系统的方法

阅读更多
/**
*作者:夺天策      百度空间名:刹那剑欣
*转载请说明出处!  
*/

    这几天完成了我的中文分词算法,就着手把它加入到lucene中去,google,baidu一下,倒是有一些人写的中文分词,和加入的方法,但是那些都是符合他们自己写的分词算法的添加方法,没有讲到lucene的添加接口,没有将原理,于是就自己研究了下咯,看了下lucene的源代码,总结出方法,希望对现在还不知道的朋友会有帮助!!

源代码中主要分词器都在analysis 这个包中,在contrib中还有一些第三方的分词器,有一个中文分词器ChineseAnalyzer.java,但是他只是实现了二分(没两个汉字算作一个Token或者Term)方法的分词,对实际应用显然不能满足

所有的Analyzer都有一个抽象的父类Analyzer
lucene源代码:public abstract class Analyzer
每个子类的Analyzer都继承与这个类,并且实现这个类的tokenStream方法
lucene源代码:public abstract TokenStream tokenStream(String fieldName, Reader reader);
这个方法返回的是一个TokenStream实例(其实不是TokenStream实例,因为下面会开到TokenStream其实是一个抽象类,这里应该说是返回实现这个抽象类的实例)。要了解这个类,必须去看看这个类的源代码
TokenStream类:
public abstract class TokenStream {
     /** Returns the next token in the stream, or null at EOS. */
     public abstract Token next() throws IOException;

     /** Releases resources associated with this stream. */
     public void close() throws IOException {}
}

我们可以看到,这个类中有两个方法,主要的是一个next()方法,这个方法没调用一次反回一个Token实例,要想了解Token类,必须再看lucene的源代码咯

由于源代码有点长,贴出最核心的几个变量和方法
String termText;         // the text of the term
     int startOffset;         // start in source text
     int endOffset;         // end in source text
     String type = "word";         // lexical type
     private int positionIncrement = 1;
public Token(String text, int start, int end) {
       termText = text;
       startOffset = start;
       endOffset = end;
     }
public Token(String text, int start, int end, String typ) {
       termText = text;
       startOffset = start;
       endOffset = end;
       type = typ;
     }
。。。。。。

我们看到一个Token是有一个TermText,startOffset,endOffset,type,positionIncrement.....等组成,有两个构造函数。大体的结构就是这样了。下面我们看看个lucene现成的Analyzer的例子:SimpleAnalyzer.java


public final class SimpleAnalyzer extends Analyzer {
     public TokenStream tokenStream(String fieldName, Reader reader) {
       return new LowerCaseTokenizer(reader);
     }
}

我们看到他继承了Analyzer并且重写了方法tokenStream,返回一个TokenStream,我们知道TokenStream是一个抽象的类,LowerCaseTokenizer也是继承了这个抽象类,所以lucene可以这样返回一个LowerCaseTokenizer当作是 TokenStream,这里我们不再继续通过LowerCaseTokenizer分析下去了,因为LowerCaseTokenizer又是继承与 TokenFilter,而TokenFilter又是继承 TokenStream,有点乱。呵呵,我们这里只需要了解,新建的Analyzer需要继承Analyzer这个类,并且实现一个返回 TokenStream的tokenStream方法,而通过上面的分析,我们知道,我们只需要写一个类继承与TokenStream,并且实现其中 next()方法,比如我们起名为:KinggouTokenStream,这个类源代码如下:

public class KinggouTokenStream extends TokenStream{

public KinggouTokenStream(Reader reader){....//把reader对象变成String,并且在next方法中每次将一个词组封装为Token类型,然后返回!}

/**这个方法很关键,你每次next都必须返回一个 Token实例(在上面我有谈到),这里你可以在next方法中,实例化一个Token,并且把其中的TermText赋值为 分词出来的词组,然后startOffset和endOffset其实是这个次在整个token流中的首位置和尾位置,你可以通过分词得到的词组的 length去加基数去实现。
**/
public Token next() throws IOException{...............}

}

kinggouTokenStream 完成了,接下类写真正的Analyzer类,我们起名为KinggouAnalyzer,源代码如下:

public class kinggouAnalyzer extends Analyzer {

public TokenStream tokenStream(String filename, Reader reader) {
      //你需要在kinggouTokenStream中把这个reader对象读取为String,并且分词,然后为next方法定 义每次返回一个Token对象
         return new kinggouTokenStream(reader)
}
}

以上类都是便于理解写的,不一定保证能编译通过,只是写了主要的方法!
附上kinggou的写法:

--------------下面的是KinggouTokenStream,具体项目中我用SegmentOutInterface代替了-----------------

/**
* the interface of Segment to outside
* extend org.apache.lucene.analysis.TokenStream
* method: next()     return Token
* 分词对外的接口,继承 lucene的TokenStream
*/

package com.kinggou.engine.segment;
import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;

//SegmentOutInterface相当与上面的kinggouTokenStream

public class SegmentOutInterface extends TokenStream {
int start=0;
int end=0;
String list;
StringTokenizer st;
public SegmentOutInterface(String str){
//这里是分词的实现,分词实现有我写的一个具体的包,这里不写出
     list=WordSegment.getInstance().Segment(str, " ");;
     st=new StringTokenizer(list);
}
String temp;
Token tk;

/**
     * 实现的核心方法
     * */
@Override
public Token next() throws IOException {
   if(st.hasMoreTokens()){
    temp=st.nextToken();
    end=start+temp.length();
    tk=new Token(temp,start,end);
    start=end+1;
    //end=end+temp.length();
   }else{
    tk=null;
   }
   return tk;
}
}

---------------------------------下面的是kinggouAnalyzer----------------------

package com.kinggou.engine.index;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import com.kinggou.engine.segment.SegmentOutInterface;

public class kinggouAnalyzer extends Analyzer {

/**
     * 改写的lucene自己的分析器
     * */
@Override
public TokenStream tokenStream(String filename, Reader reader) {
     StringBuffer str=new StringBuffer();
     BufferedReader br=new BufferedReader(reader);
     String temp="";
     try {
      temp = br.readLine();
     } catch (IOException e) {
      e.printStackTrace();
     }
     while(temp!=null){
      str.append(temp);
      try {
       temp=br.readLine();
      } catch (IOException e) {
       e.printStackTrace();
      }
     }
     return new SegmentOutInterface(str.toString());
}

}

ok,完毕。。。。
分享到:
评论

相关推荐

    lucene Analyzer 庖丁解牛 中文分词

    《Lucene Analyzer剖析:中文分词的奥秘》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种系统中。其核心功能之一就是对输入...理解Analyzer的工作原理和特性,是掌握Lucene中文处理的关键。

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过

    lucene3.5 IKAnalyzer3.2.5 实例中文分词通过,目前在网上找的lucene 和IKAnalyzer 的最新版本测试通过。内含:示例代码,以及最新jar包。 lucene lucene3.5 IKAnalyzer IKAnalyzer3.2.5 jar 中文 分词

    c# 中文分词 LUCENE IKAnalyzer

    标题中的"C# 中文分词 LUCENE IKAnalyzer"是指使用C#语言实现的一个中文分词工具,它基于开源全文检索引擎Lucene,并且采用了IKAnalyzer(智能汉字分词系统)的Java版本进行移植。Lucene是一个强大的、高性能的信息...

    lucene.NET 中文分词

    在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备丰富的词汇库和优秀的分词算法,能有效地对中文文本进行拆分。 - **IK Analyzer**:是一个开源的...

    Lucene4.7+IK Analyzer中文分词入门教程

    【Lucene4.7+IK Analyzer中文分词入门教程】 Lucene是一个开源的全文检索库,它提供了文本分析、索引和搜索的核心工具。在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源...

    lucene6.6+拼音分词+ik中文分词包

    提供的ik-analyzer-solr6.x.jar文件就是IK Analyzer的一个版本,适用于Solr 6.x,能够很好地与Lucene集成,进行中文分词。 除了IK Analyzer,还有pinyin4j-2.5.0.jar,这是一个Java库,用于处理汉字的拼音转换。在...

    Lucene的IK Analyzer 3.0 中文分词器 全解

    总之,IK Analyzer 3.0 是一个强大而灵活的中文分词工具,它在处理中文文本方面表现出色,特别适合用于Lucene的全文检索系统。通过其独特的算法和特性,IK Analyzer 3.0 提升了分词速度,增强了查询性能,降低了系统...

    IKAnalyzer和Lucene分词工具下载地址+使用方法

    IKAnalyzer是一款基于Java语言开发的中文分词工具包,它在Lucene的基础上进行了优化和扩展,特别适用于全文检索和自然语言处理任务。IKAnalyzer提供了强大的中文分词能力,能够有效地识别和处理中文词汇,提高了搜索...

    支持lucene的词典机械中文分词

    本文将深入探讨一种基于Lucene的词典机械中文分词方法,该方法采用了反向机械分词算法,尤其关注对数字、英文以及中英文数字混合词的特殊处理,旨在提高分词速度和准确性。 首先,反向机械分词算法是一种常用的中文...

    ikanalyzer中文分词支持lucene7.1.0

    ikanalyzer中文分词支持lucene7.1.0是一个针对Lucene搜索引擎的中文分词扩展,由林良益先生开发,旨在提供高效、精准的中文词汇拆解功能。Lucene是一个开源全文检索库,它提供了索引和搜索文本的强大工具。然而,...

    IKAnalyzer LUCENE.4.9 中文分词的高亮显示

    在IT领域,中文分词是搜索引擎和文本处理系统中的关键环节,它涉及到将连续的汉字序列分割成具有独立语义的词语。IKAnalyzer是一个开源的Java实现的中文分词器,设计目标是提供一个轻量级、高效且易扩展的中文处理...

    IKAnalyzer中文分词器支持Lucene6.0以上

    提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。

    Lucene中文分词器包

    来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...

    使用IK Analyzer实现中文分词之Java实现

    IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析...

    IKAnalyzer中文分词.rar

    IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...

    IKAnalyzer2012+lucene中文分词

    IKAnalyzer2012+lucene中文分词是一个用于搜索引擎或信息检索系统的中文处理工具,它结合了IKAnalyzer2012和lucene-core-3.6.0这两个关键组件,为处理中文文本提供了高效的分词服务。在这个组合中,IKAnalyzer是主要...

    Lucene关于几种中文分词的总结

    总之,理解并选择适合的Lucene中文分词器对于构建高效的全文检索系统至关重要。每个分词器都有其特点和局限性,开发者应根据实际应用场景,结合分词器的性能、可扩展性和词典支持等因素,做出最佳决策。

    实现lucene的Analyzer接口的一个分词器

    导入: import net.teamhot.lucene.ThesaurusAnalyzer; import org.apache.lucene.analysis.Analyzer; 实例化: Analyzer analyzer = new ThesaurusAnalyzer();

    如何使用Lucene的中文分词搜索

    1. **中文分词器**:在Lucene中,针对中文的分词通常使用第三方插件,如IK Analyzer、jieba分词库或SmartChinese Analyzer。这些分词器能识别中文词汇并将其拆分为单个词元(Token)。 2. **配置分析器**:在...

Global site tag (gtag.js) - Google Analytics