Solr 6.0 学习(四)中文IK分词
2016-05-19 16:21
465 查看
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特性:
采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;
在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64位 普通pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。
2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。
采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。
参考:http://www.oschina.net/code/snippet_97202_48660
参考:http://iamyida.iteye.com/blog/2220833?utm_source=tuicool&utm_medium=referral
IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
IK Analyzer 2012特性:
采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;
在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64位 普通pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。
2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。
采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。
参考:http://www.oschina.net/code/snippet_97202_48660
参考:http://iamyida.iteye.com/blog/2220833?utm_source=tuicool&utm_medium=referral
package com.ng.util.analyzer; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Tokenizer; public class IKAnalyzer5x extends Analyzer{ private boolean useSmart; public boolean useSmart() { return useSmart; } public void setUseSmart(boolean useSmart) { this.useSmart = useSmart; } /** * IK分词器Lucene Analyzer接口实现类 * * 默认细粒度切分算法 */ public IKAnalyzer5x(){ this(false); } /** * IK分词器Lucene Analyzer接口实现类 * * @param useSmart 当为true时,分词器进行智能切分 */ public IKAnalyzer5x(boolean useSmart){ super(); this.useSmart = useSmart; } /** protected TokenStreamComponents createComponents(String fieldName, final Reader in) { Tokenizer _IKTokenizer = new IKTokenizer(in , this.useSmart()); return new TokenStreamComponents(_IKTokenizer); } **/ /** * 重写最新版本的createComponents * 重载Analyzer接口,构造分词组件 */ @Override protected TokenStreamComponents createComponents(String fieldName) { Tokenizer _IKTokenizer = new IKTokenizer5x(this.useSmart()); return new TokenStreamComponents(_IKTokenizer); } } package com.ng.util.analyzer; import java.io.IOException; import java.io.Reader; import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; import org.apache.lucene.analysis.tokenattributes.TypeAttribute; import org.wltea.analyzer.core.IKSegmenter; import org.wltea.analyzer.core.Lexeme; public class IKTokenizer5x extends Tokenizer{ //IK分词器实现 private IKSegmenter _IKImplement; //词元文本属性 private final CharTermAttribute termAtt; //词元位移属性 private final OffsetAttribute offsetAtt; //词元分类属性(该属性分类参考org.wltea.analyzer.core.Lexeme中的分类常量) private final TypeAttribute typeAtt; //记录最后一个词元的结束位置 private int endPosition; /** public IKTokenizer(Reader in , boolean useSmart){ super(in); offsetAtt = addAttribute(OffsetAttribute.class); termAtt = addAttribute(CharTermAttribute.class); typeAtt = addAttribute(TypeAttribute.class); _IKImplement = new IKSegmenter(input , useSmart); }**/ /** * Lucene 5.x Tokenizer适配器类构造函数 * 实现最新的Tokenizer接口 * @param useSmart */ public IKTokenizer5x(boolean useSmart){ super(); offsetAtt = addAttribute(OffsetAttribute.class); termAtt = addAttribute(CharTermAttribute.class); typeAtt = addAttribute(TypeAttribute.class); _IKImplement = new IKSegmenter(input , useSmart); } /* (non-Javadoc) * @see org.apache.lucene.analysis.TokenStream#incrementToken() */ @Override public boolean incrementToken() throws IOException { //清除所有的词元属性 clearAttributes(); Lexeme nextLexeme = _IKImplement.next(); if(nextLexeme != null){ //将Lexeme转成Attributes //设置词元文本 termAtt.append(nextLexeme.getLexemeText()); //设置词元长度 termAtt.setLength(nextLexeme.getLength()); //设置词元位移 offsetAtt.setOffset(nextLexeme.getBeginPosition(), nextLexeme.getEndPosition()); //记录分词的最后位置 endPosition = nextLexeme.getEndPosition(); //记录词元分类 typeAtt.setType(nextLexeme.getLexemeTypeString()); //返会true告知还有下个词元 return true; } //返会false告知词元输出完毕 return false; } /* * (non-Javadoc) * @see org.apache.lucene.analysis.Tokenizer#reset(java.io.Reader) */ @Override public void reset() throws IOException { super.reset(); _IKImplement.reset(input); } @Override public final void end() { // set final offset int finalOffset = correctOffset(this.endPosition); offsetAtt.setOffset(finalOffset, finalOffset); } }
相关文章推荐
- Java连接池 DBCP
- Node.mongoose
- 深入理解java虚拟机(5)---字节码执行引擎
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
- centos7 yum 方式安装nginx
- Java 容器类内部使用的数据结构
- CSS3制作漂亮的照片墙
- Unity3D之VR开发笔记@大朋VR开发UNITY环境搭建
- Python学习(一 基础知识要点)
- js选择器封装
- sql操作语句,怎么新建变量。这样就不用每次修改都修改很长的表了
- hdu4004 Frog’s Game【二分+贪心】
- C#基础-压缩文件及故障排除
- php基础知识收集--数组、文件、字符串、文件、会话
- 【多线程-Suspend()和Resume()方法】
- Win7如何保存网页视频?Win7系统保存网页视频的方法
- Diango怎么将数据库中的表同步到moudle中
- 用jQuery获取table中行id和td值的实现代码
- Android中Activity、Service和线程之间的通信
- 检测Windows操作系统是64位还是32位