我们知道HMM将分词作为字标注问题来解决,其中有两条独立性假设:一个是输出观察值之间严格独立,二是状态的转移过程中当前状态只与前一个状态有关(一阶马尔可夫型)。通过这两种假设,使得HMM的计算成为可能。但是实际应用中多是交互特征表现出来的,同时观察元素之间存在长程相关性,这时HMM就收到了制约。
这时的条件随机场,其主要思想来源于HMM,也是一种用来标记和切分序列化数据的统计模型。但是这里要注意的是:条件随机场是在给定观察的标记序列下,计算整个标记序列的联合概率,而HMM是在给定当前状态下,定义下一个状态的分布。
条件随机场的定义:设
X
=
(
X
1
,
X
2
,
X
3
.
.
.
,
X
n
)
X=(X_1,X_2,X_3...,X_n)
X=(X1,X2,X3...,Xn)和
Y
=
(
Y
1
,
Y
2
,
.
.
.
,
Y
n
)
Y=(Y_1,Y_2,...,Y_n )
Y=(Y1,Y2,...,Yn)是联合随机变量,若随机变量
Y
Y
Y构成一个无向图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E)表示的马尔可夫模型,则条件概率分布
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)称为条件随机场(Conditional random field,CRF),即:
P
(
Y
v
∣
X
,
Y
w
,
w
≠
v
)
=
P
(
Y
v
∣
X
,
Y
w
,
w
∼
v
)
P(Y_v|X,Y_w, w \neq v)=P(Y_v|X,Y_w, w \sim v)
P(Yv∣X,Yw,w̸=v)=P(Yv∣X,Yw,w∼v)
其中
w
∼
v
w \sim v
w∼v表示图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E)中与结点
v
v
v有边连接的所有结点,
w
≠
v
w \neq v
w̸=v表示结点
v
v
v以外的所有结点。
简单举例说明:现有若干个位置组成的整体,当给某一个位置按照某种分布,随机赋一个值后,该整体就被称为随机场。
这里假设定义了如下的地名识别规则:
标注 | 含义 |
---|---|
B | 当前词为地理命名实体的首部 |
M | 当前词为地理命名实体的内部 |
E | 当前词为地理命名实体的尾部 |
S | 当前词单独构成地理命名实体 |
O | 当前词不是地理命名实体或组成部分 |
当有由n个字符组成的NER的句子,每个字符的标签都在上面的标签集合 ( B , M , E , S , O ) (B,M,E,S,O) (B,M,E,S,O)中,当为每个字符选定标签后,就形成了一个随机场,此时如果加一些约束(如所有字符的标签只和相邻的字符标签有关),那么就转换成了马尔可夫随机场问题。在马尔可夫随机场的基础上,这时如果有 X X X和 Y Y Y两种变量, X X X一般是给定的, Y Y Y是在给定 X X X条件下的输出,上述的例子中, X X X是字符, Y Y Y是标签, P ( Y ∣ X ) P(Y|X) P(Y∣X)就是条件随机场。
在实际自然语言处理中,多假设变量X和Y具有相同的结构,即

