读书人

IKAnalyzer 分词怎么消歧

发布时间: 2012-07-26 12:01:08 作者: rapoo

IKAnalyzer 分词如何消歧
个人认为分词最根本的有三个步骤:字典加载,根据一定策略分词,消歧。稍微介绍过分词程序的基本词典数据结构,接着看看如何进行消歧。分词不用多说,比较简单。

拿IKAnalyzer分词器为例,IKAnalyzer的切分方式是细粒度切分,当不需要智能处理时,其就把切出的所有词输出,但若启动了智能处理,那么接下来就是要进行消歧工作。

细粒度切出的词比较杂,但是经过智能处理后,其看上去就像是采用MM算法或者RMM算法切分出。

要想知道IKAnalyzer是如何进行消歧的,有必要先查清其实如何进行切分的,切分的词有何特点。下面这段代码是IKAnalyzer汉字切分的主要核心代码:

void process(AnalyzeContext context , boolean useSmart){QuickSortSet orgLexemes = context.getOrgLexemes();Lexeme orgLexeme = orgLexemes.pollFirst();LexemePath crossPath = new LexemePath();while(orgLexeme != null){if(!crossPath.addCrossLexeme(orgLexeme)){//找到与crossPath不相交的下一个crossPathif(crossPath.size() == 1 || !useSmart){//crossPath没有歧义 或者 不做歧义处理//直接输出当前crossPathcontext.addLexemePath(crossPath);}else{//对当前的crossPath进行歧义处理QuickSortSet.Cell headCell = crossPath.getHead();LexemePath judgeResult = this.judge(headCell, crossPath.getPathLength());//输出歧义处理结果judgeResultcontext.addLexemePath(judgeResult);}//把orgLexeme加入新的crossPath中crossPath = new LexemePath();crossPath.addCrossLexeme(orgLexeme);}orgLexeme = orgLexemes.pollFirst();}//处理最后的pathif(crossPath.size() == 1 || !useSmart){//crossPath没有歧义 或者 不做歧义处理//直接输出当前crossPathcontext.addLexemePath(crossPath);}else{//对当前的crossPath进行歧义处理QuickSortSet.Cell headCell = crossPath.getHead();LexemePath judgeResult = this.judge(headCell, crossPath.getPathLength());//输出歧义处理结果judgeResultcontext.addLexemePath(judgeResult);}}


最后向IKAnalyzer的作者致敬,开源自己的源代码,给后者打开方便之门,给新手提供这么好的学习材料。

读书人网 >开源软件

热点推荐