复制这段内容后打开百度网盘手机App,操作更方便哦
链接:https://pan.baidu.com/s/1sB252goPWU5UruzWmBWO1A 提取码:4r13
上篇文章我们以Brown语料库中的一个特例讲解了HMM和Viterbi算法。
那么如何使用特定语料库通过HMM算法进行词性标注呢?我们可以从HMM的五元组入手。
大致步骤:
- 得到语料库中词性标注种类和个数==>得到隐序列;
- 对输入的句子进行分词==>得到观测序列;
- 对每个词性标注,计算该词性出现时的前一个词性的次数/该词性出现的总次数==>得到转移概率矩阵;
- 对每个观测状态,计算该状态不同词性出现的次数/该观测状态出现的总次数==>得到发射概率矩阵;
- 计算各词性初始概率: n c ( p o s − t a g ) n s u m \frac{n_{c(pos-tag)}}{n_{sum}} nsumnc(pos−tag),某一个词性出现的次数/语料库总词性标记数;
在实际操作中某些小细节是需要引起我们关注的。
1 如何做数据平滑?
我们要考虑并处理发射矩阵和转移矩阵中条件概率为0而出现整条路径概率为0情况,因此我们需要做数据平滑。下面以他是创业大赛国赛金奖?
为例展开分析:
数据平滑的方法有很多种,一开始我使用的是加一法,在测试的时候我发现无论输入什么句子,词性标注都是Rg。
他/Rg 是/Rg 创业/Rg 大赛/Rg 国/Rg 赛/Rg 金奖/Rg ?/Rg
平滑方法改进后:
他/r 是/v 创业/vn 大赛/vn 国/n 赛/vn 金奖/n ?/w
为什么会出现这样的情况呢?
我们回到语料库可以发现总词性种类有44种,而Rg只出现了10次,如果我们使用加一法平滑数据,对数据的概率影响还是比较大的,因此加一法在该语料库中的表现上效果不是特别理想。我们可以使用Laplace平滑方法,并使参数p足够小,对平滑方法进行改进,从而更好地弥补语料库数据量的不足。其他数据平滑方法还有Kneser-Ney、Katz等,在宗成庆的《统计自然语言处理》中有所提及。
# 加一法平滑方法
for row in range(transaction_matrix.shape[0]):
transaction_matrix[row] += 1
transaction_matrix[row] /= np.sum(transaction_matrix