前一篇中介绍了用HMM做中文分词,对于未登录词(out-of-vocabulary, OOV)有良好的识别效果,但是缺点也十分明显——对于词典中的(in-vocabulary, IV)词却未能很好地识别。主要是因为,HMM本质上是一个Bigram的语法模型,未能深层次地考虑上下文(context)。对于此,本文将介绍更为复杂的二阶HMM以及开源实现。

1. 前言

n-gram语法模型

n-gram语法模型用来:在已知前面\(n-1\)个词\(w_1, \cdots, w_{n-1}\)的情况下,预测下一个词出现的概率:

\[P(w_n | w_1, \cdots, w_{n-1})
\]

常见的n-gram有Unigram(一元)、Bigram(二元)、Trigram(三元),分别表示当前词出现的概率为自身词频、只与前面一个词相关、只与前面两个词相关;对应的计算公式如下:

\begin{align}

\text{Unigram:} \quad & \hat{P} (w_3) = \frac{f(w_3)}{N} \cr

\text{Bigram:} \quad & \hat{P} (w_3|w_2) = \frac{f(w_2, w_3)}{f(w_2)} \cr

\text{Trigram:} \quad &\hat{P} (w_3|w_1,w_2) = \frac{f(w_1, w_2, w_3)}{f(w_1,w_2)} \

\end{align}

其中,\(N\)为语料中总词数,\(f(w_i)\)为词\(w_i\)在语料中出现的次数。

两种CWS模型

中文分词(Chinese word segmentation, CWS)的统计学习模型大致可以分为两类:Word-Based Generative ModelCharacter-Based Discriminative Model [3]. Word-Based Generative Model采用最大联合概率来对最佳分词方案建模,比如,对于句子\(c_1^{n}=c_1, \cdots, c_n\),最佳分词\(w_1^m=w_1, \cdots, w_m\)应满足:

\begin{equation}

\arg \mathop{\max}\limits_{w_1^m} P(w_1^m)

\end{equation}

此模型可以简化为二阶Markov链(second order Markov Chain)——当前词的转移概率只与前两个词相关,即为Trigram语法模型:

\begin{equation}

P(w_1^m) = \prod_{i=1}{m}P(w_i|w_1{i-1}) \approx \prod_{i=1}{m}P(w_i|w_{i-2}{i-1})

\end{equation}

Character-Based Discriminative Model采用类似与POS(Part-of-Speech)那一套序列标注的方法来进行分词:

\begin{equation}

\arg \mathop{\max}\limits_{t_1^n} P(t_1^n | c_1^n)

\label{eq:pos}

\end{equation}

\(t_i\)表示字符\(c_i\)对应的B/M/E/S词标注。

HMM分词

根据贝叶斯定理,式\eqref{eq:pos}可改写为

\[\begin{aligned}
\arg \mathop{\max}\limits_{t_1^n} P(t_1^n | c_1^n) & = \arg \mathop{\max}\limits_{t_1^n} \frac{P(c_1^n | t_1^n) P(t_1^n)}{P(c_1^n)} \\
& = \arg \mathop{\max}\limits_{t_1^n} P(c_1^n | t_1^n) P(t_1^n)\\
\end{aligned}
\]

HMM做了两个基本假设:齐次Markov性假设与观测独立性假设,即

  • 状态(标注)仅与前一状态相关;

\[P(t_{i}|t_{1}^{i-1}) = P(t_i| t_{i-1})
\]

  • 观测相互独立,即字符相对独立:

\[P(c_1^n|t_1^n) = \prod_{i=1}^{n} P(c_i|t_1^n)
\]

  • 观测值依赖于该时刻的状态,即字符的出现仅依赖于标注:

\[P(c_i|t_1^n) = P(c_i | t_i)
\]

将上述三个等式代入下式:

\[\begin{aligned}
P(c_1^n | t_1^n) P(t_1^n) & = \prod_{i=1}^{n} P(c_i|t_1^n) \times [P(t_n|t_{1}^{n-1}) \cdots P(t_i|t_{1}^{i-1}) \cdots P(t_2|t_1)] \\
& = \prod_{i=1}^{n} [P(c_i|t_i) \times P(t_i|t_{i-1})]\\
\end{aligned}
\]

因此,用HMM求解式子\eqref{eq:pos}相当于

\begin{equation}

