`

ikanalyze分词学习(一)

阅读更多

===================IKAnalyzerTest=================

@Test

public void testIKAnalyzer() throws Exception {

 

String keyWord = "我们参加 中国世锦赛";

System.out.println(keyWord);

IKAnalyzer analyzer = new IKAnalyzer();

// 使用智能分词

analyzer.setUseSmart(true);

// 打印分词结果

        System.out.println("当前使用的分词器:" + analyzer.getClass().getSimpleName());

        IKTokenizer tokenStream = (IKTokenizer) analyzer.tokenStream("content", new StringReader(keyWord));

        CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class);

        

        while (tokenStream.incrementToken()){

        AnalyzeContext analyze =  tokenStream.get_IKImplement().getContext();

LinkedList<Lexeme>  xx = analyze.getResults();

for(Lexeme x:xx){

System.out.println("begin:"+x.getBegin()+",length:"+x.getLength());

}

System.out.println("end:"+term.toString());

        }

 

 

}

 

==================IKTokenizer======================

 

@Override

public boolean incrementToken() throws IOException {

//清除所有的词元属性

clearAttributes();

Lexeme nextLexeme = _IKImplement.next();//获取词元

if(nextLexeme != null){

//将Lexeme转成Attributes

System.out.println("截取出来的词元:"+nextLexeme.getLexemeText());

//设置词元文本

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;

}

 

 

==============IKSegmenter================

private AnalyzeContext context; //分词偏移量 等 都存放在这里

 

/**

* 分词,获取下一个词元

* @return Lexeme 词元对象

* @throws IOException

*/

public synchronized Lexeme next()throws IOException{

Lexeme l = null;

while((l = context.getNextLexeme()) == null ){

/*

* 从reader中读取数据,填充buffer

* 如果reader是分次读入buffer的,那么buffer要  进行移位处理

* 移位处理上次读入的但未处理的数据

*/

int available = context.fillBuffer(this.input);

if(available <= 0){

//reader已经读完

context.reset();

return null;

 

}else{

//初始化指针

context.initCursor();

do{

System.out.println("当前词:"+context.getSegmentBuff()[context.getCursor()]);

        //遍历子分词器

        for(ISegmenter segmenter : segmenters){

        segmenter.analyze(context);//CJKSegmenter 分词器

        }

        //字符缓冲区接近读完,需要读入新的字符

        if(context.needRefillBuffer()){

        break;

        }

  

}while(context.moveCursor()); //向前移动指针

//重置子分词器,为下轮循环进行初始化

for(ISegmenter segmenter : segmenters){

segmenter.reset();

}

}

//对分词进行歧义处理

this.arbitrator.process(context, this.cfg.useSmart());

//将分词结果输出到结果集,并处理未切分的单个CJK字符

context.outputToResult();

//记录本次分词的缓冲区位移

context.markBufferOffset();

}

return l;

}

 

 

=================CJKSegmenter================

public void analyze(AnalyzeContext context) {

if(CharacterUtil.CHAR_USELESS != context.getCurrentCharType()){

 

//优先处理tmpHits中的hit

if(!this.tmpHits.isEmpty()){

 

 

//处理词段队列

Hit[] tmpArray = this.tmpHits.toArray(new Hit[this.tmpHits.size()]);

for(Hit hit : tmpArray){

System.out.println("位置["+hit.getBegin()+","+hit.getEnd()+"],值"+curValue(context,hit));

hit = Dictionary.getSingleton().matchWithHit(context.getSegmentBuff(), context.getCursor() , hit);

if(hit.isMatch()){

//输出当前的词

Lexeme newLexeme = new Lexeme(context.getBufferOffset() , hit.getBegin() , context.getCursor() - hit.getBegin() + 1 , Lexeme.TYPE_CNWORD);

context.addLexeme(newLexeme);

 

if(!hit.isPrefix()){//不是词前缀,hit不需要继续匹配,移除

this.tmpHits.remove(hit);

}

 

}else if(hit.isUnmatch()){

//hit不是词,移除

this.tmpHits.remove(hit);

}

}

}

 

//*********************************

//再对当前指针位置的字符进行单字匹配

//System.out.println("当前词:"+context.getSegmentBuff()[context.getCursor()]);

Hit singleCharHit = Dictionary.getSingleton().matchInMainDict(context.getSegmentBuff(), context.getCursor(), 1);

if(singleCharHit.isMatch()){//首字成词

//输出当前的词

Lexeme newLexeme = new Lexeme(context.getBufferOffset() , context.getCursor() , 1 , Lexeme.TYPE_CNWORD);

context.addLexeme(newLexeme);

 

//同时也是词前缀

if(singleCharHit.isPrefix()){

//前缀匹配则放入hit列表

this.tmpHits.add(singleCharHit);

}

}else if(singleCharHit.isPrefix()){//首字为词前缀

//前缀匹配则放入hit列表

this.tmpHits.add(singleCharHit);

}

 

 

}else{

//遇到CHAR_USELESS字符

//清空队列

this.tmpHits.clear();

}

 

//判断缓冲区是否已经读完

if(context.isBufferConsumed()){

//清空队列

this.tmpHits.clear();

}

 

//判断是否锁定缓冲区

if(this.tmpHits.size() == 0){

context.unlockBuffer(SEGMENTER_NAME);

 

}else{

context.lockBuffer(SEGMENTER_NAME);

}

}

分享到:
评论

相关推荐

    IkAnalyze中文分词工具包

    IkAnalyze中文分词工具包是专为Solr设计的一款高效、可配置的中文分词组件,用于在信息检索和自然语言处理中对中文文本进行精确的分词。这款工具包广泛应用于信息检索系统、搜索引擎优化以及数据分析等领域,极大地...

    中文分词学习版

    此为学习版,请勿用于商业用途或扩散。 以下描述转至互联网。 ============== 一、CSW中分词组件简介 CSW中文分词组件,是一套可自动将一段文本按常规汉语词组进行拆分,并以指定方式进行分隔的COM组件。本组件...

    一个简单的分词词典,供大家学习测试分词之用。

    2. **支持新词发现**:通过词典,分词器可以学习并适应新的词汇出现,特别是网络流行语、专业术语等。 3. **提高分词精度**:词典中包含了大量人工标注的正确分词结果,可以帮助算法减少误切和漏切的情况,提高分词...

    基于深度学习的中文分词算法.zip

    总的来说,《基于深度学习的中文分词算法》项目是一个结合理论与实践的优秀示例,它展示了深度学习在解决中文分词难题上的潜力。通过学习和理解该项目,开发者可以深入掌握深度学习在自然语言处理中的应用,并为自己...

    baidu.rar_ baidu_dictionary_中文分词_中文分词 词典_分词词典

    在本篇文章中,我们将围绕“baidu.rar_baidu_dictionary_中文分词_中文分词_词典_分词词典”这一主题,深入探讨百度曾经使用的中文分词词典及其在实际应用中的价值。 首先,让我们了解中文分词词典的重要性。词典是...

    基于深度学习的中文分词方法研究.pdf

    在提出的基于深度学习的中文分词模型中,研究者们设计了一系列实验来验证其在不同数据集上的表现。实验结果表明,该模型在准确性和效率上都显示出优越性,能够更准确地处理中文分词问题。 对于深度学习在中文分词中...

    ictclas工程,分词学习

    ictclas工程,分词学习ictclas工程,分词学习ictclas工程,分词学习

    最新逆向最大匹配分词算法 盘古分词 分词算法 中文分词 源码

    逆向最大匹配分词算法(Reverse Maximum Matching,RMM)是一种常见的中文分词技术,广泛应用于自然语言处理、搜索引擎和信息检索等领域。该算法的基本思想是从待分词文本的末尾开始,向前寻找最长的已存在于词典中...

    基于深度学习和迁移学习的领域自适应中文分词.pdf

    深度学习为模型提供了强大的学习能力,迁移学习使模型能够将在大规模通用数据上学习到的知识应用到数据稀缺的专业领域,而领域分词和工程法律则是这一方法具体应用的场景和领域。 中图分类号TP391和文献标识码A则...

    分词词库_中文分词词库最新整理(TXT格式)

    中文分词是自然语言处理中非常重要的一个步骤,而分词词库则是分词工具的重要组成部分。一个好的词库能够极大地提升分词质量,进而提高后续自然语言处理任务的性能。通过对中文分词基本原理的理解,结合实际应用场景...

    机器学习sklearn中文分词

    机器学习sklearn中文分词学习记录

    基于深度学习的《辞海》分词方法.pdf

    针对《辞海》的特点,研究者提出了一种基于深度学习的分词方法,目的是为了提高分词的准确性。 在介绍深度学习分词方法之前,先来了解深度学习在中文分词中的应用。中文分词技术主要有三种类型:基于词典的方法、...

    java版本结巴分词

    1. 基于HMM(隐马尔科夫模型)的统计分词:结巴分词采用最大概率路径搜索的方法,通过已有的大量语料库学习出词频和词序列概率,从而确定最可能的分词结果。 2. 基于词典的精确匹配:Java版结巴分词包含一个大规模...

    es7.0 ik的分词器

    它能够处理复杂的中文词汇关系,如成语、缩写、复合词等,并且具备自学习功能,能根据语料库自动优化分词效果。 **标签解析** "elasticsearch"标签表明讨论的核心是Elasticsearch,一个分布式、RESTful风格的搜索...

    百度中文分词词库

    中文分词是中文信息处理中的关键技术之一,尤其在搜索引擎、自然语言处理和机器学习等领域扮演着至关重要的角色。"百度中文分词词库"是一个专门用于分词的资源,它包含了大量的词汇及其组合方式,为精确地将连续的...

    简单的中文分词程序(练习)

    标题 "简单的中文分词程序(练习)" 指向的是一个个人开发的、用于学习和实践的简单中文分词工具。在这个项目中,开发者可能使用了 Python 语言,因为 Python 是处理自然语言处理任务(NLP,Natural Language ...

    一个简单的英文分词程序

    总的来说,一个简单的英文分词程序需要结合词典、匹配算法和特殊情况处理,而高级的系统则可能利用机器学习技术,如条件随机场,以适应更复杂的文本结构和语言变化。了解和掌握这些知识对于进行高效的英文文本处理和...

Global site tag (gtag.js) - Google Analytics