最近开始搞实体识别,CRF++一直是工业上搞实体识别的利器,过来研究一下
安装
非root用户安装CRF++,首先在官网下载,然后解压。 1
./configure --prefix=/home/xxx/crf
make
make install
训练数据
训练数据的格式,每列应该以tab隔开,注意结尾的换行符,出现windows的换行的时候,还有出现多余的空行,可能会出现下面的错误
encoder.cpp(340) [max_size == size]inconsistent column size: 4 3 train.data
句子之间用空格隔开,除了最后的标签列中间还可以添加其他的特征数据,比如词性,还可以添加其他的
我 O
爱 O
北 B-LOC
京 I-LOC
的 O
天 O
安 O
门 O
明 O
天 O
北 B-LOC
京 I-LOC
怎 O
么 O
样 O
特征模板
常见的特征模板如下
# Unigram
U00:%x[-1,0]
U01:%x[0,0]
U02:%x[1,0]
U03:%x[-1,0]%x[0,0]
U04:%x[0,0]%x[1,0]
U05:%x[-1,0]%x[1,0]
# Bigram
B
- 模板文件中,以 # 开头的行是注释行
- 空行也会被认为是注释行而被剔除
特征有两类,Bigram和Unigram
Bigram特征主要是当前的token和前面一个位置token的自动组合生成的bigram特征集合
以京字为例
label | utt |
---|---|
U01:%x[0,0] | 京 |
U00:%x[-1,0] | 北 |
U02:%x[1,0] | 的 |
U03:%x[-1,0]%x[0,0] | 北/京 |
U04:%x[0,0]%x[1,0] | 京/的 |
训练
通过crf_learn
完成
crf_learn template_file train_data model_name
训练中的参数说明
参数 | 说明 |
---|---|
-a | 参数选择,默认是CRF-L2 ,除此之外还有CRF-L1 |
-c | 设置CRF 的正则化项的系数C ,是一个大于0浮点数,默认是1.0,C 越大CRF++越容易陷入到过拟合当中,通过调节C调节 |
-f | |
-p | |
-e |