一般在训练 NLP 模型,比如分词,词性,组块标注等等时,采用 BIO 表示法,说明如下:
B — 代表当前词是一个组块的开始
I — 代表当前词在一个组块中
O — 代表当前词不在任意组块中 。
如果要求更精确,可以增加两个符号:
E — 代表组块结束
S — 代表当前词是一个组块,该组块只有一个词
以句法组块标注训练为例,我们先将 宾州树 的标注使用 perl 小程序作如下转化,
# 宾州树库格式组块标注
((IP-HLN (NP-SBJ (NP-PN (NR 上海)
(NR 浦东))
(NP (NN 开发)
(CC 与)
(NN 法制)
(NN 建设)))
(VP (VV 同步))) )
下载 ChunkLinkCTB 小程序:https://github.com/ouprince/ChunklinkCTB ,执行
perl chunklinkctb.pl -fhHct tree.mrg > tree.chunk
将宾州树库格式的组块标注自动转化成 BIO 表示法 的如下格式 tree.chunk 如下
#arguments: IOB tag: Begin, word numbering: file
#columns: file_id sent_id word_id iob_inner pos word
1 1 0 B-NP NR 上海
1 1 1 I-NP NR 浦东
1 1 2 B-NP NN 开发
1 1 3 I-NP CC 与
1 1 4 I-NP NN 法制
1 1 5 I-NP NN 建设
1 1 6 B-VP VV 同步
下载 CRF++ 工具:链接:https://pan.baidu.com/s/1VC6xtVMUNGXt26cge_hL9Q 提取码:ck3e
解压后执行如下步骤安装 CRF++
./configure
make
make install
ldconfig
进入 example 文件夹,里面有 CRF 使用的示范文件,basenp 或者 chunking 可用来参考作为组块标注,seg 是分词标注示范。
1.在 example 文件夹下建立一个目录 chunktest
2.复制 chunking 中的模板 template 到此目录下
3.template 模板中提供了一元特征模板和二元特征模板,需要和实际的训练文件对应
打开 template 文件,里面定义了特征的模板如下:
# Unigram # 这里定义了一元特征模板
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]
U10:%x[-2,1]
U11:%x[-1,1]
U12:%x[0,1]
U13:%x[1,1]
U14:%x[2,1]
U15:%x[-2,1]/%x[-1,1]
U16:%x[-1,1]/%x[0,1]
U17:%x[0,1]/%x[1,1]
U18:%x[1,1]/%x[2,1]
U20:%x[-2,1]/%x[-1,1]/%x[0,1]
U21:%x[-1,1]/%x[0,1]/%x[1,1]
U22:%x[0,1]/%x[1,1]/%x[2,1]
# Bigram # 这里定义了二元特征模板
B
模板的大致内容如下: 训练文件一共有三列,第一列和第二列表示特征,第三列为标签。于是训练文件 train.data 如下
海 NR B-NP
浦东 NR I-NP
开发 NN B-NP
与 CC I-NP
法制 NN I-NP
建设 NN I-NP
同步 VV B-VP
参数 | 说明 |
-f, --freq=INT | 使用出现次数不少于 INT 次的特征(默认为 1) |
-m,--maxiter=INT | 设置INT 为 LBFGS 的最大迭代次数(默认 10k) |
-c,--cost=FLOAT | 设置 FLOAT 为代价参数,越大拟合程度越高(默认 1.0) |
-e,--eta=FLOAT | 设置终止标准 FLOAT(默认 0.0001) |
-C,--convert | 将文本模式转为二进制模式 |
-t,--textmodel | 为调试建立文本模型文件 |
-a,--algorithm=(CRF|MIRA) | 选择训练算法,默认为 CRF-L2 |
-p,--thread=INT | 线程数(默认1),利用多个 CPU 减少训练时间 |
-H,--shrinking-size=INT | 设置 INT 为最适宜的迭代变量次数(默认 20) |
-v,--version | 显示版本号并退出 |
-h,--help | 显示帮助并退出 |
执行如下开始训练
# 第一个参数 template 为特征模板文件 第二个参数为训练文件
# 第三个参数 chunkmodel 为保存的模型文件
../../crf_learn -t template train.data chunkmodel
# 执行后生成 chunkmodel.txt 和 模型文件 chunkmodel
测试模型如下,test 数据为
上海 NR
浦东 NR
啊 N
执行如下进行模型测试
# chunkmodel 为训练的模型, test 为测试数据
../../crf_test -m chunkmodel test
后面即是模型生成的标签。