Loading

NLP系列-中文分词(基于统计)

上文已经介绍了基于词典的中文分词,现在让我们来看一下基于统计的中文分词。

统计分词:

        统计分词的主要思想是把每个词看做是由字组成的,如果相连的字在不同文本中出现的次数越多,就证明这段相连的字很有可能就是一个词。

统计分词一般做如下两步操作:

1.建立统计语言模型(n-gram)

2.对句子进行单词划分,然后对划分结果做概率计算,获取概率最大的分词方式。这里就用到了统计学习算法,如隐马尔科夫模型(HMM),条件随机场(CRF)等

语言模型:

        语言模型在信息检索,机器翻译,语音识别中承担着重要的任务。这种模型结构简单,直接,但同时也因为数据缺乏而必须采取平滑算法。这里主要介绍n元语言模型(n-gram)。

        假设S表示长度为i,由(W1,W2,....,Wi)字序列组成的句子,则代表S的概率为:

P(S) = P(W1,W2,...,Wi) = P(W1)*P(W2|W1)*P(W3|W2,W1)....P(Wi|W1,W2,...,Wi-1)

即每个字的出现都与他之前出现过的字有关,最后整个句子S的概率为这些字概率的乘积。但是这个计算量很大,所以在这里我们可以利用马尔科夫假设,即当前词只与最多前n-1个有限的词相关:

当n=1时,即出现在第i位上的词Wi独立于历史时,一元文法被记作uni-gram,一元语言模型可以记作:


uni-gram

当n=2时,即出现在第i位上的词wi仅与它前面的一个历史词wi-1有关,二元文法模型被称为一阶马尔可夫链(Markov chain),记作bi-gram,二元语言模型可以记作:


bi-gram

当n=3时,即出现在第i位置上的词wi仅与它前面的两个历史词wi-2和wi-1有关,三元文法模型被称为二阶马尔可夫链,记作tri-gram,三元语言模型可以记作:


tri-gram

在实际应用中,一般使用频率计数的比例来计算n元条件概率。

基于HMM的分词:

        隐含马尔可夫模型(HMM)是将分词作为字在句子中的序列标注任务来实现的(关于HMM稍后会在另一篇文章中详细介绍)。其基本思路是:每个字在构造一个特定词语时都占据着一个特定的位置即词位,一般采用四结构词位:B(词首),M(词中),E(词尾)和S(单独成词)。比如:

'中文/分词/是/文本处理/不可或缺/的/一步/!',

标注后的形式:

'中/B 文/E 分/B 词/E 是/S 文/B 本/M 处/M 理/E 不/B 可/M 或/M 缺/E 的/S 一/B 步/E !/S'。

其中,词位序列代表着HMM中不可见的隐藏状态序列,而训练集中的文本则为可见的观测序列。这样就变成了已知观测序列,求未知的隐藏序列的HMM问题。

本篇文章中,我们使用有标记的监督学习去训练HMM的参数,无监督学习的Baum-Welch方法(EM)会后续更新到本文中。

实现主要分为三步:

1.使用已经分好词的训练集去训练HMM模型,计算频数得到HMM的三要素(初始状态概率,状态转移概率和发射概率)。


训练HMM参数

2.使用Viterbi算法以及训练好的三个概率矩阵,将待分词的句子转换为'BMES'类型的状态序列。

Viterbi求最大概率序列

3.根据已经求出的状态序列,划分句子进行分词。


分词

最后测试结果:


训练参数

 


读取模型并分词

本文实现的HMM分词模型比较简单,分词效果依赖于训练集文本语料库的规模,所以要想得到更好的性能,需要花费人力维护语料库。

待更新。

详细代码可参考GitHub: 代码连接

参考书籍:

《Python自然语言处理实战-核心技术与算法》涂铭,刘祥,刘树春  著

《统计自然语言处理》 宗成庆  著

posted @ 2018-09-25 22:24  hiyoung  阅读(3992)  评论(1编辑  收藏  举报