python中⽂命名实体识别-中⽂命名实体识别NER
NER(中⽂实体命名识别)
光健字: 中⽂命名实体识别 NER BILSTM CRF IDCNN BERT
摘要:对中⽂命名实体识别⼀直处于知道却未曾真正实践过的状态,此次主要是想了解和实践⼀些主流的中⽂命名实体识别的神经⽹络算法。通过对⽹上博客的阅读了解,中⽂命名实体识别⽐较主流的⽅法是BILSTM+CRF、IDCNN+CRF、BERT+BILSTM+CRF这⼏种神经⽹络算法,这个demo也⽤Keras实现了这⼏个算法,并且采⽤⼏个⽐较通⽤的数据集进⾏训练测试。这个demo是以了解和学习为⽬的的,所以未得出任何结论
注意:由于算⼒和时间的问题,对神经⽹络的参数未进⾏太多调试,所以模型现在的参数并不是最佳参数
主要库的版本
本项⽬是基于keras(Using TensorFlow backend)以下是主要库的版本
python = 3.6.8
keras == 2.2.4
keras_contrib == 0.0.2
keras_bert == 0.80.0
tensorflow == 1.14.0
项⽬⽬录结构
data 数据⽬录
具体请查看数据⽬录⽂件夹下的README⽂件
DataProcess 数据处理⽂件夹
具体请查看数据处理⽂件夹下的README⽂件
Pubilc 公共⼯具
path 定义⽂件(⽂件夹)的路径
未识别的网络utils ⼯具
创建log
keras的callback调类
Model 模型(总共定义了5个模型,具体结构请查看Model⽂件夹下的README⽂件)
BERT+BILST+CRF
BILSTM+Attention+CRF
BILSTM+CRF
IDCNN+CRF(1)
IDCNN+CRF(2)
log 记录数据
运⾏项⽬
注意:需要⽤到bert⽹络的需要提前下载BERT预训练模型解压到data⽂件夹下
直接在IDE⾥运⾏项⽬
直接运⾏ train.py⽂件
命令⾏
python train.py
运⾏结果
运⾏GPU: GeForceRTX2080Ti(GPU显存 10.0G, 算⼒7.5)
训练周期为15个周期,提前停⽌条件:2个周期验证集准确率没有提升。BERT采⽤batch_size=32 因为值为64的时候所使⽤GPU内存不够
以下数据基于MSRA数据集,以8:2的拆分(训练集:测试集)。测试结果
模型
准确率
F1
召回率
IDCNN_CRF
0.988
0.860
0.871
IDCNN_CRF_2
0.990
0.872
0.897
BILSTM_Attention_CRF
0.987
0.850
0.848
BILSTMCRF
0.989
0.870
0.863
BERT_BILSTM_CRF
0.996
0.954
0.950
很显然BERT+BILIST+CRF的组合效果会好很多
提⽰:log⽂件夹⾥有每个训练周期记录的数据