目录html
经过前面几篇系列文章,咱们从分词中最基本的问题开始,并分别利用了1-gram和HMM的方法实现了分词demo。本篇博文在此基础上,重点介绍利用CRF来实现分词的方法,这也是一种基于字的分词方法,在将句子转换为序列标注问题以后,不使用HMM的生成模型方式,而是使用条件几率模型进行建模,即判别模型CRF。以后咱们对CRF与HMM进行对比,一样的咱们最终也会附上CRF分词的实现代码。python
浅谈分词算法(1)分词中的基本问题
浅谈分词算法(2)基于词典的分词方法
浅谈分词算法(3)基于字的分词方法(HMM)
浅谈分词算法(4)基于字的分词方法(CRF)
浅谈分词算法(5)基于字的分词方法(LSTM)git
为了说清楚CRF在分词上的应用,咱们须要简单介绍下条件随机场CRF,咱们不去长篇大论的展开论述,只讨论几个核心的点,并重点阐述下线性链条件随机场,也是咱们在序列标注问题中常常遇到的,如分词、词性标注、韵律标注等等。github
在上一篇博文中,咱们简单介绍了HMM模型,是一个五元组,它的核心围绕的是一个关于序列\(X\)和\(Y\)的联合几率分布\(P(X,Y)\),而在条件随机场的核心围绕的是条件几率分布模型\(P(Y|X)\),它是一种马尔可夫随机场,知足马尔科夫性(这里咱们就不展开阐述了,具体可参考[3])。咱们这里必须搬出一张经典的图片,你们可能在网上的无数博文中也都看到过,其来源与[4]:
从图中咱们能够看出模型之间的演化过程以及模型之间的区别,对于用在分类问题中的逻辑回归与CRF其实都同属于对数线性模型,这里直观的咱们也很好理解,当用CRF模型对\(X\)和\(Y\)序列建模时,咱们须要判断\(x_i\)对应的标签\(y_i\)时其实能够看作一次逻辑回归分类问题,只不过这个分类问题考虑了上下文的序列信息,也就是说单纯的回归分类会损失上下文的序列信息如:有一系列连续拍摄的照片,如今想在照片上打上表示照片里的活动内容的标记,固然能够将每张照片单独作分类,可是会损失信息,例如当有一张照片上是一张嘴,应该分类到“吃饭”仍是分类到“唱K”呢?若是这张照片的上一张照片内容是吃饭或者作饭,那么这张照片表示“吃饭”的可能性就大一些,若是上一张照片的内容是跳舞,那这张照片就更有可能在讲唱K的事情。算法
设有联合几率分布\(P(Y)\),由无向图\(G=(V,E)\)表示,在图\(G\)中,结点表示随机变量,边表示随机变量之间的依赖关系,若是联合几率分布\(P(Y)\)知足成对、局部或全局马尔可夫性,就称此联合几率分布为马尔可夫随机场(Markov random filed)也称几率无向图模型(probablistic undirected graphical model):macos
下面咱们具体阐述下一种特殊也经常使用的线性链条件随机场。ubuntu
给定一个线性链条件随机场\(P(Y|X)\),当观测序列为\(x=x_1x_2...\)时,状态序列为 \(y=y_1y_2...\)的几率可写为(实际上应该写为\(P(Y=y|x;θ)\),参数被省略了)api
\(Z(x)\)做为规范化因子,是对\(y\)的全部可能取值求和。咱们能够用下图来理解:
dom
对于线性链CRF,特征函数是个很是重要的概念(很容易联想到HMM的转移几率和发射几率):函数
通常来讲,特征函数的取值为 1 或 0 ,当知足规定好的特征条件时取值为 1 ,不然为 0 。
对于转移特征这一项:
能够看出外面那个求和号是套着里面的求和号的,这种双重求和就代表了对于同一个特征\(k\),在各个位置\(i\)上都有定义。
基于此,很直觉的想法就是把同一个特征在各个位置\(i\)求和,造成一个全局的特征函数,也就是说让里面那一层求和号消失。在此以前,为了把加号的两项合并成一项,首先将各个特征函数\(t\)(设其共有\(K_1\)个)、\(s\)(设共\(K_2\)个)都换成统一的记号\(f\) :
相应的权重同理:
那么就能够记为:
而后就能够把特征在各个位置\(i\)求和,即
其中\(K=K_1+K_2\)。进而能够获得简化表示形式:
这个形式咱们在下一节介绍CRF分词的时候会使用。
对于一个句子的分词问题咱们在前面的系列博文中已经阐述,输入的句子\(S\)至关于序列\(X\),输出的标签序列L至关于序列\(Y\),咱们要训练一个模型,使得在给定\(S\)的前提下,找到其最优对应的\(L\)。
训练该模型的关键点就是特征函数\(F\)的选取以及每一个特征函数权重\(W\)的肯定,而对于每一个特征函数而言,其输入有以下四个要素:
它的输出值是0或者1,0表示要评分的标注序列不符合这个特征,1表示要评分的标注序列符合这个特征。咱们发现这里的特征函数在选取当前\(s_i\)的对应标签\(l_i\)时,只考虑了其前一个标签\(l_{i-1}\),这就是使用了咱们上一节阐述的线性链条件随机场,而公式中的f就是咱们这里的特征函数。
Note:在实际的应用时,除了单一的特征选取,咱们一般会经过构造复合特征的方式,考虑更多的上下文信息。
在上一篇博文中咱们介绍了HMM在分词中的使用,那么读者确定会问既然HMM已经能完成任务,为何还须要CRF来从新搞一波,缘由就是CRF比HMM更强大。
对于序列\(L\)和\(S\),根据以前的介绍咱们易知以下公式:
其中\(w_i\)为\(S\)中第\(i\)个词,\(l_i\)为第\(i\)个词的标签,公式中前半部分为状态转移几率,后半部分为发射几率。咱们用对数形式表示该式:
把这个式子与CRF的简化形式比较,不难发现,若是咱们把第一个HMM式子中的log形式的几率看作是第二个CRF式子中的特征函数的权重的话,咱们会发现,CRF和HMM具备相同的形式。因此能够说:每个HMM模型都等价于某个CRF。
总结下二者的区别:
Note:其实在HMM和CRF之间还有一个MEMM,即最大熵马尔科夫模型,MEMM模型是对转移几率和表现几率创建联合几率,统计时统计的是条件几率,但MEMM容易陷入局部最优,是由于MEMM只在局部作归一化(标记偏置问题),不过通常用的很少咱们就不过多介绍,可参考[5]
下面咱们利用wapiti来实现一个简单的CRF分词器。相关说明:
https://github.com/xlturing/machine-learning-journey/tree/master/seg_crf
你们能够直接看下源代码
这个训练集和测试集都相对较小,效果还不错,读者在真正上线使用时还须要依赖词典等诸多与场景对应的分词特性,本文更加关注原理和理解。