jieba 源码解析

452 查看

阅读动机

jieba分词是Python 里面几个比较流行的中文分词工具之一。为了理解分词工具的工作原理,以及实现细节对jieba进行了详细的阅读。

读代码之前,我有几个问题是这样的:

  • 分词工具的实现都有哪几个步骤?
  • 结巴分词的文档说是使用了HMM模型,但是HMM 模型是如何运用在分词工具中的?,以及模型是如何产生的?
  • 几乎所有的分词工具都支持用户添加词库,但是用户词库到底在分词过程中扮演什么角色?

简介

jieba 分词支持三种分词模式,官方文档给出了如下的Example

考虑到文章篇幅的限制,我会详细解读默认模式也就是jieba.cut方法的所有实现。 阅读过程中会涉及一些算法原理,本文不做详细解释。

宏观逻辑

上面面的流程图很粗糙,但是很好的说明了大概的步骤。 首先使用概率无向图,获得最大概率路径.概率无向图的构建完全依赖于字典,最大概率路径求解也是依赖字典中的词频。 最后使用HMM模型来解决未登录词(Out Of Vocabulary) ,所以在整个过程如果没有模型也是可以的,只要你有一个很好的词典。最大概率路径的求解还有很多方法,记得HanLP的求解就有实现最短路径。

粗分

首先会使用正则将文本切分,正则什么样?就跟现则的是默认模式还是全模式。正则如下:

到底有什么区别: 我写了个测试:

输出:

上面输出的list 里面每一个被成为block。

细分

对粗分产生的blok ‘abc’这样的不能被re.han匹配的会直接作为结果反回。对于和中文连在一起的会进入下一个阶段细分。

DAG构建

细分的第一步是构建 DAG 即有向无环图。构建的核心代码如下:

怎么个意思呢: 举个例子 我来到北京清华大学 产生的DAG 结果如下: