因为大规模语料的建立,统计机器学习方法的研究与发展,基于统计的中文分词成为主流
将每个词看做是由词的最小单位字组成的,如果相连的字在大量的文本中出现的次数越多,则说明这几个字组成词的概率越大。因此可以用字与字相邻出现的频率来反映成词的可靠度,统计语料中相邻出现的各个字的组合的频度,当组合频度高于某一个临界值时,我们便认为其构成一个词。
建立统计语言模型。
对句子进行单词划分,然后对划分结果进行概率统计,获得概率最大的分词方式。这里就用到了统计学习方法,如隐含马尔可夫(HMM)、条件随机场(CRF)等。
统计语言模型是自然语言处理的基础,被广泛应用于机器翻译、语音识别、印刷体或手写体识别、拼音纠错、汉字输入和文献查询等。
语言的数学本质就是说话者将一串信息在头脑中做了一次编码,编码的结果是一串文字,而如果接受的人懂得这门语言,他就可以用这门语言的解码方式获得说话人想表达的信息。那么不免想到将编码规则教给计算机,这就是基于规则的自然语言处理。但是事实证明基于规则行不通,因为巨大的文法规则和语言的歧义性难以解决。所以出现了基于统计的自然语言处理(NLP)。基于统计的NLP的核心模型是通信系统加隐含马尔可夫模型。
看一个句子是否合理,就看它的合理性有多少,就是它出现的概率大小:
假定句子 S(W1,W2,......,Wn) Wi 代表词
其概率为 P(S) = P(W1,W2,.......,Wn)
根据条件概率公式,每个词出现的概率等于之前每个词出现的条件概率相乘,于是
P(W1,W2,......,Wn) = P(W1) · P(W1 | W2) · P(W3 | W1,W2) ··· P(Wn | W1,W2,......Wn-1)
但是这样计算量太大,句子越长越麻烦,因此Andrey Markov 提出了一种偷懒的方法,即马尔可夫假设:假设任意一个词出现的概率只与它前面的一个词有关。
因此 P(S) = P(W1) · P(W1 | W2) · P(W3 | W2) ··· P(Wn | Wn-1)
这就是二元模型(Bigram Model), 相应的,高阶语言模型即任意一个词 Wi 出现的概率只与它前面的 i-1 个词有关。元数越高越准确,但相应越复杂,越难实现,我们一般使用三元模型就够了。
那么如何计算这个概率呢,这就是统计语言模型的核心统计了,实际上是做了近似处理,即在统计量足够大的情况下:
因为 P(Wi | Wi-1) = P(Wi-1,Wi) / P(Wi-1) = 联合概率 / 边缘概率
=两个词一起出现的次数 / 单个词出现的次数
统计中可能出现没有统计到某个词(边缘概率为0)或者某两个词在一起的情况只出现了一次(联合概率为1)的情况,就会导致十分绝对的概率出现,模型就不可靠。直接的解决方法是增加统计的数据量,但是数据不够时。需要使用一个重新计算概率的公式,就是古德-图灵估计(Good-Turing Estimate)
古德-图灵估计(Good-Turing Estimate)
其原理是:对于没有出现的概率,我们从概率总量中分配一小部分给它们,看见的事件的概率总量就小于1,这样就不会出现概率为1和0的情况了。对应的语言模型也要做一些调整,最早由卡兹(S.M.Kate)提出,称为卡兹退避法(Kate backoff)。
隐含马尔可夫模型(HMM)是将分词作为字在字串中的序列标注任务来实现的。其基本思路:每个字在构造一个特定的词语是都占据一个确定的构词位置(词位),规定每个字最多有四个构词位置,B(词首)、M(词中)、E(词尾)、S(单独成词),用数学抽象表示如下:用 λ = λ₁λ₂···λn代表输入的句子,n为句子长度,λ表示字,ο = ο₁ο₂···ο···表示输出的标签,理想的输出即为P(ο₁ο₂···∣λ₁λ₂···)概率最大。在分词任务上ο即为B、M、E、S这四种标记符号,λ为句子中的每个字。
但是如此计算的计算量太大,因此引入独立观察假设,即假设每个字的输出仅与当前字有关,于是得到: P(ο₁ο₂···∣λ₁λ₂···) = P(ο₁∣λ₁)·P(ο₂∣λ₂)·······
改方法极大的简化了计算量,但是完全没有考虑上下文,出错的可能性较大,所以HMM模型改进了它,由贝叶斯公式: P(ο∣λ) = P(ο,λ)/P(λ) = P(λ∣ο)·P(ο)/P(λ)
其中λ为输入,所以P(λ)为已知,所以等价于最大化P(λ∣ο)·P(ο),对其做马尔可夫假设,得到:P(λ∣ο) = P(λ₁∣ο₁)·P(λ₂∣ο₂)·······
对于 P(ο)= P(ο₁)·P(ο₂∣ο₁)·P(ο₃∣ο₁ο₂)······
这里做其次马尔可夫假设,每个输出仅与上一个输出有关,即:P(ο)= P(ο₁)·P(ο₂∣ο₁)·P(ο₃∣ο₂)······
所以P(λ∣ο)·P(ο) ∽ P(λ₁∣ο₁)·P(ο₂∣ο₁)·P(λ₂∣ο₂)·P(ο₃∣ο₂)······P(On∣On-1)P(λn∣On)
实际求解maxP(λ∣ο)·P(ο)的常用方法是Veterbi算法,它是一种动态规划的方法,其思想是:如果最短路径经过某一个节点,那么从初始节点到当前节点的路径也是最短的,因为每一个节点只会影响它前一个和后一个节点。所以可以用递推的方法,选择节点时只用考虑上一个节点的所有最优路径,然后与当前节点路径结合即可,这样逐步找出最优路径。