导语
本篇主要对分词技术中基于统计的分词方法进行深入的探究,先是介绍了统计方法分词是什么以及一般步骤,随后介绍了语言模型,最后介绍了常见的统计算法(维特比算法),并实现了统计算法的分词。
以下为文章结构,本篇内容干货满满:(阅读全文大概需要20分钟)
统计分词
01统计的分词方法
基于统计的分词算法的主要核心是词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。
02步骤
1.需要构建语言模型
2.对句子进行单词划分,划分结果运用统计方法计算概率,获取概率最大的分词方式。(统计方法如隐马尔可夫模型HMM,条件随机场CRF)
统计语言模型
01概念
自然语言处理的专家弗莱德里克·贾里尼克教授说过:一个句子是否合理,就看它的可能性大小如何。统计语言模型(Statistical Language Model)即是用来描述词、语句乃至于整个文档这些不同的语法单元的概率分布的模型,能够用于衡量某句话或者词序列是否符合所处语言环境下人们日常的行文说话方式。
好的统计语言模型需要依赖大量的训练数据,在上世纪七八十年代,基本上模型的表现优劣往往会取决于该领域数据的丰富程度。IBM 曾进行过一次信息检索评测,发现二元语法模型(Bi-gram)需要数以亿计的词汇才能达到最优表现,而三元语法模型(TriGram)则需要数十亿级别的词汇才能达成饱和。
本世纪初,最流行的统计语言模型当属 N-gram,其属于典型的基于稀疏表示(Sparse Representation)的语言模型;近年来随着深度学习的爆发与崛起,以词向量(Word Embedding)为代表的分布式表示(Distributed Representation)的语言模型取得了更好的效果,并且深刻地影响了自然语言处理领域的其他模型与应用的变革。
除此之外,Ronald Rosenfeld[7] 还提到了基于决策树的语言模型(Decision Tree Models)、最大熵模型以及自适应语言模型(Adaptive Models)等。
02N-gram语言模型
假设S表示某一个有意义的句子,由一连串特定顺序排列的w1、w2...wn组成,n为句子长度。我们想知道S在文本中出现的可能性,也就是S的概率P(S)。如果有可能的话,可以把人类有史以来说过的话都统计一下,就知道这句话出现的可能性概率了。但是这个办法不可行,因此就需要一个模型来估算。
展开P(S)得到:
P(S)=P(w1,w2...wn)
根据条件概率公式:
P(w1,w2...wn)=P(w1)·P(w2|w1)·P(w3|w1,w2)···P(wn|w1,w1...wn-1)
其中P(w1)表示第一个词w1出现的概率,P(w2|w1)是在已知第一个词的前提下,第二个词出现的概率。词wn出现的概率取决于它前面的所有词。
计算上,第一个词的概率P(w1)容易计算,逐渐往后最后一个P(wn|w1,w1...wn-1)的估算难度太大。这里就要引出一个俄国数学家马尔可夫(Andrey Markov),他提出假设任意一个词wi出现的概率只同它前面的词wi-1有关,这种假设称为马尔可夫假设。
P(S)=P(w1)·P(w2|w1)·P(w3|w2)·P(wi|w-1)·P(wn|wn-1)
这种统计语言模型就是二元模型(Bigram Model)。
下面具体分析一下如何得到P(S):
P(wi|wi-1)=P(wi-1,wi)/P(wi-1)
其中估计联合概率P(wi-1,wi)和边缘概率P(wi-1,wi),
而有了语料库,只要统计得到wi-1和wi在文本中前后相邻出现了多少次c(wi-1,wi),
统计wi-1在同样的文本中出现的次数c(wi-1),分别除以语料库大小c,从而计算相对频度:
f(wi-1,wi)=c(wi-1,wi)/c
f(wi-1)=c(wi-1)/c
根据大数定理,只要数据量足够大,相对频度就等于概率,因此:
P(wi-1,wi)≈c(wi-1,wi)/c
P(wi-1)≈c(wi-1)/c
得到:
P(wi|wi-1)=c(wi-1,wi)/c(wi-1)
之前提到的某个词只与前一个词有关,形成了二元模型;但是实际生活中,某个词语的出现可能与之前若干个词有关。因此,假设文本中的每个词wi和前面N-1个词有关:
P(wi|w1,w2...wi-1)=P(wi|wi-N+1,wi-N+2...wi-1)
这种假设叫做N-1阶马尔可夫假设,语言模型称为N元语言模型(N-Gram Model),实际中应用最多的是N=3的三元模型;一般N的取值都比较小,因为N的数值越大,需要的算力要求就越大。
03python代码实现
以下是基于词典的分词方法实现,运用unigram语言模型,在P(S)的计算过程P(w1)·P(w2)·P(w3)···P(wi)·P(wn)中,如果存在某个P(wi)=0,那么P(S)=0,计算的结果就跟实际存在偏差。因此,在计算P(w1)·P(w2)·P(w3)···P(wi)·P(wn)变形为
-(logP(w1)+logP(w2)+logP(w3)···logP(wi)+logP(wn)),那么某个概率很小的字不会导致P(S)为0
04其他语言模型
其他语言模型还有:神经网络语言模型(如word2vec)、循环神经网络语言模型、基于决策树的语言模型、最大熵模型以及自适应语言模型等。
HMM与维特比算法
01HMM
隐马尔可夫模型(Hidden Markov Model, HMM)是一种统计模型,是关于时序的概率模型,它描述了含有未知参数的马尔可夫链所产生不可观测的状态随机序列,生成可观测随机序列的过程。(这里不展开HMM的讲解,会在另外一篇文章中详细讲解马尔可夫链等)不清楚HMM的可以先行学习这篇文章:一文掌握马尔科夫链与隐马尔可夫模型。
02维特比算法
维特比算法(Viterbi Algorithm)是一种动态规划算法。维特比算法由安德鲁·维特比(Andrew Viterbi)于1967年提出,用于在数字通信链路中解卷积以消除噪音。此算法被广泛应用于CDMA和GSM数字蜂窝网络、拨号调制解调器、卫星、深空通信和802.11无线网络中解卷积码。现今也被常常用于语音识别、关键字识别、计算语言学和生物信息学中。例如在语音(语音识别)中,声音信号作为观察到的事件序列,而文本字符串,被看作是隐含的产生声音信号的原因,因此可对声音信号应用维特比算法寻找最有可能的文本字符串。
03维特比算法求解HMM问题
用维特比算法针对HMM三大问题中的解码问题(给定模型和观测序列,如何找到与此观测序列最匹配的状态序列的问题)进行求解。
问题描述如下:
首先,我们已经知道状态序列X会产生观测序列O:
但是状态序列X产生的观测序列有很多种可能,每种都有概率,如下所示,比如wo可能有三种可能:喔、我、沃
那么其实问题就变成了最大概率问题,把概率最大的理解为路径最短,转换为了求解最短路径问题:(为了方便标记,标记为了下图中的字母)
算法解决:
接下来就用到了维特比算法求解最短路径,实质上是一种动态规划,把大问题化解为小问题:
步骤1、A->B:
步骤2、A->B->C:
动图:
图片拆解:
步骤3、A->B->C->D:
动图:(可以确定A->C的3条最短路径)
图片拆解:
步骤4、A->B->C->D->E:
动图:(可以确定A->D的2条最短路径)
图片拆解:
最终就得到了A->E的最短路径A->B1->C2->D2->E1,至此,找到了wo ai zhong guo对应的概率最大的中文汉字组合为:我爱中国。
04维特比算法与分词
利用维特比算法进行分词,和使用最短路径Dijkstra算法进行分词类似,也是最短路径法的分词:
如下,假设各点之间权重为1:
维特比算法过程为:
因此得到最短路径为1->6->8->9->11,分词结果为[计算语言学、课程、有、意思]
05python代码实现
以下是根据unigram语言模型和维特比算法进行分词的python代码实现:
作者原创,未经授权请勿转载
了解更多算法或者NLP相关知识可以关注公众号:白话NLP