一般将这种结构称为线性链条件随机场,其定义如下:
设
X
=
(
X
1
,
X
2
,
X
3
.
.
.
,
X
n
)
X=(X_1,X_2,X_3...,X_n)
X=(X1,X2,X3...,Xn)和
Y
=
(
Y
1
,
Y
2
,
.
.
.
,
Y
n
)
Y=(Y_1,Y_2,...,Y_n)
Y=(Y1,Y2,...,Yn)均为线性链表示的随机变量序列,若在给定的随机变量序列X的条件下,随机序列变量Y的条件概率分布
p
(
Y
∣
X
)
p(Y|X)
p(Y∣X)构成条件随机场,且满足马尔可夫性:
P
(
Y
i
∣
X
,
Y
1
,
Y
2
,
.
.
.
Y
n
)
=
P
(
Y
i
∣
X
,
Y
i
−
1
,
Y
i
+
1
)
P(Y_i|X,Y_1,Y_2,...Y_n)=P(Y_i|X,Y_{i-1},Y_{i+1})
P(Yi∣X,Y1,Y2,...Yn)=P(Yi∣X,Yi−1,Yi+1)
则称
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)为线性链的条件随机场。
这里线性链CRF不仅考虑了上一个状态
Y
i
−
1
Y_{i-1}
Yi−1,还考虑了后续的状态结果
Y
i
+
1
Y_{i+1}
Yi+1,下面各网络的对比:
从上图可以看出HMM是一个有向图,而线性链CRF是一个无向图。因此HMM处理时,每个状态依赖上一个状态,而线性链CRF依赖于当前状态的周围结点状态。
这里以地名识别为例,对句子“我来到上海”进行标注,正确的标注为“我/O 来/O到/O上/B海/E”。采用CRF来进行解决,那么(O,O,O,B,E)是其中一种标注序列,(O,O,O,M,E)也是一种选择,类似的还有很多,在NER任务中就是在如此多的可选择序列中,找出最靠谱的句子的标注。
下面就是如何找到最靠谱的句子标注?
假如给每个标注序列打分,分值代表标注序列的靠谱程度,越高代表越靠谱,这里的给每个标注序列打分的规则就是特征函数,可以定义很多条特征函数,在CRF中,定义一个特征函数集合,然后根据这个特征函数集合给序列进行打分,据此选出最靠谱的标注序列。
在CRF中有两种特征函数,分别是转移函数 t k ( y i − 1 , y i , i ) t_k(y_{i-1},y_i,i) tk(yi−1,yi,i)和状态函数 s l ( y i , X , i ) s_l(y_i,X,i) sl(yi,X,i)。其中 t k ( y i − 1 , y i , i ) t_k(y_{i-1},y_i,i) tk(yi−1,yi,i)依赖于当前和前一位置,表示从标注序列中位置 ( i − 1 ) (i-1) (i−1)的标记 y i − 1 y_{i-1} yi−1转移到位置 ( i ) (i) (i)上的标记为 y i y_i yi的概率。 s l ( y i , X , i ) s_l(y_i,X,i) sl(yi,X,i)依赖于当前位置,表示标记序列在位置 i i i上标记为 y i y_i yi的概率。并通过取值为1或者0,表示符不符合该条规则的约束。
下面是完整的线性链CRF参数化形式:
P
(
y
∣
x
)
=
1
Z
(
x
)
e
x
p
(
∑
i
,
k
λ
k
t
k
(
y
i
−
1
,
y
i
,
i
)
+
∑
i
,
l
u
l
s
l
(
y
i
,
X
,
i
)
)
P(y|x)=\frac{1}{Z(x)}exp(\sum _{i,k} \lambda_kt_k(y_{i-1},y_i,i)+\sum _{i,l}u_l s_l (y_i,X,i))
P(y∣x)=Z(x)1exp(i,k∑λktk(yi−1,yi,i)+i,l∑ulsl(yi,X,i))
其中: Z ( x ) = ∑ y e x p ( ∑ i , k λ k t k ( y i − 1 , y i , i ) + ∑ i , l u l s l ( y i , X , i ) ) Z(x)=\sum _y exp(\sum _{i,k} \lambda_kt_k(y_{i-1},y_i,i)+\sum _{i,l}u_l s_l (y_i,X,i)) Z(x)=y∑exp(i,k∑λktk(yi−1,yi,i)+i,l∑ulsl(yi,X,i))
Z ( x ) Z(x) Z(x)是规范化因子,其求和是在所有可能的输出序列上求和。 λ k \lambda_k λk和 u l u_l ul为转移函数和状态函数对应的权值。
在经过化简和合并将上式改为下式:
P
(
y
∣
x
)
=
1
Z
(
x
)
e
x
p
(
∑
j
∑
i
w
j
f
j
(
y
i
−
1
,
y
i
,
x
,
i
)
)
P(y|x)=\frac{1}{Z(x)}exp(\sum _{j} \sum _{i} w_j f_j(y_{i-1},y_i,x,i))
P(y∣x)=Z(x)1exp(j∑i∑wjfj(yi−1,yi,x,i))
其中,
f
j
(
y
i
−
1
,
y
i
,
x
,
i
)
f_j(y_{i-1},y_i,x,i)
fj(yi−1,yi,x,i)为
t
k
(
y
i
−
1
,
y
i
,
i
)
t_k(y_{i-1},y_i,i)
tk(yi−1,yi,i)和
s
l
(
y
i
,
X
,
i
)
)
s_l (y_i,X,i))
sl(yi,X,i))的统一符号表示。
使用CRF做命名实体识别时,目标是求 a r g m a x y P ( y ∣ x ) arg \underset{y}{max}P(y|x) argymaxP(y∣x)。该问题的求解和HMM求解最大可能序列路径一样,也是采用Veterbi算法。相比于HMM,CRF能够捕捉全局的信息,并能进行灵活的特征设计。
以上只是CRF的简介,要详细了解理论推导可以参考下面两个链接:
https://www.cnblogs.com/Determined22/p/6750327.html
https://www.cnblogs.com/Determined22/p/6915730.html
以上是某大牛的讲解,值得多读几遍。
实战可以参考:
CRF++地名识别