HMM 实践之一 Viterbi 中文分词

Posted 自然语言处理实践

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HMM 实践之一 Viterbi 中文分词相关的知识,希望对你有一定的参考价值。

分词 (Word segmentation) 是中文自然语言处理的第一步,也是会影响模型后续效果的重要步骤。可以基于字典进行正向、逆向和双向匹配进行分词,但是该方法不能较好的解决歧义问题。 基于统计的隐马尔可夫模型 (Hidden Markov model, HMM) 和条件随机场 (Conditional random field, CRF) 都属于概率图模型 (Probabilistic graphical model, PGM) 的范畴,将中文分词看做序列标注问题,即预测标记每个字为(词首), (词中), (词尾) 和 (单个词) 四个标记中的一种。比如会将 我喜欢吃苹果 这句话标记为 SBESBE,即分词结果为 我 / 喜欢 / 吃 / 苹果。


HMM 模型比 CRF 模型简单,因此先介绍 HMM 模型。知乎上有很多关于 HMM 模型的讨论 [1, 2],在这里我以中文分词任务 (隐藏状态为 BMES) 为例将 HMM 模型的基本概念总结为 '3-2-3':

[1] 第一个 '3' 表示模型有三个参数:

初始隐藏状态概率向量 (即 BMES 的初始概率),

注:图中的数据来自于 jieba 分词工具包 [3] (具体见左下角 阅读原文), 且概率是取 log 后的结果,下同。因此非常小的复数 -3.14e+100 表示原始概率为 0。由于不会以 M 或者 E 标记一句话的第一个字符,因此它们的概率是 0。


隐藏状态转移概率矩阵 (即 BMES 之间互相转移的概率) ,

HMM 实践之一 Viterbi 中文分词

注:举例来说,第一行表示 t-1 时刻隐藏状态为 B,t 时刻隐藏状态依次为 B M E S 的概率。需要注意的是,若 t-1 时刻隐藏状态为 B,那么 t 时刻状态不可能为 B 或者 S,因此对应的 B 和 S 的概率都为 -3.14e+100。


观测序列生成概率矩阵 (即 BMES 条件下生成每个字的概率)。

HMM 实践之一 Viterbi 中文分词

注:这四个表格分别展示了特定隐藏状态下,生成某个字的概率 (这里只展示了 top 3 的字)。举例来说,最后一个表格表示隐藏状态为 S 时,产生某个字的概率。不出意外,的 了 是 这些停用词作为单个词的概率还是非常大的。表格中的 “中”,“国”,“國” 等字的出现应该是与 jieba 训练使用的人民日报的语料有关 [4]。


[2] 第二个 '2' 表示两个假设 [5]:

一阶马尔科夫假设:时刻 t 隐藏状态的概率分布仅由 t-1 时刻的隐藏状态决定。

独立输出假设时刻 t 的观测值仅由时刻 t 的隐藏状态生成。


[3] 第三个 '3' 表示三个问题:

(1) 给定模型,计算某个观测序列的概率。解决方案:Forward-backward

(2) 给定模型和某个观测序列,求解最可能的隐藏状态序列。解决方案:Viterbi

(3) 给定观测序列,估计模型的参数。解决方案:Baum-Welch.


在这里我们 focus 在第二个问题上,因为中文分词问题就属于该问题。求解最可能的隐藏状态序列,需要给定模型参数,在这里我使用 jieba 分词工具包算好的参数 (如何算模型参数,后续还会发文介绍)。另外,jieba 已经实现了 HMM 分词 [6], 在这里我对 Viterbi 方法代码进行了重写和详细注释:

  • 将变量名与《统计学习方法》[7] 中第 185 页的 算法10.5 (维特比算法) 的数学符号一一对应,方便大家理解书中的数学公式。

  • 修改了前一时刻最大概率的计算方法和最优路径回溯的求解方法。

注:因为概率已经取 log,因此公式中的乘法变成了加法。第 25 行,对 t-1 时刻的隐藏状态转移进行了限制,具体为下图。也就是说,t-1 时刻隐藏状态为 E 或者 S,t 时刻隐藏状态才可能为 B,其他以此类推。 同理,第 31 行对开始回溯的隐藏状态限制为 E 或者 S。



HMM 与 RNN 的联系与区别

两个模型都跟时序相关,并且都有 “隐藏” 的部分。如果把一阶马尔科夫假设 (当然可以高阶马尔科夫假设) 的 HMM 类比于 bigram,那么 RNN 就可以类比于 ngram, 因此 RNN 可以记忆更长的时刻,更多的信息,适合 big data 时代的数据分析。


感兴趣的同学可以把代码拉下来跑跑试试,只有实践才能加深概念理解。



参考文献


[1] https://www.zhihu.com/question/20962240 

[2] https://zhuanlan.zhihu.com/p/21930101

[3] https://github.com/fxsjy/jieba

[4] https://github.com/fxsjy/jieba/issues/7

[5] 数学之美, 吴军 

[6] https://github.com/fxsjy/jieba/blob/master/jieba/finalseg/__init__.py

[7] 统计学习方法, 李航



目前我主要关注统计机器学习、深度学习和自然语言处理方向的相关论文与实践,大家如果感兴趣可以一起讨论学习。因为一个人自学的效率不高,而且对概念的理解也不深刻,共同学习的回报更大,希望和大家在沟通中加深印象,共同进步!

以上是关于HMM 实践之一 Viterbi 中文分词的主要内容,如果未能解决你的问题,请参考以下文章

结巴分词

Python 流行的中文分词工具之一 jieba

python中文分词,使用结巴分词对python进行分词

转:从头开始编写基于隐含马尔可夫模型HMM的中文分词器

序列标注(HMM/CRF)

HanLP中人名识别分析