\arg \mathop{\max}\limits_{t_1^n} \prod_{i=1}^{n} [P(t_i|t_{i-1}) \times P(c_i|t_i)]

\end{equation}

二阶HMM的状态转移依赖于其前两个状态,类似地,分词模型如下:

\begin{equation}

\arg \mathop{\max}\limits_{t_1^n} \left[ \prod_{i=1}^{n} P(t_i|t_{i-1},t_{i-2}) P(c_i|t_i) \right] \times P(t_{n+1}|t_n)

\label{eq:tnt}

\end{equation}

其中,\(t_{-1},t_0,t_{n+1}\)分别表示序列的开始标记与结束标记。

2. TnT

论文[2]基于二阶HMM提出TnT (Trigrams'n'Tags) 序列标注方案,对条件概率\(P(t_3|t_2, t_1)\)采取了如下平滑(smooth)处理:

\[P(t_3|t_2, t_1)=\lambda_1 \hat{P}(t_3) + \lambda_2 \hat{P}(t_3|t_2) + \lambda_3 \hat{P}(t_3|t_2, t_1)
\]

为了求解系数\(\lambda\),TnT提出如下算法:

算法中,如果分母为0则置式子的结果为0.

3. Character-Based Generative Model

鉴于两种CWS模型的利弊:

  • Word-Based Generative Model高召回IV、低召回OOV;
  • Character-Based Discriminative Model高召回OOV,低召回IV

论文[3]结合两者提出了Character-Based Generative Model:

\[\arg \mathop{\max}\limits_{t_1^n} P([c,t]_1^n)= \arg \mathop{\max}\limits_{t_1^n} \prod_{i=1}^n P([c,t]_i | [c,t]_{i-k}^{i-1})
\]

论文[3]中公式6的连乘下标k应为i,猜测应该是作者写错了。

4. 开源实现Snownlp

isnowfy大神在项目Snownlp实现TnT与Character-Based Discriminative Model;并且在博文中给出两者与最大匹配、Word-based Unigram模型的准确率比较,可以看出Generative Model的准确率较高。Snownlp的默认分词方案采用的是CharacterBasedGenerativeModel

from snownlp import SnowNLP

s = SnowNLP('小明硕士毕业于中国科学院计算所,后在日本京都大学深造')
print('/'.join(s.words))
# 小明/硕士/毕业/于/中国/科学院/计算/所/,/后/在/日本/京都/大学/深造
# Jieba HMM: 小明/硕士/毕业于/中国/科学院/计算/所/,/后/在/日/本京/都/大学/深造

通过分析TnTCharacterBasedGenerativeModel源码,发现作者在求解\eqref{eq:tnt}、Generative Model的最大值都是采用穷举法,导致了较低的分词效率。此外,HanLP的作者hankcs大神给出了TnT算法的Java实现

5. 参考资料

[1] Manning, Christopher D., and Hinrich Schütze. Foundations of statistical natural language processing. Vol. 999. Cambridge: MIT press, 1999.

[2] Brants, Thorsten. "TnT: a statistical part-of-speech tagger." Proceedings of the sixth conference on Applied natural language processing. Association for Computational Linguistics, 2000.

[3] Wang, Kun, Chengqing Zong, and Keh-Yih Su. "Which is More Suitable for Chinese Word Segmentation, the Generative Model or the Discriminative One?." PACLIC. 2009.

[4] isnowfy, 几种中文分词算法的比较

[5] hankcs, 基于HMM2-Trigram字符序列标注的中文分词器Java实现.

