本文是2018年秋季计算语言学课程第5次作业的总结,任务为利用隐马尔科夫模型
计算句子概率。
实验设置
- 按行分句。
- 计算状态转移矩阵和观测概率矩阵时考虑训练集中的单词词性。
- 忽略中括号及词组词性,去重后得到43个不重复的词性,作为隐藏状态。
- 忽略词性以及中括号,统计训练集、验证集和测试集的词语,得到55416个不重复的词语。
- 计算精度为小数点后1000位。
隐马尔科夫模型计算句子概率过程
以迈向/v 充满/v 希望/n 的/u 新/a 世纪/n
为例,进行以下处理:
- 在句子首尾加上
<bos>
和<eos>
得到新的句子<bos>/<bos> 迈向/v 充满/v 希望/n 的/u 新/a 世纪/n <eos>/<eos>
- 状态集合$Q={\langle bos \rangle ,v,u,n,a,\langle eos \rangle}$
- 观测集合$V={\langle bos \rangle,迈向,充满,希望,的,新,世纪,\langle eos \rangle}$
根据新的句子可得状态转移矩阵$A$如下:
$\langle bos \rangle$ | $v$ | $u$ | $n$ | $a$ | $\langle eos \rangle$ | |
---|---|---|---|---|---|---|
$\langle bos \rangle$ | 0 | 1 | 0 | 0 | 0 | 0 |
$v$ | 0 | 0.5 | 0 | 0.5 | 0 | 0 |
$u$ | 0 | 0 | 0 | 0 | 1.0 | 0 |
$n$ | 0 | 0 | 0.5 | 0 | 0 | 0.5 |
$a$ | 0 | 0 | 0 | 1.0 | 0 | 0 |
$\langle eos \rangle$ | 0.166 | 0.166 | 0.166 | 0.166 | 0.166 | 0.166 |
同样可得观测概率矩阵$B$如下:
$\langle bos \rangle$ | $迈向$ | $充满$ | $希望$ | $的$ | $新$ | $世纪$ | $\langle eos \rangle$ | |
---|---|---|---|---|---|---|---|---|
$\langle bos \rangle$ | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
$v$ | 0 | 0.5 | 0.5 | 0 | 0 | 0 | 0 | 0 |
$u$ | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
$n$ | 0 | 0 | 0 | 0.5 | 0 | 0 | 0.5 | 0 |
$a$ | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
$\langle eos \rangle$ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
由于句子的开头总是$\langle bos \rangle$,因此初始状态分布$\pi = [1,0,0,0,0,0]$
这样就得到了一个隐马尔科夫模型
$\lambda = (A,B,\pi)$
假设剔除词性后的观测序列(可以视为验证集和测试集中的句子)为<bos> 迈向 充满 希望 的 新 世纪 <eos>
,则可以转化为向量$O=[0,1,2,3,4,5,6,7]$
前向算法
根据前向算法可以得到观测序列的概率$P(O|\lambda)$
定义到时刻$t$部分观测序列为$o_1,o_2,…,o_t$且状态为$q_i$的概率为前向概率,记作
计算过程如下
(1)初值
(2)递推,对$t=1,2,…,T-1$
(3)终止
经过计算可以得到该序列$O$的前向概率为$0.00390625$
后向算法
同样根据后向算法也可以得到观测序列的概率$P(O|\lambda)$,不同之处在于一开始不需要初始状态分布$\pi$参与计算,而是在终止时才加入初始状态分布$\pi$
定义在时刻$t$状态为$q_i$的条件下,到$t+1$到$T$的部分观测序列为$o_{t+1},o_{t+2},…,o_{T}$概率为后向概率,记作
(1)初值
(2)递推, 对$t=T-1,T-2,…,1$
(3)终止
经过计算可以得到该序列$O$的后向概率为$0.00390625$,与前向概率一致,验证了两个概率相等的结论。
根据上面计算的例子,可以统计所有训练集语料中词性的状态转移矩阵$A_(43 \times 43)$,训练集、(剔除了词性的)验证集和测试集语料中词性到词语的观测概率矩阵$B_{43 \times 55416}$(训练集中词性到词语的频数正常累加,而验证集和测试集中的新出现的词语的频数为0),从而使用前向算法和后向算法进行句子概率的计算。
N-gram语言模型结果对比及分析
隐马尔科夫模型结果
本次实验实现并测试了前向算法和后向算法,由于这2种方法得到的结果是相同的,因此最终提交了一份1.txt。可以从提交的1.txt中初步得到以下的观察结果:
- 总体按行分句的句子概率较小,平均句子概率在${10}^{-9}$到${10}^{-8}$数量级,有时会出现极小的概率,例如出现${10}^{-281}$数量级的情况。
- 有2456句句子出现概率为0的情况,考虑到计算精度已经很高(小数点后保留1000位),原因可能在于隐马尔可夫的观测概率矩阵和状态转移矩阵过于稀疏,大部分的元素都是0,对于在验证集和测试集语料中出现却未在训练集中出现的状态转移的处理能力较差,因此最终计算的概率为0的情况大概占了结果的一半左右。
而n-gram
语言模型实验由于使用了各种平滑方法,对验证集和测试集的新词和低频词处理较好,没有出现句子概率为0的情况。
隐马尔科夫模型结果与N-gram语言模型结果对比
平均句子概率
方法 | 语料 | 平均句子概率 | 句子概率大小排序 |
---|---|---|---|
add_one_bigram | valid | 4.23E-11 | 5 |
add_one_unigram | valid | 2.79E-07 | 3 |
back_off_trigram | valid | 1.06E-05 | 1 |
hmm | valid | 2.84E-09 | 4 |
good_turing_bigram | valid | 1.53E-13 | 6 |
good_turing_unigram | valid | 3.89E-07 | 2 |
方法 | 语料 | 平均句子概率 | 句子概率大小排序 |
---|---|---|---|
add_one_bigram | test | 1.03E-10 | 6 |
add_one_unigram | test | 8.36E-07 | 4 |
back_off_trigram | test | 1.01E-05 | 2 |
hmm | test | 1.16E-08 | 5 |
good_turing_bigram | test | 7.07E-03 | 1 |
good_turing_unigram | test | 1.36E-06 | 3 |
如果一句句子中大部分的词语都有一个较高的概率,那么通过$P(w_1,w_2,…,w_n )=\subseteq_{i=2}^{N} P({w_i} | w_{i-(n-1) }…w_{i-1})$得到的句子概率(n-gram
方法)也会较高,不同句子之间进行概率比较的差距也会更明显。
因此从上表中可以看出,隐马尔科夫模型
计算出的平均句子概率处于中等偏低的水平,分别排在第4(valid语料)和第5(test语料)的位置,侧面反映出隐马尔科夫模型
对验证集和测试集语料的适应性一般,或者说通过训练集语料构建的隐马尔科夫模型
对于预测未出现在训练集中的验证集和测试集语料时,对于所预测的句子的置信度不高。
概率差异平均排序
集合中的每句句子$S_j$,5种n-gram
模型分别会计算出概率$p_0,p_1,p_2,p_3,p_4$,分别与隐马尔科夫模型
的概率$p_{hmm}$进行相减后取绝对值($|p_{hmm}-p_i |$),再进行排序得到顺序$r_0,r_1,r_2,r_3,r_4$,然后对于每种n-gram
模型的所有句子得到的顺序$\frac{\sum_{j=1}^{n}{r}_{ij}}{n}$进行平均,从而得到该方法与隐马尔科夫模型
的概率差异平均排序结果,如下面2张表格所示:
方法 | 语料 | 概率差异排序平均值 |
---|---|---|
add_one_bigram | valid | 1.722009569 |
add_one_unigram | valid | 1.340669856 |
back_off_trigram | valid | 1.758851675 |
good_turing_bigram | valid | 2.864114833 |
good_turing_unigram | valid | 2.314354067 |
方法 | 语料 | 概率差异排序平均值 |
---|---|---|
add_one_bigram | test | 1.667934783 |
add_one_unigram | test | 1.43423913 |
back_off_trigram | test | 1.842934783 |
good_turing_bigram | test | 2.773369565 |
good_turing_unigram | test | 2.281521739 |
所以总体来看,add_one_unigram
方法得到的概率与隐马尔科夫模型
得到的概率最接近,其次时add_one_bigram
方法,然后是back_off_trigram
方法,之后是good_turing_unigram
方法,而good_turing_bigram
得到的概率与隐马尔科夫模型
得到的概率相差最远。
参考资料
[1] 李航 (2012) 统计学习方法. 清华大学出版社, 北京.