zoukankan      html  css  js  c++  java
  • 基于Lucene 4.x的ikanalyzer

    需要修改IKAnalyzer.java、IKTokenizer.java、IKTokenizerFactory.java。

     1 import java.io.Reader;
     2 import org.apache.lucene.analysis.Analyzer;
     3 import org.apache.lucene.analysis.Tokenizer;
     4 
     5 /**
     6  * 实现Lucene Analyzer 基于IKTokenizer的中文分词器
     7  * 
     8  * @author 林良益
     9  * 
    10  */
    11 public final class IKAnalyzer extends Analyzer {
    12 
    13     private boolean isMaxWordLength = false;
    14 
    15     /**
    16      * IK分词器Lucene Analyzer接口实现类 默认最细粒度切分算法
    17      */
    18     public IKAnalyzer() {
    19         this(false);
    20     }
    21 
    22     /**
    23      * IK分词器Lucene Analyzer接口实现类
    24      * 
    25      * @param isMaxWordLength
    26      *            当为true时,分词器进行最大词长切分
    27      */
    28     public IKAnalyzer(boolean isMaxWordLength) {
    29         super();
    30         this.setMaxWordLength(isMaxWordLength);
    31     }
    32 
    33     @Override
    34     public TokenStreamComponents createComponents(String fieldName,
    35             Reader reader) {
    36         Tokenizer tokenizer = new IKTokenizer(reader, isMaxWordLength());
    37         return new TokenStreamComponents(tokenizer, null);
    38     }
    39 
    40     public void setMaxWordLength(boolean isMaxWordLength) {
    41         this.isMaxWordLength = isMaxWordLength;
    42     }
    43 
    44     public boolean isMaxWordLength() {
    45         return isMaxWordLength;
    46     }
    47 
    48 }
     1 import java.io.IOException;
     2 import java.io.Reader;
     3 
     4 import org.apache.lucene.analysis.Tokenizer;
     5 import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
     6 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
     7 import org.wltea.analyzer.IKSegmentation;
     8 import org.wltea.analyzer.Lexeme;
     9 
    10 /**
    11  * IK Analyzer v3.2 Lucene4.x Tokenizer适配器类 它封装了IKSegmentation实现
    12  * 
    13  * @author 林良益
    14  * 
    15  */
    16 public final class IKTokenizer extends Tokenizer {
    17     // IK分词器实现
    18     private IKSegmentation _IKImplement;
    19     // 词元文本属性
    20     private CharTermAttribute termAtt;
    21     // 词元位移属性
    22     private OffsetAttribute offsetAtt;
    23     // 记录最后一个词元的结束位置
    24     private int finalOffset;
    25 
    26     /**
    27      * Lucene Tokenizer适配器类构造函数
    28      * 
    29      * @param in
    30      * @param isMaxWordLength
    31      *            当为true时,分词器进行最大词长切分;当为false是,采用最细粒度切分
    32      */
    33     public IKTokenizer(Reader in, boolean isMaxWordLength) {
    34         super(in);
    35         offsetAtt = addAttribute(OffsetAttribute.class);
    36         termAtt = addAttribute(CharTermAttribute.class);
    37         _IKImplement = new IKSegmentation(in, isMaxWordLength);
    38     }
    39 
    40     @Override
    41     public final boolean incrementToken() throws IOException {
    42         // 清除所有的词元属性
    43         clearAttributes();
    44         Lexeme nextLexeme = _IKImplement.next();
    45         if (nextLexeme != null) {
    46             // 将Lexeme转成Attributes
    47             // 设置词元文本
    48             termAtt.setEmpty().append(nextLexeme.getLexemeText());
    49             // 设置词元位移
    50             offsetAtt.setOffset(nextLexeme.getBeginPosition(),
    51                     nextLexeme.getEndPosition());
    52             offsetAtt.setOffset(correctOffset(nextLexeme.getBeginPosition()), correctOffset(nextLexeme.getEndPosition()));
    53             finalOffset = nextLexeme.getEndPosition();
    54             // 返会true告知还有下个词元
    55             return true;
    56         }
    57         // 返会false告知词元输出完毕
    58         return false;
    59     }
    60 
    61     /*
    62      * (non-Javadoc)
    63      * 
    64      * @see org.apache.lucene.analysis.Tokenizer#reset(java.io.Reader)
    65      */
    66     public void reset() throws IOException {
    67         super.reset();
    68         _IKImplement.reset(input);
    69     }
    70 
    71     @Override
    72     public final void end() {
    73         offsetAtt.setOffset(finalOffset, finalOffset);
    74     }

    75 } 

     1 import java.io.Reader;
     2 import java.util.Map;
     3 
     4 import org.apache.lucene.analysis.Tokenizer;
     5 import org.apache.lucene.analysis.util.TokenizerFactory;
     6 import org.wltea.analyzer.lucene.IKTokenizer;
     7 
     8 /**
     9  * 实现Solr4.x分词器接口
    10  * 基于IKTokenizer的实现
    11  * 
    12  * @author 林良益、李良杰
    13  *
    14  */
    15 public final class IKTokenizerFactory extends TokenizerFactory{
    16     
    17     private boolean isMaxWordLength = false;
    18     
    19     /**
    20      * IK分词器Solr TokenizerFactory接口实现类
    21      * 默认最细粒度切分算法
    22      */
    23     public IKTokenizerFactory(){
    24     }
    25     
    26     /*
    27      * (non-Javadoc)
    28      * @see org.apache.solr.analysis.BaseTokenizerFactory#init(java.util.Map)
    29      */
    30     public void init(Map<String,String> args){
    31         String _arg = args.get("isMaxWordLength");
    32         isMaxWordLength = Boolean.parseBoolean(_arg);
    33     }
    34     
    35     /*
    36      * (non-Javadoc)
    37      * @see org.apache.solr.analysis.TokenizerFactory#create(java.io.Reader)
    38      */
    39     public Tokenizer create(Reader reader) {
    40         return new IKTokenizer(reader , isMaxWordLength());
    41     }
    42 
    43     public void setMaxWordLength(boolean isMaxWordLength) {
    44         this.isMaxWordLength = isMaxWordLength;
    45     }
    46 
    47     public boolean isMaxWordLength() {
    48         return isMaxWordLength;
    49     }
    50 }

  • 相关阅读:
    bzoj4165 矩阵 堆维护多路归并
    bzoj2802 [Poi2012]Warehouse Store 贪心+堆
    bzoj1367 [Baltic2004]sequence 左偏树+贪心
    bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树
    uoj207 共价大爷游长沙 子树信息 LCT + 随机化 + 路径覆盖
    bzoj4764 弹飞大爷 LCT
    bzoj4817 & loj2001 [Sdoi2017]树点涂色 LCT + 线段树
    bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
    bzoj4998 星球联盟 LCT + 并查集
    bzoj3091 城市旅行 LCT + 区间合并
  • 原文地址:https://www.cnblogs.com/TerryLiang/p/2714918.html
Copyright © 2011-2022 走看看