首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

IKAnalyzer 分词怎么消歧

2012-07-26 
IKAnalyzer 分词如何消歧个人认为分词最根本的有三个步骤:字典加载,根据一定策略分词,消歧。稍微介绍过分词

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的作者致敬,开源自己的源代码,给后者打开方便之门,给新手提供这么好的学习材料。

热点排行