分词-概率图实现
本文主要介绍分词的若干实现方法;
基本知识
概率图基本概念
概率图模型(Probabilistic graphical models)在概率模型的基础之上,使用了基于图的方法来表示概率分布(或者概率密度、密度函数),其主要由有向、无向两种模型结构。
静态贝叶斯网络中,主要由Naive Bayes、Logistic Regression等模型,将其在时间上延伸,即可得到动态贝叶斯网络;
动态贝叶斯网络主要由HMM模型,相对于Naive Bayes,其主要是多了一个时间上的维度和隐变量;
生成式模型:以 状态序列y决定观测序列x 为假设,针对联合分布p(x,y)进行建模,为全概率模型,所以其即可求解观测序列x的概率,也可求解状态序列y的概率;这类模型中一遍都有严格的独立假设,特征是事先给定的,且特征之间的关系可以直接体现在公式中。典型的模型有:n元语法模型、HMM、朴素贝叶斯;
判别式模型:以 观测序列x决定状态序列y 为假设,直接对后验概率p(y|x)进行建模,它从x中提取特征,学习模型参数,使得条件概率符合一定形式的最优。代表性的模型有:最大熵模型、CRF、SVM、MEMM(最大熵马尔可夫模型)
先验概率:所谓“先”,就是在事情之前,即在事情发生之前事情发生的概率。是根据以往经验和分析得到的概率。如P(x)
后验概率:事情已经发生了,事情发生可能有很多原因,判断事情发生时由哪个原因引起的概率。如P(y|x)
常用模型
朴素贝叶斯
(1)模型描述(贝叶斯公式/条件概率公式)
P
(
y
/
x
)
=
P
(
x
y
)
P
(
x
)
=
P
(
x
/
y
)
P
(
y
)
P
(
x
)
P(y/x)= \frac{P(xy)}{P(x)}=\frac{P(x/y)P(y)}{P(x)}
P(y/x)=P(x)P(xy)=P(x)P(x/y)P(y)
理解/例子:给定一段文本
x
=
[
x
1
,
x
2
,
…
…
]
x=[x_1,x_2,……]
x=[x1,x2,……],求解其类别 (如 情感分类 等)
y
=
[
y
1
,
y
2
…
…
]
y=[y_1, y_2……]
y=[y1,y2……]
(2)模型估计
极大似然估计:
根据训练语料,使用频率来近似概率,然后带入贝叶斯公式中;
输入文本
x
x
x,所以可以理解
P
(
x
)
P(x)
P(x)为常数,求解
P
(
y
/
x
)
∼
max
y
⊂
{
y
1
,
y
2
…
}
(
P
(
x
/
y
)
P
(
y
)
)
P(y/x)\sim\max_{y\subset\{y_1,y_2…\}}(P(x/y)P(y))
P(y/x)∼y⊂{y1,y2…}max(P(x/y)P(y))
而后者可以根据训练语料使用极大似然来估计概率(即使用频率估计概率),例子:
P
(
x
i
/
y
1
)
P(x_i/y_1)
P(xi/y1):训练语料中
y
1
y_1
y1类中,词
x
i
x_i
xi出现的频率;
P
(
y
1
)
P(y_1)
P(y1):训练语料中
y
1
y_1
y1占所有类别中的频率;
贝叶斯估计:
如果说某个词在训练语料中没有出现,可能会导致概率为0,这会导致后台概率的计算,所以需要对
P
(
x
i
/
y
1
)
P(x_i/y_1)
P(xi/y1)进行平滑。简单理解,贝叶斯估计=极大似然估计+平滑算法;最简单的平滑算法,即为默认没出现过的词,其频数为1,当然还有一些复杂的平滑算法如拉普拉斯平滑等。
隐层马尔可夫(Hmm)
假设
假设1:一阶齐次马尔可夫假设(
y
t
y_t
yt只与
y
t
−
1
y_{t-1}
yt−1有关;
y
t
y_t
yt的分布与t无关,或者说不同时刻的
y
t
y_t
yt是同分布的)
假设2:观测独立假设(给定
y
t
y_t
yt,
x
t
x_t
xt唯一确定,与
x
t
−
1
x_{t-1}
xt−1无关)
模型描述
{
π
A
B
}
\{\pi AB\}
{πAB}
π
\pi
π:初始状态概率,即
P
(
y
1
)
P(y_1)
P(y1)
A:转移概率,即
P
(
y
2
∣
y
1
)
…
P(y_2|y_1)…
P(y2∣y1)…
B:发射概率/观测概率,即
P
(
x
1
∣
y
1
)
…
P(x_1|y_1)…
P(x1∣y1)…
基本问题
(1)概率计算:给定模型
λ
=
{
π
A
B
}
\lambda=\{\pi AB\}
λ={πAB}和观测序列
X
=
[
x
1
,
x
2
…
x
T
]
X=[x_1,x_2…x_T]
X=[x1,x2…xT],求解观测序列
P
(
X
/
λ
)
P(X/\lambda)
P(X/λ)概率;
前向算法;
(2)参数估计:已知观测序列
X
=
[
x
1
,
x
2
…
x
T
]
X=[x_1,x_2…x_T]
X=[x1,x2…xT],估计模型
λ
=
{
π
A
B
}
\lambda=\{\pi AB\}
λ={πAB}参数,使得观测序列概率
P
(
X
/
λ
)
P(X/\lambda)
P(X/λ)最大;
EM算法
(3)预测/解码问题:已知模型
λ
=
{
π
A
B
}
\lambda=\{\pi AB\}
λ={πAB}和观测序列
X
=
[
x
1
,
x
2
…
x
T
]
X=[x_1,x_2…x_T]
X=[x1,x2…xT],求解给定观测序列下,条件概率
P
(
Y
/
X
)
P(Y/X)
P(Y/X)最大的状态序列。
Viterbi算法
总结/不足
HMM是为了简化计算量,进行了齐次马尔可夫假设和观测/条件独立假设,但是这并不是合理的。如观测独立假设,给定时刻t,状态y唯一确定观测x,这明显是不合理的。
例子:
分词使用4标签进行分裂,即每个字,均有一个标签:
s:start 表示单字词语
b:begin 表示多字词语的第一个字
m:middle 表示多字词语中间的字
e:end 表示多字词语中最后一个字
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
观测x | 他 | 说 | 的 | 确 | 实 | 在 | 理 |
状态y | s | s | s | b | e | b | e |
考虑前2个字,给定状态
y
2
=
s
y_2=s
y2=s的情况下,我们能说
x
2
x_2
x2唯一被确定吗?显然是不对的,很明显,
x
2
x_2
x2还与
x
1
x_1
x1有关。
同理,齐次马尔可夫假设也是不合理的,在给定
y
5
=
e
y_5=e
y5=e的情况下,
y
4
y_4
y4只可能是b或者m,这说明
y
t
y_t
yt与上文、下文均有关系。
求解过程如下:
由贝叶斯公式得
P
(
Y
∣
X
)
=
P
(
X
Y
)
P
(
X
)
=
P
(
X
∣
Y
)
P
(
Y
)
P
(
X
)
P(Y|X)=\frac{P(XY)}{P(X)}=\frac{P(X|Y)P(Y)}{P(X)}
P(Y∣X)=P(X)P(XY)=P(X)P(X∣Y)P(Y)
由于观测序列X是已知的,可以把它当作常数,得
P
(
Y
∣
X
)
∼
P
(
X
∣
Y
)
P
(
Y
)
P(Y|X) \sim P(X|Y)P(Y)
P(Y∣X)∼P(X∣Y)P(Y)
由一阶齐次马尔可夫假设可得
P
(
Y
)
=
P
(
y
1
y
2
…
y
7
)
=
P
(
y
1
)
P
(
y
2
∣
y
1
)
P
(
y
3
∣
y
2
)
…
P
(
y
7
∣
y
6
)
P(Y)=P(y_1y_2…y_7)=P(y_1)P(y_2|y_1)P(y_3|y_2)…P(y_7|y_6)
P(Y)=P(y1y2…y7)=P(y1)P(y2∣y1)P(y3∣y2)…P(y7∣y6)
由观测独立假设得:
P
(
X
∣
Y
)
=
P
(
x
1
x
2
…
x
7
∣
y
1
y
2
…
y
7
)
=
P
(
x
1
∣
y
1
)
P
(
x
2
∣
y
2
)
…
P
(
x
7
∣
y
7
)
P(X|Y)=P(x_1x_2…x_7|y_1y_2…y_7)=P(x_1|y_1)P(x_2|y_2)…P(x_7|y_7)
P(X∣Y)=P(x1x2…x7∣y1y2…y7)=P(x1∣y1)P(x2∣y2)…P(x7∣y7)
由此可得:
P
(
Y
∣
X
)
∼
P
(
X
∣
Y
)
P
(
Y
)
=
P
(
y
1
)
P
(
x
1
∣
y
1
)
P
(
y
2
∣
y
1
)
P
(
x
2
∣
y
2
)
…
P(Y|X) \sim P(X|Y)P(Y)=P(y_1)P(x_1|y_1)P(y_2|y_1)P(x_2|y_2)…
P(Y∣X)∼P(X∣Y)P(Y)=P(y1)P(x1∣y1)P(y2∣y1)P(x2∣y2)…
即,给定x的情况下,y的概率可以用发射概率和转移概率来表示;
训练过程就是统计语料的过程:
转移概率
P
(
x
1
∣
y
1
)
P(x_1|y_1)
P(x1∣y1)可通过统计字
y
1
y_1
y1所对应所有标签(s,b,m,e)的概率;
发射概率
P
(
y
2
∣
y
1
)
P(y_2|y_1)
P(y2∣y1)可通过相邻标签之间的统计概率(ss,sb,sm,se……)
解码阶段则可以通过viterbi算法来进行求解:
viterbi本质是贪心思想,寻找最大路径/概率
最大熵马尔可夫模型(Memm)
memm打破了hmm的观测独立假设,给定
y
t
y_t
yt,
x
t
x_t
xt与
x
t
−
1
x_{t-1}
xt−1是有关的。(通过D划分来确定)
hmm是y决定x,memm是x决定y,注意箭头的方向;
条件随机场(CRF)
上图为链式条件随机场,我们平时遇到的一般是这种形式,在分词、词性标注、实体抽取中应用广泛;理论上的CRF远比链式CRF复杂,其打破了HMM的齐次马尔可夫假设,但是由于计算复杂,所以我们一遍使用简单的链式CRF。下文将链式CRF统称为CRF;
由图可见,状态序列之间是无向图,状态由其上下文确定,但是,链式CRF也仅仅考虑了上一个字和下一个字;
语言模型
分词-最大匹配(Max Matching)
主要有前向最大匹配和后向最大匹配2种,本节只介绍前向最大匹配;这种方法主要依赖词典来进行分词。
给定词典:
【“他”,“说”,“的”,“的确”,“确实”,“实在”,“在理”】
给定问题:对句子“他说的确实在理”分词;
求解思路:从前向后,针对序列中每个字,依次从词典种查找其最大匹配词;
结果:他/说/的确/实在/理
正确结果应为:他/说/的/确实/在理
思想:单纯依赖词典来进行分词;
缺点:
(1)分词效果完全依赖词典,未考虑语义信息;
分词-有向无环图
分词的时候,如何考虑语义信息呢?
朴素的想法:对句子所有可能的分词罗列出来,选择概率最大的那个;
还是用上面的例子,其可能的分词有:
他/说/的/确实/在理
他/说/的确/实在/理
他/说/的确/实/在理
……
把所有可能的分词序列,可以一个有向无环图来表示:
那么如何选择概率最大的分词序列呢?
给定:一堆训练语料(已经分好词)
算法步骤:
(1) 统计语料中每个词的频率,并将其作为概率(最大似然估计)
(2) 计算每个可能分词序列的概率,取最大的概率的序列
求解:
(1) 假设,经过统计分析得到其概率分布为:
词 | 他 | 说 | 的 | 确 | 实 | 在 | 理 | 的确 | 确实 | 实在 | 在理 |
---|---|---|---|---|---|---|---|---|---|---|---|
概率 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.2 | 0.4 | 0.3 | 0.5 |
(2) 遍历其所有可能的路径,求解最大概率组合:
概率乘积太小,可进行log操作,乘积–>连加:
P(他/说/的/确实/在理)
P(他/说/的确/实在/理)
P(他/说/的确/实/在理)
……
遍历所有可能的路径,计算量较大,如上例子,其可能的路径组合有8种,如果句子较长,遍历其所有可能性,计算量会更大;
简化计算:
动态规划(Viterbi),其本质是贪心思想,将大问题化解为小问题,将上述问题转换为求解概率最大路径问题。
问题:求解从1到8的概率最大路径
P
m
a
x
(
8
)
P_{max}({8})
Pmax(8)
贪心思想:到达节点8,有2条路径:节点7+0.1和节点6+0.5;求解到达节点8的概率最大路径,则等价于max{到达节点7的最大路径+0.1,到达节点6的最大路径+0.5},即:
P
m
a
x
(
8
)
=
m
a
x
{
P
m
a
x
(
7
)
+
0.1
,
P
m
a
x
(
6
)
+
0.5
}
P_{max}({8})=max\{P_{max}(7)+0.1,P_{max}(6)+0.5\}
Pmax(8)=max{Pmax(7)+0.1,Pmax(6)+0.5}
同理,可以递推得到:
P
m
a
x
(
7
)
=
m
a
x
{
P
m
a
x
(
6
)
+
0.1
,
P
m
a
x
(
5
)
+
0.3
}
P_{max}({7})=max\{P_{max}(6)+0.1,P_{max}(5)+0.3\}
Pmax(7)=max{Pmax(6)+0.1,Pmax(5)+0.3}
P
m
a
x
(
6
)
=
m
a
x
{
P
m
a
x
(
5
)
+
0.1
,
P
m
a
x
(
4
)
+
0.4
}
P_{max}({6})=max\{P_{max}(5)+0.1,P_{max}(4)+0.4\}
Pmax(6)=max{Pmax(5)+0.1,Pmax(4)+0.4}
……
ViterBi算法伪代码:
node_prob=[] # 计算每个节点的最大概率
node_pt=[] # 记录该节点的最大概率 是由哪个节点进入的
node_prob.append(0) # 节点1的概率为0
node_pt.append(1) # 起始节点1
trans_score={"12":0.1,"23":0.1,"35":0.2 ……} # 转移概率
node_income={"2":["1"],"3":["2"],……} # 每个节点对应的输入节点
foreach(i in range(2: len(word_s)+1)): # 遍历序列,从节点2开始
tmp_prob=[] # 临时变量,记录到达节点i的所有路径(概率)
foreach n_ in node_income(i) # 每个字对应一个节点,遍历节点的所有输入节点
tmp_prob.append(log(node_prob[n_]) + log(trans_score[n_ + str(i)])) # 到达节点i的所有路径概率 = 起点概率 + 转移概率
node_prob.append(max(tmp_prob)) # 节点i的最大概率
node.pt.append(node_income(i).value()[index(max(tmp_prob))] ) # 到达节点i最大概率的输入节点
print("最大概率路径:")
print(set(node_pt))
缺点:求解最大概率路径,依赖的语料库中词语的分布,换句话说,如果语料库中“的确”、“实在”出现的频率高于“确实”、“在理”,那么使用这种方法分词仍然不对。
HMM 隐层马尔可夫模型
还是使用4标签(sbme)来进行分词,这属于解码问题,使用viterbi算法(动态规划):
问题:给定训练语料和观测序列
X
=
[
x
1
,
x
2
…
…
X
T
]
X=[x_1,x_2……X_T]
X=[x1,x2……XT],求解其对应的状态序列,使得
P
(
Y
/
X
)
P(Y/X)
P(Y/X)最大;
训练语料:标注好文本中每个字及其对应的标签(sbme),或者使用分好词的词典也可以;
求解:
P
(
Y
/
X
)
m
a
x
=
P
(
X
Y
)
P
(
X
)
=
P
(
X
/
Y
)
P
(
Y
)
P
(
X
)
P(Y/X)_{max}= \frac{P(XY)}{P(X)}=\frac{P(X/Y)P(Y)}{P(X)}
P(Y/X)max=P(X)P(XY)=P(X)P(X/Y)P(Y)
y
i
⊂
(
s
,
b
,
m
,
e
)
,
i
=
1
,
2
,
…
T
y_i\subset(s,b,m,e), i=1,2,…T
yi⊂(s,b,m,e),i=1,2,…T
上述仍是贝叶斯定理,之前已经分析过来,
P
(
X
)
P(X)
P(X)是给定的观测序列,不论其对应的何种Y状态序列,其值不变,因此,
P
(
Y
/
X
)
m
a
x
∼
P
(
X
/
Y
)
P
(
Y
)
P(Y/X)_{max}\sim P(X/Y)P(Y)
P(Y/X)max∼P(X/Y)P(Y)
由于hmm模型是在Naive Bayes Model在时间序列上的延伸,同时结合HMM的网络结构图,由齐次马尔可夫假设可得
P
(
Y
)
=
P
(
y
1
y
2
y
3
…
y
T
)
=
P
(
y
1
)
P
(
y
2
/
y
1
)
P
(
y
3
/
y
2
)
…
P
(
y
T
/
y
T
−
1
)
P(Y)=P(y_1y_2y_3…y_T)=P(y_1)P(y_2/y_1)P(y_3/y_2)…P(y_T/y_{T-1})
P(Y)=P(y1y2y3…yT)=P(y1)P(y2/y1)P(y3/y2)…P(yT/yT−1)
由观测独立假设可得:
P
(
X
/
Y
)
=
P
(
x
1
/
y
1
)
P
(
x
2
/
y
2
)
P
(
x
3
/
y
3
)
…
P
(
x
T
/
y
T
)
P(X/Y)=P(x_1/y_1)P(x_2/y_2)P(x_3/y_3)…P(x_T/y_T)
P(X/Y)=P(x1/y1)P(x2/y2)P(x3/y3)…P(xT/yT)
带入得:
P
(
Y
/
X
)
m
a
x
∼
P
(
X
/
Y
)
P
(
Y
)
P(Y/X)_{max}\sim P(X/Y)P(Y)
P(Y/X)max∼P(X/Y)P(Y)
∼
P
(
y
1
)
⏟
π
P
(
x
1
/
y
1
)
⏟
B
11
P
(
y
2
/
y
1
)
⏟
A
12
…
\sim \begin{matrix} \underbrace{P(y_1)} \\ \pi \end{matrix} \begin{matrix} \underbrace{P(x_1/y_1)} \\ B_{11} \end{matrix} \begin{matrix} \underbrace{ P(y_2/y_1) } \\ A_{12} \end{matrix}…
∼
P(y1)π
P(x1/y1)B11
P(y2/y1)A12…
π
\pi
π:为初始状态概率
B
11
B_{11}
B11:由状态
y
1
y_1
y1到观测
x
1
x_1
x1的发射概率,由训练语料统计得到;
A
11
A_{11}
A11:由状态
y
1
y_1
y1到状态
y
2
y_2
y2的状态转移概率,由训练语料统计得到;
由此可得,给定观测X的情况下,状态序列概率最大的概率可由模型
{
π
A
B
}
\{\pi AB\}
{πAB}表示。
相关实现可参考苏剑林. (2016, Aug 19). 《【中文分词系列】 3. 字标注法与HMM模型 》
MEMM
苏剑林. (2020, Feb 24). 《CRF用过了,不妨再了解下更快的MEMM?》
CRF
苏剑林. (2017, Nov 25). 《果壳中的条件随机场(CRF In A Nutshell) 》
参考
科学空间-分词系列
统计学习方法 李航
统计自然语言处理 第二版 宗成庆
机器学习白板推导系列