IK中文分词器原理

目录

1.字符类型分类

目前共有5种字符类型:

static int identifyCharType(charinput){
   if(input >= '0'&& input <= '9'){
      return CHAR_ARABIC;//阿拉伯数字
     
   }else if((input >= 'a'&& input <= 'z')
         || (input >= 'A' && input <='Z')){
      return CHAR_ENGLISH;//英文字符
     
   }else {
      Character.UnicodeBlock ub = Character.UnicodeBlock.of(input);
     
      if(ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS 
           
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS 
           
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A){
         //目前已知的中文字符UTF-8集合
        
return CHAR_CHINESE;//中文字符
        
      }else if(ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS//全角数字字符和日韩字符
            //
韩文字符集
           
|| ub == Character.UnicodeBlock.HANGUL_SYLLABLES
           
|| ub == Character.UnicodeBlock.HANGUL_JAMO
           
|| ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO
           
//日文字符集
           
|| ub == Character.UnicodeBlock.HIRAGANA//平假名
           
|| ub == Character.UnicodeBlock.KATAKANA//片假名
           
|| ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS){
         return CHAR_OTHER_CJK;//全角数字字符和日韩字符

        
      }
   }
    returnCHAR_USELESS;//其他的不做处理的字符
}

2.分词大致流程

public synchronized Lexeme next()throws IOException{
   Lexeme l = null;
   while((l = context.getNextLexeme()) == null ){
      /*
       * 从reader中读取数据,填充buffer
       * 如果reader是分次读入buffer的,那么buffer要  进行移位处理
       * 移位处理上次读入的但未处理的数据
       */
//从缓冲区读入数据,缓冲区默认大小为4k
      int available = context.fillBuffer(this.input);
      if(available <= 0){
         //reader已经读完
         context.reset();
         return null;
         
      }else{
         //初始化指针
//获取缓冲区的第一个字符的位置,值,类型 
         context.initCursor();
         do{
                 //遍历子分词器
            /*
            * 处理英文字符及阿拉伯数字子分词器 LetterSegmenter
               * 处理中文数量词的子分词器 CN_QuantifierSegmenter
               * 处理中文词的子分词器 CJKSegmenter
            * */
//调用不同的子分词器进行分词处理
                 for(ISegmenter segmenter : segmenters){
                    segmenter.analyze(context);
                 }
                 //字符缓冲区接近读完,需要读入新的字符
                 if(context.needRefillBuffer()){
                    break;
                 }
            //向前移动指针
         }while(context.moveCursor());//移动指针,不断获取之后的字符的位置,值,类型
         //重置子分词器,为下轮循环进行初始化
         for(ISegmenter segmenter : segmenters){
            segmenter.reset();
         }
      }
      //对分词进行歧义处理
      this.arbitrator.process(context, configuration.isUseSmart());
      //将分词结果输出到结果集,并处理未切分的单个CJK字符
      context.outputToResult();
      //记录本次分词的缓冲区位移
      context.markBufferOffset();          
   }
   return l;
}

 

主要分为三步:

1)  不断移动缓存区的指针,获取不同的字符的位置,值,类型

2)  调用不用的子分词器进行分词处理

3)  对最终的分词结果进行歧义处理

 

同时注意:IK分词器默认开启大写转小写的功能,即enable_lowercase=true

3.子分词器

IK分词器内置3种子分词器,分别是:

1)LetterSegmenter:处理英文字母和阿拉伯字母的子分词器

2)CN_QuantifierSegmenter:处理中文数量词的子分词器

3)CJKSegmenter:处理中文词的子分词器

每个具体的分词由以下结构体表示:

/**
 * IK词元对象 
 */
  public class Lexeme implements Comparable<Lexeme>{
   //lexemeType常量
   //未知
   public static final int TYPE_UNKNOWN = 0;
   //英文
   public static final int TYPE_ENGLISH = 1;
   //数字
   public static final int TYPE_ARABIC = 2;
   //英文数字混合
   public static final int TYPE_LETTER = 3;
   //中文词元
   public static final int TYPE_CNWORD = 4;
   //中文单字
   public static final int TYPE_CNCHAR = 64;
   //日韩文字
   public static final int TYPE_OTHER_CJK = 8;
   //中文数词
   public static final int TYPE_CNUM = 16;
   //中文量词
   public static final int TYPE_COUNT = 32;
   //中文数量词
   public static final int TYPE_CQUAN = 48;
   
     /*词元的起始位移,指缓冲区的偏移量,因为不可能一次性把所有数据分析完,必须分段分析,因此     
*offset指的是每次读取缓存区的偏移量(和起始位置比较)*/
   private int offset;
//特定缓冲区内词元的起始位置
    private int begin;
    //词元的长度
    private int length;
    //词元文本
    private String lexemeText;
    //词元类型
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值