NLP中文分词简介二

回顾

在上一篇文章中,我们讲述了基于词典的规则分词法。这是一种很机械的方法,规则分词法的好坏在很大程度上取决于词典的内容是否全面。我们也通过代码将隶属于规则分词法中的MM法和RMM法进行了讲解。 详情请见NLP中文分词简介一

NLP中文分词的方法二

统计分词法

统计分词法是基于词频的一个统计,那么怎么一个统计法呢? 它是将词与词之间的同时出现概率统计出来,通过概率的大小来判断选取的方案。由于词库的欠缺,我们将在这里较简单介绍一下n-gram法和HMM法的理论部分。

n-gram 法

具体流程:

  1. 使用全切分方法分割出所有分词可能

  2. 建立n-gram模型

  3. 计算每种情况下的概率,选取最大的那种方案

·全切分方法分割 这是一种基于词典的方法,首先是把所有的字符都当做一个一个字来处理,如果说这个句子里面连续的字组合成的词在词典里面的词海匹配到了,那么就将其生成一种切割方案。所以说一个句子会生成很多种不同的切割方案。比如我们之前的“武汉市长江大桥”一例,词库中的词语有[“武汉”,“武汉市长”,“市长”,“长江”,“大桥”]5个词,那么我们进行全切分匹配。我们将得到,以下分割方案(大致为以下几类,可能不是很全,但这并不是重点)。

武/汉/市/长/江/大/桥
武/汉/市/长/江/大桥
武/汉/市/长江/大/桥
武/汉/市/长江/大桥
武/汉/市长/江/大/桥
武/汉/市长/江/大桥
武汉/市长/江/大/桥
武汉/市长/江/大桥
武汉市/长/江/大/桥
武汉市/长/江/大桥
武汉市/长江/大/桥
武汉市/长江/大桥
武汉市长/江/大/桥
武汉市长/江/大桥

划分为上述这几类之后,我们先不急着构造n-gram模型,我们先来看普通情况下,某方案分割的概率公式。

P(x1,x2...xm)=P(x1)P(x2x1)...P(xmx1,x2,...xm1)

大家对上面这个公式应该很清楚吧,就是概率论里面学的条件概率嘛,我就不进行解释了。根据公式,在某一切分方案下,我们只需要将上述的m个词的条件概率相乘即是这个句子在这个方案下的概率。而某个词的条件概率可以通过词库所存有的频数来求解,见下面这个式子。

P(xix1,x2...xi1)=count(x1,x2...xi)/count(x1,x2...xi1)

这种方法虽然思路很直接,但是有不少的缺点。

  1. 当m越大的时候,搜索并计算得到最后一个条件概率的过程将非常的复杂。
  2. 在词库里面,上面的这些条件概率都不会很大,当m逐渐变大的时候,计算机内部处理将会是很多小量连起来相乘,极大影响计算的速度与精度。

·建立n-gram模型

因此,我们需要引入n-gram模型来近似求解,虽然可能会降低一部分的精度,但是速度方面会快上很多。所谓n-gram模型就是n元模型,是对上面普式表达式子的一个简化方案。常见的有bigram和trigram,分别对应二元模型和三元模型。这种方法是基于马尔科夫转移矩阵的一种思想。举例:比如说有中国一词,大家就会和熊猫联系在一起。中国/熊猫这个短语中中国和熊猫的关系很大,如果说换成是中国/袋鼠,出现的次数几乎没有,这样的组合出现的概率就很小。

二元模型即是假设这个词出现的概率仅仅和上一个词有关系,那么第i个词的条件概率的公式就可以转换为

P(xix1,x2...xi1)P(xixi1)=count(xi1,xi)/count(xi1)

三元模型即是假设这个词出现的概率仅仅和上一个词,上上一个词有关系,那么第i个词的条件概率的公式可以转换为

P(xix1,x2...xi1)P(xixi2,xi1)=count(xi2,xi1,xi)/count(xi2,xi1)

知道了n-gram模型后,我们将全切分模型的各种方案代入其中进行计算。在这里,由于我们没有词库,因此我们就主要定性考虑一下上述全切分方案中武汉市/长江这一组合与武汉市长/江这一组合出现的概率大小。想到武汉市,后文出现长江的概率一般,但是想到武汉市长后面出现江的概率呢,可以说是非常非常小的了。因此在这一小段的切分中,我们首选武汉市/长江这一切分方案。

HMM法

HMM法基本思路是认为每个字在构成一个特定词语的时候都占据一个确定的构词结构:B(词首)、M(词中)、E(词尾)、S(单独成词)。如果能判断每个词所在的位置(B,E,M,S标签确定好了),那么分词也就迎刃而解了。

武汉市长江大桥
武/B 汉/M 市/E 长/B 江/E 大/B 桥/E

上述只是我们分词好之后的例子,那么下面我们来看看如何实现分词。

具体流程:

  1. 将模型的输入的字和输出的标签(BMES)抽象表示。【注明】这里我们还不知道每个字具体是哪个标签
  2. 通过HMM及贝叶斯公式等操作计算

·模型的抽象表示

λ=λ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(λ1o1)P(λ2o2)...P(λnon)

同时

P(o)=P(o1)P(o2o1)...P(onon1)

所以,上面我们要最大化的式子转换为

P(λo)P(o)=P(λ1o1)P(o2o1)P(λ2o2)P(o3o2)...P(onon1)P(λnon)

这里,P(λkok)称作发射概率,P(okok1)为转移概率。因此我们只需要在词典中求出发射概率矩阵和转移概率矩阵并使上述目标函数最大化即可。


本文章使用limfx的vsocde插件快速发布