ik分词器 IKArbitrator.judge 源码阅读

judge的源码如下

 /**
  * 歧义识别
  * @param lexemeCell 歧义路径链表头
  * @param fullTextLength 歧义路径文本长度
  * @return
  */
 private LexemePath judge(QuickSortSet.Cell lexemeCell, int fullTextLength) {
     //候选路径集合
     TreeSet<LexemePath> pathOptions = new TreeSet<>();
     //候选结果路径
     LexemePath option = new LexemePath();

     //对crossPath进行一次遍历,同时返回本次遍历中有冲突的Lexeme栈
     Stack<QuickSortSet.Cell> lexemeStack = this.forwardPath(lexemeCell, option);

     //当前词元链并非最理想的,加入候选路径集合
     pathOptions.add(option.copy());

     //存在歧义词,处理
     QuickSortSet.Cell c = null;
     while (!lexemeStack.isEmpty()) {
         c = lexemeStack.pop();
         //回滚词元链
         this.backPath(c.getLexeme(), option);
         //从歧义词位置开始,递归,生成可选方案
         this.forwardPath(c, option);
         pathOptions.add(option.copy());
     }
     
     //返回集合中的最优方案
     return pathOptions.first();

 }

流程

  1. 首先经过第一次crossPath遍历,构造一个无歧义词元组合option,然后将option作为候选的组合,放入到pathOptions中。this.forwardPath返回一个与 无歧义词元组合option有冲突的词元栈lexemeStack。
    注意: 有冲突的lexeme栈中的元素是Cell,每个Cell元素都有 prev和next指针,可以获取到前面和后面的元素。
//对crossPath进行一次遍历,同时返回本次遍历中有冲突的Lexeme栈
Stack<QuickSortSet.Cell> lexemeStack = this.forwardPath(lexemeCell, option);
//当前词元链并非最理想的,加入候选路径集合
pathOptions.add(option.copy());
  1. 接下来会循环冲突栈中的元素.
    2.1 首先弹出栈顶元素 c 。
    2.2 回滚词元链,就是删除上一次option中与 c 中词元有交差的尾部(bachPath方法中是循环方法,会直到删除没有交叉词元的时候,才停止删除)。
    2.3 然后再次执行forwardPath方法,生成可选的方案。(就是以 c 元素为起始,遍历c的词元和c的下一个词元,再下一个词元,直到结束,将没有冲突的词元添加到option中,此次方法中生成的冲突栈,并没有被获取,不再使用)
    2.4 将生成的 option 词元链,拷贝一份加入到 pathOptions中
    2.5 循环此步骤,直到冲突栈lexemeStack中没有元素为止。
//存在歧义词,处理
     QuickSortSet.Cell c = null;
     while (!lexemeStack.isEmpty()) {
         c = lexemeStack.pop();
         //回滚词元链
         this.backPath(c.getLexeme(), option);
         //从歧义词位置开始,递归,生成可选方案
         this.forwardPath(c, option);
         pathOptions.add(option.copy());
     }
  1. 返回pathOptions中的第一个方案,作为最优方案。(pathOptions是一个有序集合,在往里添加元素的时候,是使用LexemePath.compareTo方法进行比较。根据比较规则,排在第一个的方案,被采用为最优的方案)
//返回集合中的最优方案
return pathOptions.first();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值