CRF做命名实体识别
一、准备工作
1.初始程序下载
crf_learn.exe CRF++的训练程序
crf_test.exe CRF++的预测程序
libcrfpp.dll 训练程序和预测程序需要使用的静态链接库
template
conlleval.pl
2.初始数据准备
人民日报1998年01月原始语料库 199801.txt
数据清洗
全角字符统一转为半角
单空格、三空格变双空格
中括号内容合并
合并人名
data_clean.py
input:199801.txt
output:cleaned_data.txt
分割语料(8:2随机),作为训练和测试原始语料
segment.py
input:cleaned_data.txt
output:train_data.txt 和 test_data.txt
构建训练、测试数据集
train_data.py
input:train_data.txt
output:labeled_train_data
input:test_data.txt
output:labeled_test_data
将训练、测试数据集 放入和初始程序一起的文件夹
“BMEWO”标签体系生成训练数据
‘B’:Begin
‘M’:Middle
‘E’:End
‘W’:代表单个实体
‘O’:Other
识别实体类型和语料词性对应关系:
时间:TIME, /t
人物:PERSON, /nr
地点:LOCATION, /ns
团体组织机关:ORGANIZATION, /nt

二、模型训练与测试
- 进入放初始程序、训练、测试数据集的文件夹
cd C:\Users\DELL\Desktop\CRF实体识别
- 训练
crf_learn template labeled_train_data model >>train_output.txt
- 此时会生成model文件
有4个主要的参数可以调整:
-a CRF-L2 or CRF-L1
规范化算法选择。默认是CRF-L2.一般来说L2算法效果要比L1算法稍微好一点,虽然L1算法中非零特征的数值要比L2中大幅度的小。
-c float
这个参数设置CRF的hyper-parameter。c的数值越大,CRF拟合训练数据的程度越高。这个参数可以调整过度拟合和不拟合之间的平衡度。这个参数可以通过交叉验证等方法寻找较优的参数。
-f NUM
这个参数设置特征的cut-off threshold。CRF++使用训练数据中至少NUM次出现的特征。默认值为1.当使用CRF++到大规模数据时,只出现一次的特征可能会有几百万,这个选项就会在这样的情况下起到作用。
-p NUM
如果电脑有多个CPU,那么可以通过多线程提升训练速度。NUM是线程数量。
带两个参数的命令行例子:
% crf_learn –f 3 –c 1.5 template_filetrain_file model_file
语料的训练可以使用命令(在终端或DOS命令行中):crf_learn <模板> <训练语料> <模板文件>
其中模板和训练语料是需要事先准备好的,模板文件在训练完成后生成。
注意:
①如果提示语料格式错误,则注意检查语料的存储编码,有些编码CRF++是会读取错误的;
②文件路径要正确,如果文件没在当前目录,那么要使用绝对路径。
训练中一些参数的说明:
iter: 迭代次数
terr:标记错误率
serr:句字错误率
obj:当前对象的值。当这个值收敛到一个确定值的时候,训练完成
diff:与上一个对象值之间的相对差
- 测试
crf_test –m model labeled_test_data >>test_output.txt
有两个参数-v和-n都是显示信息的,-v可以显示预测标签的概率值,-n可以显示不同可能序列的概率值
- 制表位转换成空格
打开要测评的txt文件——【编辑】——【替换】——查找内容: (复制制表位);替换为 (空格)。
- 测评
perl conlleval.pl <test_output.txt
