序列标注
B: 词开始
M: 词中间
E: 词结尾
S: 单字成词,如标点,的,了...
序列标注演化,特征提取逐渐变强。粗略的演化过程:HMM->CRF->BiLSTM CRF->Bert CRF
CRF
x: 输入文本序列,观测序列
y: 输出标签序列,状态序列
每一个状态,都可以由整个观测序列x决定
每一个状态,仅与它相邻的状态相关。\(y_2\)仅与\(y_1,y_3\)有关
公式:
\[P(y|x)=\frac{1}{Z}exp(\sum_{i,j}\lambda_j t_j(y_{i-1},y_i,x,i)+\sum_{i,k}\mu_k s_k(y_i,x,i))
\]
\(t\): 转移特征函数,衡量相邻状态变量之间的影响
\(s\): 状态特征函数,衡量观测序列对状态变量的影响
\(\lambda,\mu\)分别是对应特征函数的权重
\(\sum\),i代表序列维度,(j,k)代表特征函数维度
exp 定义图模型中的概率分布函数
Z 归一化因子
比如:
转移特征函数
\(t_j(y_{i-1},y_i,x,i)=I(y_{i-1}=B,y_i=E)\)
\(t_j(y_{i-1},y_i,x,i)=I(y_{i-1}=B,y_i=M)\)
状态特征函数
\(s_k(y_i,x,i)=I(x_{i-1}=昨,x_i=天,x_{i+1}=他, y_i=E)\)
\(...\)
I()指示函数,True时为1,否则为0
模型的训练和预测
训练(编码):
获得特征函数
根据训练集,使用最优化算法迭代每个特征函数的权重
预测阶段(解码);
根据特征函数权重,得到每个字的标签
使用维特比算法,找到一条概率最高的标签路径,
维特比解码
边的权重是\(\sum_{i,j}\lambda_j t_j(y_{i-1},y_i,x,i)+\sum_{i,k}\mu_k s_k(y_i,x,i)\)
例子:
- dp矩阵,存储从S到当前\(N_{ij}\)的最短路径,记为\(dp_{ij}\)
- 存在一个递推公式
- 从左到右,依次计算dp矩阵,直到结束
\(dp_{ij}=min(dp_{i-1,1} + dist(N_{i-1,1},N_{i,j}),dp_{i-1,2}+dist(N_{i-1,2},N_{i,j}))\)
CRF++使用
https://taku910.github.io/crfpp/#usage
根据特征模板和训练数据,生成特征函数(状态特征函数和转移特征函数)和对应权重
特征模板
# Unigram 用于生成状态特征函数
U00:%x[-3,0]
U01:%x[-2,0]
U02:%x[-1,0]
U03:%x[0,0]
U04:%x[1,0]
U05:%x[2,0]
U06:%x[3,0]
U07:%x[-3,0]/%x[-2,0]
U08:%x[-2,0]/%x[-1,0]
U09:%x[-1,0]/%x[0,0]
U10:%x[0,0]/%x[1,0]
U11:%x[1,0]/%x[2,0]
U12:%x[2,0]/%x[3,0]
U13:%x[-3,0]/%x[-2,0]/%x[-1,0]
U14:%x[-2,0]/%x[-1,0]/%x[0,0]
U15:%x[-1,0]/%x[0,0]/%x[1,0]
U16:%x[0,0]/%x[1,0]/%x[2,0]
U17:%x[1,0]/%x[2,0]/%x[3,0]
# Bigram 用于生成转移特征函数 4*4个转移特征函数
B
训练数据
张 B
绍 M
刚 E
也 S
表 B
现 E
彪 B
悍 E
声 B
称 E
自 B
模型文件(txt)
# 训练脚本
crf_learn -f 2 -c 2 -t template.txt train_data.txt crf-seg.model
# -f 忽略出现2次及以下的特征函数
# -c 正则化参数
# -t 生成txt模型,可读
# 预测
crf_test -m crf-seg.model test_data.txt
version: 100
cost-factor: 1
maxid: 512528 # 特征函数的个数
xsize: 1 # 一列特征
B
E
M
S
U00:%x[-3,0]
U01:%x[-2,0]
U02:%x[-1,0]
U03:%x[0,0]
U04:%x[1,0]
U05:%x[2,0]
U06:%x[3,0]
U07:%x[-3,0]/%x[-2,0]
U08:%x[-2,0]/%x[-1,0]
U09:%x[-1,0]/%x[0,0]
U10:%x[0,0]/%x[1,0]
U11:%x[1,0]/%x[2,0]
U12:%x[2,0]/%x[3,0]
U13:%x[-3,0]/%x[-2,0]/%x[-1,0]
U14:%x[-2,0]/%x[-1,0]/%x[0,0]
U15:%x[-1,0]/%x[0,0]/%x[1,0]
U16:%x[0,0]/%x[1,0]/%x[2,0]
U17:%x[1,0]/%x[2,0]/%x[3,0]
B
0 B # 0-15 代表了16个转移特征函数
16 U00:"
512504 U17:/武/献 # 特征模板生成的状态特征函数
512508 U17:/规/定
-3.8444028797946568 # 特征函数权重
5.0792219640595091
3.2573276866428587
-3.4048565678424478
BiLSTM-CRF
- BiLSTM提取了更好的状态特征
- CRF学习标签之间的转移概率
- 最终通过维特比算法找出最优路径