【中文分词】二阶隐马尔可夫模型2-HMM的更多相关文章

  1. 【中文分词】隐马尔可夫模型HMM

    Nianwen Xue在<Chinese Word Segmentation as Character Tagging>中将中文分词视作为序列标注问题(sequence labeling ...

  2. 【整理】图解隐马尔可夫模型(HMM)

    写在前面 最近在写论文过程中,研究了一些关于概率统计的算法,也从网上收集了不少资料,在此整理一下与各位朋友分享. 隐马尔可夫模型,简称HMM(Hidden Markov Model), 是一种基于概率 ...

  3. 图解隐马尔可夫模型(HMM)

    写在前面 最近在写论文过程中,研究了一些关于概率统计的算法,也从网上收集了不少资料,在此整理一下与各位朋友分享. 隐马尔可夫模型,简称HMM(Hidden Markov Model), 是一种基于概率 ...

  4. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑.   本文将通过具体形象的例子来引 ...

  5. Viterbi算法和隐马尔可夫模型(HMM)算法

    隐马尔可夫模型(HMM)及Viterbi算法 https://www.cnblogs.com/jclian91/p/9954878.html HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那 ...

  6. 机器学习中的隐马尔科夫模型(HMM)详解

    机器学习中的隐马尔科夫模型(HMM)详解 在之前介绍贝叶斯网络的博文中,我们已经讨论过概率图模型(PGM)的概念了.Russell等在文献[1]中指出:"在统计学中,图模型这个术语指包含贝叶 ...

  7. 隐马尔可夫模型(HMM)总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项(算法过程,调参等注意事项) 5.实现和具体例子 6.适用场合 内容: 1.算法概述 隐马尔科夫模型(Hidden Markov ...

  8. 自然语言处理---用隐马尔科夫模型(HMM)实现词性标注---1998年1月份人民日报语料---learn---test---evaluation---Demo---java实现

    先放上一张Demo的测试图 测试的句子及每个分词的词性标注为:   目前/t 这/rzv 条/q 高速公路/n 之间/f 的/ude1 路段/n 已/d 紧急/a 封闭/v ./w 需要基础知识 HM ...

  9. 隐马尔可夫模型(HMM) 学习笔记

    在中文标注时,除了条件随机场(crf),被提到次数挺多的还有隐马尔可夫(HMM),通过对<统计学习方法>一书的学习,我对HMM的理解进一步加深了. 第一部分 介绍隐马尔可夫 隐马尔可夫模型 ...

  10. 隐马尔可夫模型:HMM

    隐马尔可夫模型求解三大问题实例剖析 HMM 模型如图所示: 一.隐马尔可夫模型定义 隐马尔可夫模型由初始概率分布.状态转移概率分布以及观测概率分布确定. 设 Q(图中的q)是所有可能的状态的集合,V( ...

随机推荐

  1. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  2. Centos——安装JDK

    写在前面: Just mark! 创建linux虚拟机的时候经常要安装JDK,配置环境变量,却又经常忘记,这里记录一下. 环境:Centos-6.8-x86_64-minimal JDK :jdk-7 ...

  3. ABP文档 - 异常处理

    文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个文档针对Asp.net Mvc和W ...

  4. DBA成长路线

    从开发转为数据库管理,即人们称为DBA的已经有好几年,有了与当初不一样的体会.数据是企业的血液,数据是石油,数据是一切大数据.云计算的基础.作为DBA是数据的保卫者.管理者,是企业非常重要的角色.对于 ...

  5. AJAX实现登录界面

    使用php跳转界面和AJAX都可实现登录界面的跳转的登录失败对的提醒.但是,php跳转的方式 需要额外加载其他界面,用户体验差.AJAX可实现当前页面只刷新需要的数据,不对当前网页进行 重新加载或者是 ...

  6. SharePoint 2013: A feature with ID has already been installed in this farm

    使用Visual Studio 2013创建一个可视web 部件,当右击项目选择"部署"时报错: "Error occurred in deployment step ' ...

  7. 使用git进行源代码管理

    git是一款非常流行的分布式版本控制系统,使用Local Repository追踪代码的修改,通过Push和Pull操作,将代码changes提交到Remote Repository,或从Remote ...

  8. SEO:权重如何做到从0到1

    SEO:权重如何做到从0到1 [写于2016年9月]我真的好久好久没到我的博客上去看过了,今天突然登上 seo.chinaz.com,搜索 dkplus.iteye.com,发现自己的博客在百度收录中 ...

  9. Unity插件之plyGame教程:DiaQ对话系统

    本文为孤月蓝风编写,转载请注明出处:http://fengyu.name/?cat=game&id=296 DiaQ是plyGame旗下的一款对话及任务系统.拥有可视化的对话及任务编辑器,能够 ...

  10. 免费开源的 .NET 分布式组件库 Exceptionless Foundatio

    前言 在互联网时代,分布式应用.系统变得越来越多,我们在使用 .Net 技术构建分布式系统的时候,需要使用到一些组件或者是助手库来帮助我们提高生产力以及应用程序解耦,但是纵观.Net圈,能够符合要求的 ...