序列标注


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学习标签之间的转移概率
  • 最终通过维特比算法找出最优路径
End

本文标题:分词-序列标注

本文链接:https://www.tzer.top/archives/463.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2022 年 05 月 14 日
如果觉得我的文章对你有用,请随意赞赏