前言
《
NPL基于词典分词(二)
》介绍n元语法模型从词语接续的流畅度出发,为全切分词网中的二元接续打分,进而利用维特比算法求解似然概率最大的路径。这种词语级别的模型无法应对 OOV(Out of Vocabulary,即未登录词) 问题: 00V在最初的全切分阶段就已经不可能进人词网了,更何谈召回。
序列标注模型
例如下面一句:
头上戴着
束发嵌宝紫金冠
,齐眉勒着
二龙抢珠金抹额
加粗的就是相对陌生的新词,之前的分词算法识别不出,但人类确可以,是因为读者能够识别“戴着”,后面往往跟着是一个词。
序列标注
序列标注指的是给定一个序列
x
=
x
1
x
2
x
3
.
.
.
x
n
x=x_1x_2x_3…x_n
x
=
x
1
x
2
x
3
.
.
.
x
n
,找出序列中每个元素对应标签
y
=
y
1
y
2
y
3
.
.
.
y
n
y=y_1y_2y_3…y_n
y
=
y
1
y
2
y
3
.
.
.
y
n
的问题。其中,y 所有可能的取值集合称为
标注集
{
x
,
y
}
=
{
(
x
i
,
y
i
)
}
,
i
=
1
,
2…
k
\{x,y\} = \{(x_i,y_i)\}, i=1,2…k
{
x
,
y
}
=
{
(
x
i
,
y
i
)
}
,
i
=
1
,
2
.
.
.
k
。比如,输入一个自然数序列,输出它们的奇偶性。
通过标注的学习,现在OOV的“9”,也可以判断出其为奇的属性
即通过一个标注数据集学习相关知识后再进行预测。在NLP问题中,x 通常是字符或词语,而 y 则是待预测的组词角色或词性等标签。中文分词、词性标注以及命名实体识别,都可以转化为序列标注问题。
-
序列标注与中文分词
考虑一个字符序列(字符串) x,想象切词器真的是在拿刀切割字符串,如此,中文分词转化为标注集{切,过}的序列标注问题。
分词标注集并非只有一种,为了捕捉汉字分别作为词语收尾(Begin、End)、词中(Middle)以及单字成词(Single)时不同的成词概率,人们提出了{B,M,E,S}这种最流行的标注集。
-
序列标注与词性标注
词性标注任务是一个天然的序列标注问题:x 是单词序列,y 是相应的词性序列。需要综合考虑前后的单词与词性才能决定当前单词的词性。
-
序列标注与命名实体识别
所谓命名实体,指的是现实存在的实体,比如人名、地名和机构名,命名实体是 OOV 的主要组成部分。可以通过将命名实体类别附着到BMES标签来达到目的。比如,构成地名的单词标注为“B/M/E/S-地名”,以此类推。对于那些不构成命名实体的单词,则统-标注为O ( Outside)。
隐马尔可夫模型
在所有“序列标注”模型中,
隐马尔可夫模型
( Hidden Markov Model, HMM)是最基础的一种。描述两个时序序列联合分布 p(x,y) 的概率模型:
- x 序列外界可见(外界指的是观测者),称为观测序列(obsevation sequence);
- y 序列外界不可见,称为状态序列(state sequence)。
隐马尔可夫模型之所以称为“马尔可夫模型”,”是因为它满足马尔可夫假设。
-
马尔可夫假设:每个事件的发生概率只取决于前一个事件。
-
马尔可夫链:将满足马尔可夫假设的连续多个事件串联起来,就构成了马尔可夫链。
观测 x 为单词,状态 y 为词性。
- 当前状态 Yt 仅仅依赖于前一个状态 Yt-1
- 任意时刻的观测 x 只依赖于该时刻的状态 Yt
状态与观测之间的依赖关系确定之后,隐马尔可夫模型利用三个要素来模拟时序序列的发生过程—-即初始状态概率向量、状态转移概率矩阵和发射概率矩阵。
初始状态概率向量
第一个状态 Y1 称为初始状态,假设 y 有 N 种可能的取值,那么 Y1 就是一个独立的离散型随机变量,由 P(y1 | π) 描述。其中
是概率分布的参数向量,称为
初始状态概率向量
。给定 π ,初始状态 Y1 的取值分布就确定了.
比如
采用{B,M,E,S}标注集时概率如下:
那么此时隐马尔可夫模型的初始状态概率向量为 π=[0.7,0,0,0.3].
此概念怎么得出来?
当然也是经过大量的文本分析出来的
即,句子第一个词是单字的可能性要小一些
状态转移矩阵
Yt 如何转移到 Yt+1 呢?根据马尔可夫假设,t+1 时的状态仅仅取决于 t 时的状态,既然一共有 N 种状态,那么从状态 Si 到状态 Sj 的概率就构成了一个 N*N 的方阵,称为状态转移矩阵 A:
其中下标 i、j 分别表示状态的第 i、j 种取值。假设昨天今天天气取决于昨天的天气,得出矩矩阵 A如下
把其放在中文分词中
- 标签 B 的后面不可能是 S,于是就有 P(Yt+1 = S | Yt = B) = 0。
- 词性标注中的“形容词->名词”“副词->动词”也可通过状态转移概率来模拟
- 这些概率分布参数不需要手动设置,而是通过语料库上的统计自动学习。
发射概率矩阵
有了状态 Yt 之后,如何确定观测 Xt 的概率分布呢?当前观测 Xt 仅仅取决于当前状态 Yt。也就是说,给定每种 y,x 都是一个独立的离散型随机变量,其参数对应一个向量。 假设观测 x 一共有 M 种可能的取值,则 x 的概率分布参数向量维度为 M。由于 y 共有 N 种,所以这些参数向量构成了 N*M 的矩阵,称为发射概率矩阵B。
其中,第 i 行 j 列的元素下标 i 和 j 分别代表观测和状态的第 i 种和第 j 种取值。再以天气为例子,民间传说告诉我们水藻的状态(词)与天气状态(词性)有一定的概率关系。即观察的状态(水藻的状态)和隐藏的状态(天气的状态)。如何不通过直接观察天气的情况下,来预测天气?以天气系统(晴天、多云、雨天)和 观察到4个等级的海藻湿润情况(干、稍干、潮湿、湿润)构造矩阵B。
把其放在中文分词中,可以算出当前词对应
不同词性的概率
分布。矩阵B也可以通过语料库上的统计自动学习。
隐马尔可夫模型应用
一个隐马尔科夫模型是一个三元组(pi, A, B)。
一旦一个系统可以作为HMM被描述,就可以用来解决三个基本问题。
其中前两个是模式识别的问题:
- 给定HMM求一个观察序列的概率(评估);
- 搜索最有可能生成一个观察序列的隐藏状态序列(解码)。
第三个问题是:
- 给定观察序列生成一个HMM(学习)。
给定HMM求一个观察序列的概率
给定一个天气及与它密切相关的海藻湿度状态的隐马尔科夫模型(HMM),即(pi, A, B)已知的情况下,我们想找到观察序列的概率。假设连续3天海藻湿度的观察结果是(干燥、湿润、湿透),三天的天气情况如何。对于观察序列以及隐藏的状态,可以将其视为网格:
可以看出,一种计算观察序列概率的方法是找到每一个可能的隐藏状态,并且将这些隐藏状态下的观察序列概率相加。对于上面那个(天气)例子,将有3^3 = 27种不同的天气序列可能性,因此,观察序列的概率是:
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
H
M
M
)
=
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
s
u
n
n
y
,
s
u
n
n
y
,
s
u
n
n
y
)
+
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
s
u
n
n
y
,
s
u
n
n
y
,
c
l
o
u
d
y
)
+
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
s
u
n
n
y
,
s
u
n
n
y
,
r
a
i
n
y
)
+
.
.
.
.
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
r
a
i
n
y
,
r
a
i
n
y
,
r
a
i
n
y
)
Pr(dry,damp,soggy | HMM) = Pr(dry,damp,soggy | sunny,sunny,sunny) + Pr(dry,damp,soggy | sunny,sunny ,cloudy) + Pr(dry,damp,soggy | sunny,sunny ,rainy) + . . . . Pr(dry,damp,soggy | rainy,rainy ,rainy)
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
H
M
M
)
=
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
s
u
n
n
y
,
s
u
n
n
y
,
s
u
n
n
y
)
+
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
s
u
n
n
y
,
s
u
n
n
y
,
c
l
o
u
d
y
)
+
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
s
u
n
n
y
,
s
u
n
n
y
,
r
a
i
n
y
)
+
.
.
.
.
P
r
(
d
r
y
,
d
a
m
p
,
s
o
g
g
y
∣
r
a
i
n
y
,
r
a
i
n
y
,
r
a
i
n
y
)
用这种方式计算观察序列概率极为昂贵,特别对于大的模型或较长的序列,因此我们可以利用这些概率的时间不变性来减少问题的复杂度,
前向算法
搜索最有可能生成一个观察序列的隐藏状态序列
通过上述问题,已经列举出所有可能发生显示状态海藻(干燥、湿润、湿透)的隐性状态的概率了,我们只要找寻最大概率所对应的状态序列就行了。
这种方法是可行的,但是通过穷举计算每一个组合的概率找到最可能的序列是极为昂贵的。与前向算法类似,我们可以利用这些概率的时间不变性来降低计算复杂度,
维特比算法
。
给定观察序列生成一个HMM
以隐马尔可夫模型应用于中文分词为例
- 语料转换,将语料库的转换成(x,y)二元组,字符-{B,M,E,S}标签
BE S BE
商品 和 服务
BE BE BMME
商品 和服 物美价廉
BE S BE
服务 和 货币
- 训练,通过大量训练,得出初始状态,状态转移矩阵A,混淆矩阵B
初始状态 | B | M | E | S |
---|---|---|---|---|
概率 | 1 | 0 | 0 | 0 |
转移矩阵A | B | M | E | S |
---|---|---|---|---|
B | 0 | 1/7 | 6/7 | 0 |
M | 0 | 1/2 | 1/2 | 0 |
E | 2/4 | 0 | 0 | 2/4 |
S | 2/2 | 0 | 0 | 0 |
混淆矩阵B | 商 | 品 | 和 | 服 | 务 | 物 | 美 | 价 | 廉 | 货 | 币 |
---|---|---|---|---|---|---|---|---|---|---|---|
B | 2/9 | 0 | 1/9 | 2/9 | 0 | 1/9 | 0 | 0 | 0 | 1/9 | 0 |
M | 0 | 0 | 0 | 0 | 0 | 0 | 1/2 | 1/2 | 0 | 0 | 0 |
E | 0 | 2/7 | 0 | 1/7 | 2/7 | 0 | 0 | 0 | 1/7 | 0 | 1/7 |
S | 0 | 0 | 2/2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 通过输入的文本(观察序列),求出找出最大的隐藏状态序列。
HanLP 已经实现了基于隐马尔可夫模型的中文分词器 HMMSegmenter
性能评测
如果隐马尔可夫模型中每个状态仅依赖于前一个状态, 则称为一阶;如果依赖于前两个状态,则称为二阶。
算法 | P | R | F1 | R(oov) | R(IV) |
---|---|---|---|---|---|
最长匹配 | 89.41 | 94.64 | 91.95 | 2.58 | 97.14 |
二元语法 | 92.38 | 96.70 | 94.49 | 2.58 | 99.26 |
一阶隐马尔可夫模型 | 78.49 | 80.38 | 79.42 | 41.11 | 81.44 |
二阶隐马尔可夫模型 | 78.34 | 80.01 | 79.16 | 42.06 | 81.04 |
可以看到,二阶隐马尔可夫模型的 Roov 有少许提升,但综合 F1 反而下降了。这说明增加隐马尔可夫模型的阶数并不能提高分词器的准确率,单靠提高转移概率矩阵的复杂度并不能提高模型的拟合能力,我们需要从别的方面想办法。
主要参考
《
隐马尔可夫模型与序列标注
》
《
HMM学习最佳范例二
》
《
HMM学习最佳范例三
》
《
HMM学习最佳范例四
》
《
HMM学习最佳范例五
》
《
HMM学习最佳范例六
》