在上一篇文章中,我们讲述了基于词典的规则分词法。这是一种很机械的方法,规则分词法的好坏在很大程度上取决于词典的内容是否全面。我们也通过代码将隶属于规则分词法中的MM法和RMM法进行了讲解。 详情请见NLP中文分词简介一
统计分词法是基于词频的一个统计,那么怎么一个统计法呢? 它是将词与词之间的同时出现概率统计出来,通过概率的大小来判断选取的方案。由于词库的欠缺,我们将在这里较简单介绍一下n-gram法和HMM法的理论部分。
具体流程:
使用全切分方法分割出所有分词可能
建立n-gram模型
计算每种情况下的概率,选取最大的那种方案
·全切分方法分割 这是一种基于词典的方法,首先是把所有的字符都当做一个一个字来处理,如果说这个句子里面连续的字组合成的词在词典里面的词海匹配到了,那么就将其生成一种切割方案。所以说一个句子会生成很多种不同的切割方案。比如我们之前的“武汉市长江大桥”一例,词库中的词语有[“武汉”,“武汉市长”,“市长”,“长江”,“大桥”]5个词,那么我们进行全切分匹配。我们将得到,以下分割方案(大致为以下几类,可能不是很全,但这并不是重点)。
武/汉/市/长/江/大/桥
武/汉/市/长/江/大桥
武/汉/市/长江/大/桥
武/汉/市/长江/大桥
武/汉/市长/江/大/桥
武/汉/市长/江/大桥
武汉/市长/江/大/桥
武汉/市长/江/大桥
武汉市/长/江/大/桥
武汉市/长/江/大桥
武汉市/长江/大/桥
武汉市/长江/大桥
武汉市长/江/大/桥
武汉市长/江/大桥
划分为上述这几类之后,我们先不急着构造n-gram模型,我们先来看普通情况下,某方案分割的概率公式。
P(x1,x2...xm)=P(x1)P(x2∣x1)...P(xm∣x1,x2,...xm−1)
大家对上面这个公式应该很清楚吧,就是概率论里面学的条件概率嘛,我就不进行解释了。根据公式,在某一切分方案下,我们只需要将上述的m个词的条件概率相乘即是这个句子在这个方案下的概率。而某个词的条件概率可以通过词库所存有的频数来求解,见下面这个式子。
P(xi∣x1,x2...xi−1)=count(x1,x2...xi)/count(x1,x2...xi−1)
这种方法虽然思路很直接,但是有不少的缺点。
·建立n-gram模型
因此,我们需要引入n-gram模型来近似求解,虽然可能会降低一部分的精度,但是速度方面会快上很多。所谓n-gram模型就是n元模型,是对上面普式表达式子的一个简化方案。常见的有bigram和trigram,分别对应二元模型和三元模型。这种方法是基于马尔科夫转移矩阵的一种思想。举例:比如说有中国一词,大家就会和熊猫联系在一起。中国/熊猫这个短语中中国和熊猫的关系很大,如果说换成是中国/袋鼠,出现的次数几乎没有,这样的组合出现的概率就很小。
二元模型即是假设这个词出现的概率仅仅和上一个词有关系,那么第i个词的条件概率的公式就可以转换为
P(xi∣x1,x2...xi−1)≈P(xi∣xi−1)=count(xi−1,xi)/count(xi−1)
三元模型即是假设这个词出现的概率仅仅和上一个词,上上一个词有关系,那么第i个词的条件概率的公式可以转换为
P(xi∣x1,x2...xi−1)≈P(xi∣xi−2,xi−1)=count(xi−2,xi−1,xi)/count(xi−2,xi−1)
知道了n-gram模型后,我们将全切分模型的各种方案代入其中进行计算。在这里,由于我们没有词库,因此我们就主要定性考虑一下上述全切分方案中武汉市/长江这一组合与武汉市长/江这一组合出现的概率大小。想到武汉市,后文出现长江的概率一般,但是想到武汉市长后面出现江的概率呢,可以说是非常非常小的了。因此在这一小段的切分中,我们首选武汉市/长江这一切分方案。
HMM法基本思路是认为每个字在构成一个特定词语的时候都占据一个确定的构词结构:B(词首)、M(词中)、E(词尾)、S(单独成词)。如果能判断每个词所在的位置(B,E,M,S标签确定好了),那么分词也就迎刃而解了。
武汉市长江大桥
武/B 汉/M 市/E 长/B 江/E 大/B 桥/E
上述只是我们分词好之后的例子,那么下面我们来看看如何实现分词。
具体流程:
·模型的抽象表示
λ=λ1λ2λ3...λn 代表输入的句子,n为句子长度,λi表示字,o=o1o2...on表示输出的标签(B/M/E/S)。理想的输出为:
max=maxP(o1o2...on∣λ1λ2...λn)
·HMM计算
通过贝叶斯公式可知
P(o∣λ)=P(o,λ)/P(λ)=P(λ∣o)P(o)/P(λ)
其中λ为句子的输入,o为整个句子所有字的标签。由于上式中所有方案的分母不会变,所以最大化P(o∣λ)等价于最大化P(λ∣o)P(o)。 为了简化该概率,我们基于独立性假设和齐次马尔科夫假设,即
P(λ∣o)=P(λ1∣o1)P(λ2∣o2)...P(λn∣on)
同时
P(o)=P(o1)P(o2∣o1)...P(on∣on−1)
所以,上面我们要最大化的式子转换为
P(λ∣o)P(o)=P(λ1∣o1)P(o2∣o1)P(λ2∣o2)P(o3∣o2)...P(on∣on−1)P(λn∣on)
这里,P(λk∣ok)称作发射概率,P(ok∣ok−1)为转移概率。因此我们只需要在词典中求出发射概率矩阵和转移概率矩阵并使上述目标函数最大化即可。
本文章使用limfx的vsocde插件快速发布