条件随机场(CRF)识别命名实体
2009-07-21 15:26
399 查看
资实验相关资料下载
CRF++使用见《CRF++的简单使用》
一、实验环境
a) 软件:windows XP pro sp3,visual studio 2008 & Dotnet2.0, CRF++, perl
b) 硬件: CPU: cm420,内存:2G ddr533, 160G 8M sata 富士通
二、实验过程
下面未经特别说明,都是按照作业要求将训练语料分成7:3进行训练和评测所得的结果。
a) 直接应用CRF
i. 所给定的语料格式非常符合条件随机场的要求,故直接使用条件随机场进行训练测试。(本次试验的文件在包test1.rar中)
1. 转换文档编码为UTF8(CRF++在使用UTF16时会报错)
2. 制定模板,如下:
#Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U10:%x[-1,0]/%x[0,0]
U11:%x[0,0]/%x[1,0]
3. 使用CRF++学习特征(相关信息如下)
a) 命令:crf_learn template_file train_file model
其中template_file是模板文件,train_file是训练语料,都需要事先准备好;model是CRF++根据模板和训练语料生成的文件,用于解码。
i. template_file文件
1. 模板的基本格式为%x[row,col],它用于确定输入数据中的一个token
其中,row确定与当前的token的相对行数。col用于确定绝对列数。(如下图:)
2. 特征模板的类型
a) 第一种以字母U开头,为Unigram template。当模板前加上U之后,CRF会自动生成一个特征函数集合。
一个模型生成的特征函数的个数总数为L*N,其中L是输出的类别数,N是根据给定的template扩展出的独立串(unique string )的数目。
b) 第二种特征模板以B开头,即Bigram template
它用于描述Bigram特征。系统将自动产生当前输出token与前一个输出token的组合。产生的可区分的特征的总数是L*L*N,其中L是输出类别数,N是这个模板产生的unique features数。
c) 两种模板的区别
注意:Unigram/Bigram是指输出token的Unigram/Bigrams,而不是特征!
unigram:|output tag|×|从模板中扩展的所有可能串|
bigram: |output tag| × |output tag| × |从模板中扩展的所有可能串|
b) iter=88 terr=0.01365 serr=0.23876 obj=67066.17413 diff=0.00006
其中:iter是迭代次数;terr是词错误率;serr是句错误率;obj是当前对象值,当它收敛时,迭代结束;diff是与上一对象的差。
4. Done!2706.41 s,用时间2706.41s(在电脑1上)。
5. 对测试语料进行测试
a) 命令:crf_test -m model_file test_file > result_file
其中 model_file是刚才生成的model文件,test_file是待测试语料,“>result_file”是重定向语句,指将屏幕输出直接输出到文件result_file中。
b) CRF++的解码速度是很快的,尤其是直接写入文件时。但是因为特征选取的问题,正确率、召回率都不高。
c) 结果使用conlleval.pl程序测评。(其代码在提交包根目录中)
测评的命令为:perl conlleval.pl < output.txt,其中output.txt为待评测文件,需要perl解释器支持。详细结果如下:
ii. 因为刚才特征选取地特别少,故猜想多加入有效特征可以提高结果,于是把模板定义如下:(本次试验的相关数据文件在包test2.rar中)
1. 模板2:
#Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U5:%x[-2,0]/%x[-1,0]
U6:%x[-1,0]/%x[0,0]
U7:%x[0,0]/%x[1,0]
U8:%x[1,0]/%x[2,0]
2. 相关的实验数据如下:
a) 训练过程:
iter=94 terr=0.00571 serr=0.12313 obj=53321.45523 diff=0.00000
Done!2915.53 s
b) 测试结果:
的确有所进步,但是还是明显显低。
a) 制定规则,改进结果
i. 对结果进行分析(详见各包中以error开头的文件),可以发现错误主要有以下几种:
1. 同一实体内不同字间的类型不同,则以字类数较多者为准
a) 个数相同时,多数情况下为LOC
2. 实体开头的字必定为B-???格式
3. 实体的开始和结尾都有特定的特征可以遵循(如停用词、动词等作为分界等)
4. 固定实体后跟实体应为B-???格式(如省名后)
5. 实体间间隔较小时可能合并为同一实体
6. ……
ii. 根据以上特点对结果进行优化,计划依次试验各个规则。但因时间因素,只检测了四五种,其中较有效果的是前两种(即规则1和2),两者结合可以把结果成绩提高12%左右。在test2的结果上加以更正,得到的结果如下:
虽然F值有很大提高,但是还是太不理想
c) 先分词并标注词性信息,再用CRF学习规则
i. 看来单从字的角度着眼已然不够,于是试图利用分词和词性标注信息。因为题目未给出相应信息,故用分词标注信息先进行分词标注(分词标注工具见附件包根目录)。
ii. 分词标注后,字的特征如下所示:
iii. 于是针对其建立模板:
iv. 以此模板进行训练,得到模型后进行测试,最后用conlleval测得结果如下:
iter=226 terr=0.00935 serr=0.17661 act=2913330 obj=42785.69115 diff=0.00009
Done!4502.97 s
v. 对此结果再以用前面建立的规则优化,最终得到结果如下:
在此基础上对Test_utf16.ner进行训练,最终得到finalAnswer.txt
三、实验结果对照表
四、未来的工作
a) 尝试更多的规则,尽量减少机器学习方法的弊端;
b) 尝试把分词和词性信息作为不同的属性,看看对结果有什么影响;
c) 改进分词及词性标注的正确率,以便收到更好的命名实体识别的效果。
五、注意事项
a) 编码格式可能造成某些文件无法正常处理,当出现格式错误时要留心一下;
b) 各个程序所需要的分隔符不尽相同,主要是空格和制表符,在遇到问题时注意看是不是分隔符不符合程序要求;
c) 实验过程中开发的一些实用小工具并未提供说明书,但这些小工具界面简洁,使用方便,应该很容易掌握。
后记:其实结果和使用的训练测试数据的选择很有关系,本人采用的是前70%训练,后30%测试。后经改进选取方法,正确率可以达92%以上,有兴趣的可以改变一下训练语料和测试语料的提取方式。
CRF++使用见《CRF++的简单使用》
一、实验环境
a) 软件:windows XP pro sp3,visual studio 2008 & Dotnet2.0, CRF++, perl
b) 硬件: CPU: cm420,内存:2G ddr533, 160G 8M sata 富士通
二、实验过程
下面未经特别说明,都是按照作业要求将训练语料分成7:3进行训练和评测所得的结果。
a) 直接应用CRF
i. 所给定的语料格式非常符合条件随机场的要求,故直接使用条件随机场进行训练测试。(本次试验的文件在包test1.rar中)
1. 转换文档编码为UTF8(CRF++在使用UTF16时会报错)
2. 制定模板,如下:
#Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U10:%x[-1,0]/%x[0,0]
U11:%x[0,0]/%x[1,0]
3. 使用CRF++学习特征(相关信息如下)
a) 命令:crf_learn template_file train_file model
其中template_file是模板文件,train_file是训练语料,都需要事先准备好;model是CRF++根据模板和训练语料生成的文件,用于解码。
i. template_file文件
1. 模板的基本格式为%x[row,col],它用于确定输入数据中的一个token
其中,row确定与当前的token的相对行数。col用于确定绝对列数。(如下图:)
col 0 | col 1 | col 2 | ||
row -2 | 疆 | Ens | I-LOC | |
row -1 | 总 | Bn | N | |
row 0 | 统 | En | N | 当前行 |
row 1 | 阿 | Bns | B-PER | |
row 2 | 利 | Mns | I-PER |
模板 | 指代的特征 |
U00:%x[-2,0] | 疆 |
U01:%x[-1,0] | 总 |
U02:%x[0,0] | 统 |
U03:%x[1,0] | 阿 |
U04:%x[2,0] | 利 |
U10:%x[-1,0]/%x[0,0] | 总/统 |
U11:%x[0,0]/%x[1,0] | 统/阿 |
a) 第一种以字母U开头,为Unigram template。当模板前加上U之后,CRF会自动生成一个特征函数集合。
一个模型生成的特征函数的个数总数为L*N,其中L是输出的类别数,N是根据给定的template扩展出的独立串(unique string )的数目。
b) 第二种特征模板以B开头,即Bigram template
它用于描述Bigram特征。系统将自动产生当前输出token与前一个输出token的组合。产生的可区分的特征的总数是L*L*N,其中L是输出类别数,N是这个模板产生的unique features数。
c) 两种模板的区别
注意:Unigram/Bigram是指输出token的Unigram/Bigrams,而不是特征!
unigram:|output tag|×|从模板中扩展的所有可能串|
bigram: |output tag| × |output tag| × |从模板中扩展的所有可能串|
b) iter=88 terr=0.01365 serr=0.23876 obj=67066.17413 diff=0.00006
其中:iter是迭代次数;terr是词错误率;serr是句错误率;obj是当前对象值,当它收敛时,迭代结束;diff是与上一对象的差。
4. Done!2706.41 s,用时间2706.41s(在电脑1上)。
5. 对测试语料进行测试
a) 命令:crf_test -m model_file test_file > result_file
其中 model_file是刚才生成的model文件,test_file是待测试语料,“>result_file”是重定向语句,指将屏幕输出直接输出到文件result_file中。
b) CRF++的解码速度是很快的,尤其是直接写入文件时。但是因为特征选取的问题,正确率、召回率都不高。
c) 结果使用conlleval.pl程序测评。(其代码在提交包根目录中)
测评的命令为:perl conlleval.pl < output.txt,其中output.txt为待评测文件,需要perl解释器支持。详细结果如下:
LOC: | precision: | 63.67%; | recall: | 72.93%; | FB1: | 67.98 | 5623 | 382251.5 |
ORG: | precision: | 21.26%; | recall: | 35.90%; | FB1: | 26.71 | 4491 | 119954.6 |
PER: | precision: | 65.90%; | recall: | 65.06%; | FB1: | 65.47 | 2554 | 167210.4 |
宏平均 | 53.38667 | 微平均: | 52.84311 |
1. 模板2:
#Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U5:%x[-2,0]/%x[-1,0]
U6:%x[-1,0]/%x[0,0]
U7:%x[0,0]/%x[1,0]
U8:%x[1,0]/%x[2,0]
2. 相关的实验数据如下:
a) 训练过程:
iter=94 terr=0.00571 serr=0.12313 obj=53321.45523 diff=0.00000
Done!2915.53 s
b) 测试结果:
LOC: | precision: | 66.86%; | recall: | 74.31%; | FB1: | 70.39 | 5456 | 384047.8 |
ORG: | precision: | 26.95%; | recall: | 41.02%; | FB1: | 32.53 | 4048 | 131681.4 |
PER: | precision: | 68.29%; | recall: | 65.67%; | FB1: | 66.96 | 2488 | 166596.5 |
宏平均 | 56.62667 | 微平均: | 56.89841 |
a) 制定规则,改进结果
i. 对结果进行分析(详见各包中以error开头的文件),可以发现错误主要有以下几种:
1. 同一实体内不同字间的类型不同,则以字类数较多者为准
a) 个数相同时,多数情况下为LOC
2. 实体开头的字必定为B-???格式
3. 实体的开始和结尾都有特定的特征可以遵循(如停用词、动词等作为分界等)
4. 固定实体后跟实体应为B-???格式(如省名后)
5. 实体间间隔较小时可能合并为同一实体
6. ……
ii. 根据以上特点对结果进行优化,计划依次试验各个规则。但因时间因素,只检测了四五种,其中较有效果的是前两种(即规则1和2),两者结合可以把结果成绩提高12%左右。在test2的结果上加以更正,得到的结果如下:
LOC: | precision: | 79.40%; | recall: | 76.43%; | FB1: | 77.89 | 4966 | 386801.7 |
ORG: | precision: | 53.86%; | recall: | 52.63%; | FB1: | 53.24 | 3457 | 184050.7 |
PER: | precision: | 80.88%; | recall: | 67.09%; | FB1: | 73.34 | 2327 | 170662.2 |
宏平均 | 68.15667 | 微平均: | 68.9781 |
c) 先分词并标注词性信息,再用CRF学习规则
i. 看来单从字的角度着眼已然不够,于是试图利用分词和词性标注信息。因为题目未给出相应信息,故用分词标注信息先进行分词标注(分词标注工具见附件包根目录)。
ii. 分词标注后,字的特征如下所示:
字 | 词性及分词标记 | 实体标记 |
: | Sw | N |
印 | Bns | B-LOC |
度 | Ens | I-LOC |
首 | Bd | N |
先 | Ed | N |
iv. 以此模板进行训练,得到模型后进行测试,最后用conlleval测得结果如下:
iter=226 terr=0.00935 serr=0.17661 act=2913330 obj=42785.69115 diff=0.00009
Done!4502.97 s
LOC: | precision: | 82.05%; | recall: | 89.97%; | FB1: | 85.83 | 20309 | 1743121 |
ORG: | precision: | 48.36%; | recall: | 65.12%; | FB1: | 55.5 | 13818 | 766899 |
PER: | precision: | 91.52%; | recall: | 93.15%; | FB1: | 92.33 | 9189 | 848420.4 |
宏平均 | 77.88667 | 微平均: | 77.53349 |
LOC: | precision: | 90.34%; | recall: | 90.37%; | FB1: | 90.36 | 18878 | 1705816 |
ORG: | precision: | 70.47%; | recall: | 71.54%; | FB1: | 71 | 12474 | 885654 |
PER: | precision: | 94.85%; | recall: | 92.70%; | FB1: | 93.76 | 8954 | 839527 |
宏平均 | 85.04 | 微平均: | 85.12373 |
三、实验结果对照表
编号 | 使用策略 | 结果 | 方法改进 | 性能提升 | |
1 | 单字CRF(1) | 约53% | |||
2 | 单字CRF(1) | 约56.7% | 使用更多的特征信息 | 约3.7% | 特征对于结果有较大影响,但因硬件条件和时间原因未能引入更多的特征加以佐证。 |
3 | 单字CRF+规则 | 约68.5% | 人工添加规则,对结果进行优化 | 约11.8% | 规则可以弥补机器学习方法的不足,依次(并改变规则的顺序)尝试各种规则。 |
4 | 分词+词性标注+CRF | 约77.7% | 采用了不同方法 | 约9.2% | 引入词的概念显然 |
5 | 分词+词性标注+CRF+规则 | 约85.1% | 在4基础上引入规则 | 约7.4% | 机器学习方法的某些弊端不随条件的变化而变化 |
6 |
a) 尝试更多的规则,尽量减少机器学习方法的弊端;
b) 尝试把分词和词性信息作为不同的属性,看看对结果有什么影响;
c) 改进分词及词性标注的正确率,以便收到更好的命名实体识别的效果。
五、注意事项
a) 编码格式可能造成某些文件无法正常处理,当出现格式错误时要留心一下;
b) 各个程序所需要的分隔符不尽相同,主要是空格和制表符,在遇到问题时注意看是不是分隔符不符合程序要求;
c) 实验过程中开发的一些实用小工具并未提供说明书,但这些小工具界面简洁,使用方便,应该很容易掌握。
Felomeng.BackFormation | 用于在标准格式和分词标注格式之间转换,还附带将两种标记合并、将分词标注信息删除两个功能 |
Felomeng.ErrorExtractor | 错误提取工具,可以方便地从结果(带答案)中提取错误,以便于实验分析 |
Felomeng.NERRules | 本来有四个功能,因为实验中验证了前三个功能效果不佳,固主要功能就是改善结果(对机器学习方法的结果进行规则化改进)。 |
相关文章推荐
- 基于条件随机场(CRF)的命名实体识别
- 通俗理解BiLSTM-CRF命名实体识别模型中的CRF层
- CRF命名实体识别的一些tips
- linux下使用CRF++结合java做的命名实体识别demo
- 基于crf的命名实体识别的一部分总结加文本分类大致流程
- 基于深度学习的命名实体识别bi-lstm+crf
- 基于条件随机场(CRF)的组织机构实体识别
- 基于条件随机场(CRF)的组织机构实体识别
- 基于CRF工具的机器学习方法命名实体识别的过
- 基于深层神经网络的命名实体识别技术
- 【命名实体识别】HMM-Viterbi角色标注中国人名识别
- 命名实体识别评估指标
- 命名实体识别(named entity recognition )基于统计方法的技术比较
- 基于VSM的命名实体识别、歧义消解和指代消解
- 命名实体识别,使用pyltp提取文本中的地址
- 基于统计的命名实体识别特征选择
- 基于规则的命名实体识别
- 基于条件随机场的命名实体抽取
- 基于深层神经网络的命名实体识别技术
- 自然语言分析之命名实体识别_Stanford Named Entity Recognizer (NER)简单实例