不同命名实体识别模型效果对比

本篇用一个demo,对比各个ner模型的效果。

一、前期准备:

数据来源:https://www.cluebenchmarks.com/introduce.html CLUENER细粒度命名实体识别。

本demo只识别公司实体(company)和职位实体(company),筛选含有公司和职位的数据,作为训练和验证数据。

训练数据:4089条。 验证数据:546条。

本demo无单个字的实体情况,采用BIO标签体系,本demo共有5个标签,O,B-com,I-com,B-pos和I-pos。

B-com和I-com表示公司实体标签,B-pos和I-pos表示职位实体标签。

字向量模型:我们自己训练的模型,采用中文维基百科数据作为训练语料。

二、模型效果评价标准:

采用召回率、精准率和f1-score来评价模型好坏。

需要注意的是,这里统计recall和precision的时候,对象是命名实体,而不是单个标签。比如:

召回 = num(百度,携程) / num(百度,携程,IBM) = 66.7%

精准 = num(百度,携程) / num(曾经,百度,携程,IB) = 50%

三、各模型效果对比:

每个模型都尽我最大努力,调到最优了。

1、一层Bilstm + crf:

模型参数:batch_size: 64, epoch: 200, loss: adam, rate: 0.01, num_unit: 256, dropout: 0.1

验证结果:

(1)公司类实体:

                召回率:0.73,精准率:0.76,F1:0.74

(2)职位类实体:

                召回率:0.75,精准率:0.82,F1:0.78

2、两层Bilstm + crf:

模型参数:batch_size: 64, epoch: 200, loss: adam, rate: 0.01, num_unit: 220, dropout: 0.0

验证结果:

(1)公司类实体:

                召回率:0.70,精准率:0.72,F1:0.71

(2)职位类实体:

                召回率:0.73,精准率:0.79,F1:0.76

3、三层Bilstm + crf:

模型参数:batch_size: 128, epoch: 200, loss: adam, rate: 0.01, num_unit: 200, dropout: 0.1

验证结果:

(1)公司类实体:

                召回率:0.69,精准率:0.74,F1:0.71

(2)职位类实体:

                召回率:0.71,精准率:0.76,F1:0.74

4、四层Bilstm + crf:

模型参数:batch_size: 128, epoch: 200, loss: adam, rate: 0.01, num_unit: 150, dropout: 0.0

验证结果:

(1)公司类实体:

                召回率:0.68,精准率:0.73,F1:0.70

(2)职位类实体:

                召回率:0.73,精准率:0.80,F1:0.76

5、attention + Bilstm + crf:

模型参数:batch_size: 64, epoch: 200, loss: adam, rate: 0.01, num_unit: 200, dropout: 0.1

验证结果:

(1)公司类实体:

                召回率:0.70,精准率:0.73,F1:0.72

(2)职位类实体:

                召回率:0.75,精准率:0.81,F1:0.78

6、w2v + 一层Bilstm + crf:

模型参数:batch_size: 64, epoch: 200, loss: adam, rate: 0.01, num_unit: 200, dropout: 0.1

验证结果:

(1)公司类实体:

                召回率:0.74,精准率:0.78,F1:0.76

(2)职位类实体:

                召回率:0.78,精准率:0.84,F1:0.81

7、w2v + 两层Bilstm + crf:

模型参数:batch_size: 64, epoch: 200, loss: adam, rate: 0.01, num_unit: 200, dropout: 0.1

验证结果:

(1)公司类实体:

                召回率:0.74,精准率:0.76,F1:0.75

(2)职位类实体:

                召回率:0.79,精准率:0.81,F1:0.80

8、w2v + attention + Bilstm + crf:

模型参数:batch_size: 64, epoch: 200, loss: adam, rate: 0.01, num_unit: 200, dropout: 0.1

验证结果:

(1)公司类实体:

                召回率:0.73,精准率:0.78,F1:0.76

(2)职位类实体:

                召回率:0.74,精准率:0.82,F1:0.78

9、bert + crf:

模型参数:batch_size: 32, epoch: 500, loss: sgd, rate: 0.01, max_len: 64, encoder_layer: 11

验证结果:

(1)公司类实体:

                召回率:0.66,精准率:0.72,F1:0.69

(2)职位类实体:

                召回率:0.72,精准率:0.78,F1:0.75

10、bert + bilstm + crf:

模型参数:batch_size: 32, epoch: 500, loss: sgd, rate: 0.01, max_len: 64, encoder_layer: 11, num_units: 128, dropout: 0.1

验证结果:

(1)公司类实体:

                召回率:0.74,精准率:0.78,F1:0.76

(2)职位类实体:

                召回率:0.78,精准率:0.84,F1:0.81

四、总结及本人的一点实践经验:

(1)与一层bilstm相比,多层的bilstm或者增加attention层,并没有带来效果上的提升,而且训练的速度还会变慢。一层bilstm+crf完全可以调出一个不错的结果。应该作为首选模型。

(2)本demo中,w2v + bilstm + crf和bert + bilstm + crf的效果略好于bilstm+crf。

(3)结合前两点,ner模型的调优应该放在embedding层中。至于原因吗,本人也只是猜测,bilstm层用来捕捉底层特征,然后crf层做统计算概率。底层特征越丰富,区分度越好,bilstm捕捉的特征效果就会越好。底层特征不好,加再多层bilstm或者attention,也是事倍功半。

(4)本人在实际项目中,用bert做ner,很多时候效果并不理想,而且经常会遇到不收敛的情况,不要痴迷于bert。

(5)ner模型的效果很多时候是达不到工业标准的,不要迷信那些论文或者比赛,动不动就90%以上的准确率。在实际项目中,会有非常多的长尾问题,必须要结合领域词典。

 

以上demo仅供参考

git:https://github.com/EdisonChen0816/ner_toolkit

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值