中文 NLP(8) -- 使用 CRF++ 和 BIO 表示法训练模型

一般在训练 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 模型

下载 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
crf_learn 可选参数表
参数 说明
-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

中文 NLP(8) -- 使用 CRF++ 和 BIO 表示法训练模型_第1张图片

测试模型如下,test 数据为

上海 NR
浦东 NR
啊 N

执行如下进行模型测试

# chunkmodel 为训练的模型, test 为测试数据
../../crf_test -m chunkmodel test

后面即是模型生成的标签。

你可能感兴趣的:(NLP)