Solr 6.0 学习(四)中文IK分词

来源:互联网 发布:vs 打开报表数据 编辑:程序博客网 时间:2024/05/07 11:02

IK分词下载地址:http://git.oschina.net/wltea/IK-Analyzer-2012FF/

IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。

IK Analyzer 2012特性:

  1. 采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;

  2. 在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64位 普通pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。

  3. 2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。

  4. 采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符

  5. 优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。


参考:http://www.oschina.net/code/snippet_97202_48660

参考:http://iamyida.iteye.com/blog/2220833?utm_source=tuicool&utm_medium=referral

派生到我的代码片
  1. package com.ng.util.analyzer;  
  2.    
  3. import org.apache.lucene.analysis.Analyzer;  
  4. import org.apache.lucene.analysis.Tokenizer;  
  5.    
  6. public class IKAnalyzer5x extends Analyzer{  
  7.    
  8.     private boolean useSmart;  
  9.        
  10.     public boolean useSmart() {  
  11.         return useSmart;  
  12.     }  
  13.    
  14.     public void setUseSmart(boolean useSmart) {  
  15.         this.useSmart = useSmart;  
  16.     }  
  17.    
  18.     /**  
  19.      * IK分词器Lucene  Analyzer接口实现类  
  20.      *   
  21.      * 默认细粒度切分算法  
  22.      */  
  23.     public IKAnalyzer5x(){  
  24.         this(false);  
  25.     }  
  26.        
  27.     /**  
  28.      * IK分词器Lucene Analyzer接口实现类  
  29.      *   
  30.      * @param useSmart 当为true时,分词器进行智能切分  
  31.      */  
  32.     public IKAnalyzer5x(boolean useSmart){  
  33.         super();  
  34.         this.useSmart = useSmart;  
  35.     }  
  36.    
  37.        
  38.     /**  
  39.     protected TokenStreamComponents createComponents(String fieldName, final Reader in) {  
  40.         Tokenizer _IKTokenizer = new IKTokenizer(in , this.useSmart());  
  41.         return new TokenStreamComponents(_IKTokenizer);  
  42.     }  
  43.     **/  
  44.        
  45.        
  46.     /**  
  47.      * 重写最新版本的createComponents  
  48.      * 重载Analyzer接口,构造分词组件  
  49.      */  
  50.     @Override  
  51.     protected TokenStreamComponents createComponents(String fieldName) {  
  52.         Tokenizer _IKTokenizer = new IKTokenizer5x(this.useSmart());  
  53.         return new TokenStreamComponents(_IKTokenizer);  
  54.     }  
  55. }  
  56.   
  57. package com.ng.util.analyzer;  
  58.    
  59. import java.io.IOException;  
  60. import java.io.Reader;  
  61.    
  62. import org.apache.lucene.analysis.Tokenizer;  
  63. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  64. import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;  
  65. import org.apache.lucene.analysis.tokenattributes.TypeAttribute;  
  66. import org.wltea.analyzer.core.IKSegmenter;  
  67. import org.wltea.analyzer.core.Lexeme;  
  68.    
  69. public class IKTokenizer5x extends Tokenizer{  
  70.    
  71.        
  72.     //IK分词器实现  
  73.     private IKSegmenter _IKImplement;  
  74.        
  75.     //词元文本属性  
  76.     private final CharTermAttribute termAtt;  
  77.     //词元位移属性  
  78.     private final OffsetAttribute offsetAtt;  
  79.     //词元分类属性(该属性分类参考org.wltea.analyzer.core.Lexeme中的分类常量)  
  80.     private final TypeAttribute typeAtt;  
  81.     //记录最后一个词元的结束位置  
  82.     private int endPosition;  
  83.        
  84.        
  85.     /**  
  86.     public IKTokenizer(Reader in , boolean useSmart){  
  87.         super(in);  
  88.         offsetAtt = addAttribute(OffsetAttribute.class);  
  89.         termAtt = addAttribute(CharTermAttribute.class);  
  90.         typeAtt = addAttribute(TypeAttribute.class);  
  91.         _IKImplement = new IKSegmenter(input , useSmart);  
  92.     }**/  
  93.        
  94.     /**  
  95.      * Lucene 5.x Tokenizer适配器类构造函数  
  96.      * 实现最新的Tokenizer接口  
  97.      * @param useSmart  
  98.      */  
  99.     public IKTokenizer5x(boolean useSmart){  
  100.         super();  
  101.         offsetAtt = addAttribute(OffsetAttribute.class);  
  102.         termAtt = addAttribute(CharTermAttribute.class);  
  103.         typeAtt = addAttribute(TypeAttribute.class);  
  104.         _IKImplement = new IKSegmenter(input , useSmart);  
  105.     }  
  106.    
  107.     /* (non-Javadoc)  
  108.      * @see org.apache.lucene.analysis.TokenStream#incrementToken()  
  109.      */  
  110.     @Override  
  111.     public boolean incrementToken() throws IOException {  
  112.         //清除所有的词元属性  
  113.         clearAttributes();  
  114.         Lexeme nextLexeme = _IKImplement.next();  
  115.         if(nextLexeme != null){  
  116.             //将Lexeme转成Attributes  
  117.             //设置词元文本  
  118.             termAtt.append(nextLexeme.getLexemeText());  
  119.             //设置词元长度  
  120.             termAtt.setLength(nextLexeme.getLength());  
  121.             //设置词元位移  
  122.             offsetAtt.setOffset(nextLexeme.getBeginPosition(), nextLexeme.getEndPosition());  
  123.             //记录分词的最后位置  
  124.             endPosition = nextLexeme.getEndPosition();  
  125.             //记录词元分类  
  126.             typeAtt.setType(nextLexeme.getLexemeTypeString());            
  127.             //返会true告知还有下个词元  
  128.             return true;  
  129.         }  
  130.         //返会false告知词元输出完毕  
  131.         return false;  
  132.     }  
  133.        
  134.     /*  
  135.      * (non-Javadoc)  
  136.      * @see org.apache.lucene.analysis.Tokenizer#reset(java.io.Reader)  
  137.      */  
  138.     @Override  
  139.     public void reset() throws IOException {  
  140.         super.reset();  
  141.         _IKImplement.reset(input);  
  142.     }     
  143.        
  144.     @Override  
  145.     public final void end() {  
  146.         // set final offset  
  147.         int finalOffset = correctOffset(this.endPosition);  
  148.         offsetAtt.setOffset(finalOffset, finalOffset);  
  149.     }  
  150. }  



0 0
原创粉丝点击