【IKAnalyzer中文分词器详解-(1)分词逻辑】

分词的目的:把一句话,分解成单字、数量词 、词 (分词算法中称为“词元”)

  1. 初始化词典Trie树结构

  2. 把句子分解成词

  3. 处理歧义与冲突词,删除多余的低权重词元

应用目的: 搜索引擎为一段文字建索引,先是把句子折成词然后按词反向索引 文章段落 (称为倒排序索引)

版本:

<dependency>
    <groupId>com.janeluo</groupId>
    <artifactId>ikanalyzer</artifactId>
    <version>2012_u6</version>
</dependency>

测试程序:

public class IKAnalyzerTest {

    public static void main(String[] args) {
        String str = "这的的确确是一个不折不扣的大优惠";
        String word = "告"; // 不成词的单字
        String words = "的的确确是";
        // System.out.println(segText(str, false));
        System.out.println(segText(words, true));
        // System.out.println(segText(str, true));
    }



    private static String segText(String text, boolean useSmart) {
        StringBuilder result = new StringBuilder();
        IKSegmenter ik = new IKSegmenter(new StringReader(text), useSmart);
        try {
            Lexeme word = null;
            while ((word = ik.next()) != null) {
                result.append(word.getLexemeText()).append(" ");
            }
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
        return result.toString();
    }
}

测试数据:

句子:

的的确确是一个不折不扣的大优惠

普通分词:

这 [ 的的确确 的 的确 的 确 确是 ] [一个 一 个] [不折不扣 不折 不扣] 的 大 优惠

合并分词:

这 ( 的 的确 确是 ) 一个 不折不扣 的 大 优惠

[]()符号解释:

[ 这里放的是分词后有冲突歧义的词,词与词之间有重叠 ] 

 (合并冲突,删除重复后是没有重叠词的)

学习过程的疑问:

  1. [ 的的确确 的 的确 的 确 确是 ]     的的确确 分词输出后,cursor 已经移动到后面,什么情况下需要回过去把 '的' 这个单字也输出?  (Rep:这块是IK分词写的比较好的地方,一次遍历输出所有分词)

  2. 冲突歧义词合并策略? (Rep:这个问题的解答在下一篇文章)

分解 “的的确确是”  的分词过程:

注:下标为自然语义的数字,下面表格为IKAnalyzer分词器依次描述这5个字的处理步骤与解析过程

描述下标

前缀词元列表 tmpHits

下标范围

匹配方式

分词结果 orgLexemes

1

(的)

(0,0)

前缀 & 单字成词 -->

2

的(的)

(0,1)

前缀

(的)

(1,1)

前缀 & 单字成词 -->

3

的的(确)

(0,2)

前缀 

的(确)

(1,2)

前缀 & 成词 -->

的确

(确)

(2,2)

前缀

4

的的确(确)

(0,3)

词尾 (结束)-->

的的确确

的确(确)

(1,3)

无法成词(删除)

确(确)

(2,3)

无法成词(删除)

(确)

(3,3)

5

确(是)

(3,3)

词尾 (结束)-->

确是

(是)

前缀 (结束,且无法单字成词)

步骤详述:

 状态码: 1 成词,0 词前缀(单字无法成词)

Trie树-局部示例

  1. 第一个字 “的” ,即是单字,也是词前缀,所以输出到原始结果集 AnalyzeContext.orgLexemes中,同时不能作为词前缀加入中文分词器的临时词前缀列表中CJKSegmenter.tmpHits,参与到下一个字的前缀匹配。
  2. 第二个字还是 “的” ,作为单字输出到原始结果集,拼接前面的词前缀 变成 “的的” ,成为新的词前缀参与下一个字的前缀匹配,同时也作为单字前缀加入到前缀列表中。
  3. 第三个“确”字,根据Trie树判断,“确”字无法单字成词,不加入结果集,可以与前面两个词前缀拼接为新的词前缀 “的的确” 和 “的确” ,“的确” 作为单独词加入结果集。
  4. 第四个“确”字,单字作为前缀加入前缀列表,与前缀列表中3个前缀再次拼接匹配,其中“的确确”、“确确” 两字无法成词,从前缀列表中删除,“的的确确”作为完整词加入结果集。
    此时前缀列表是:[ "确" ]
  5. 最后一个字 “是” ,单字作为前缀加入前缀列表,与前缀列表中前缀拼接为 “确是” ,成为词加入结果集。
    此时前缀列表是:[ "是" ] ,但 “的的确确是” 这句子已经遍历完成,所以清空前缀列表。
    最后结果集是:[ "的的确确"、"的"、"的确"、"的"、"确是" ]

最后分词结果通过AnalyzeContext#outputToResult 方法输出到最终结果集:

[ "的的确确"、 "的"、 "的确"、 "的"、 "确"、 "确是" ]  ,其中句子中第3个字 "确" 作为遗漏单字输出。至此,普通分词完成。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值