首页 > > > 1.2.2 基于HMM的分词法
上一节我们已经了解了基于词表匹配的两种分词方法,方法很直接,也很容易理解。本节我们来介绍一种看上去更“高级”一些的方法,一个基于统计的方法。
其实基于统计的方法有很多种,例如“基于HMM的分词方法”、“基于CRF的分词方法”、“基于深度学习的端到端的分词方法”等,本质上都是基于词许撩标注的统计方法。这一节我们就简要介绍一下基于 HMM 的方法好了,这里的 HMM 全称是“Hidden Markov Model”,也就是基于隐马尔科夫模型的方法。我们也通过这种方法的实现方式来让大家对基于统计的方法做个管中窥豹的了解。
马尔可夫过程在统计学上是一种随机过程,用大白话来说的话,马尔可夫模型就是一个观察多个状态转移概率的模型。你可能会很纠结,一会儿叫“隐马尔可夫”,一会儿叫“马尔可夫”,究竟有什么区别呢?我们先把字眼上的纠结放在一边,看看具体是怎么做的就好了。
别忘了我们是为了解决分词问题的,为了解决个问题,在中文分词任务中,我们设计了几个词位标签用来标注一句话中每个字的词位属性。词首用“B”(Begin ),词中用“M”(Middle),词尾用“E ”(End),单字词用“S”(Single )——也就是一个字又是词首又是词尾,又是词中的情况。都是用英文单词的开始字母来做的标示。那么,一句话就被标识成了这种样子:

HMM标注分词
当然其它句子也是这样一个一个标过去就可以了。我们需要在一个统计模型中学到一些东西。
如果用 HMM 来建模的话,应该是我们观察到的状态转移就是上面 X 这一行的中文字符的转移变化。下面的隐藏的 Y 状态就是词首、词尾这些状态的状态。通过统计都能统计到各自的转移矩阵。还有一个 Y 到 X 转移的矩阵。一共三个矩阵都能得到。



这里的

表示的是连乘关系, 整个式子表示的是这样一个含义:把一个句子输入模型,用指针指向第 t 个字符,计算在 t-1 字符为某个 Y 状态的情况下,第 t 个字符为某个 Y(也就是词头、词尾、词中、单字词)的概率;与其输出某个 X 的概率的乘积。并且要连续乘下去,直到最后一个字符。这看上去确实有点头晕,不过我们用白话解释一下。
首先,这个公式求出来的最大值才是正确的分词方式。也就是说呢,如果你要给一个句子去划分从哪里切开,要保证两个事情。
第一点,一个Y和另一个Y的衔接要自然,比如,“B”后面是不可能出现“S”的。
第二点,一个Y要输出一个概率更合适的X,因为即便是“B”后面可以跟着“E”或者“M”,但是如果“E”和“M”位上的词从来就没有在语料中出现过,那自然概率就是0。那么这种划分当然就不能让刚才这个连程的结果最大。
如此一来,我们再观测到一句话的输入的时候,相当于观测到了 X ,然后我们又知道 Y 到 X 的转移概率,现在来猜(准确说是计算)Y 的每个状态是什么词位属性最合理。也就是在语料统计中使得 Y 和 Y 的转移概率,以及 Y 和 X 的转移概率最大的,也就是最协调的情况。这就是基于 HMM 的分词方法的原理,结巴分词中是支持使用 HMM 来进行分词的,模型不用我们来进行统计训练,用默认的就可以。
在 jieba 分词工具中的 jieba.cut 这个方法默认就使用了HMM算法,如果你想关掉它的话,可以这样调用:
seg_list = jieba.cut("我来到北京清华大学", cut_all_True, HMM=False)只不过在这个 case 中你看不到什么输出结果上的区别。我建议在这个地方我们不要这么纠结,在工程中可以只使用默认的 HMM=True 的方式即可,原理就是我们前面说的算法原理。
思考题:请尝试分析一下 HMM 这种分词方法的优缺点,并在留言区和我互动
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69954080/viewspace-3125883/ ,如需转载,请注明出处,否则将追究法律责任。