自然语言处理入门(一)--Keras实现BiLSTM+CRF中文命名实体识别

**

自然语言处理入门(一)–Keras实现BiLSTM+CRF中文命名实体识别

**

1. 这篇文章主要关于环境搭建以及遇到的一些bug等一些基础的梳理

  • 参照的开源项目进行学习,地址是https://github.com/F-debug/Medical-named-entity-recognition
  • 使用的python版本是3.6,keras版本是2.3.1,tensorflow版本是2.2.0
  • 版本真的很重要,之前的版本keras是2.4.3经常会出一些错误,后来重新开始搭建的环境参照的是https://docs.floydhub.com/guides/environments/

2. 正确使用版本后没有问题,项目可以跑通,这是利用lstm_train.py跑通的结果
自然语言处理入门(一)--Keras实现BiLSTM+CRF中文命名实体识别_第1张图片
自然语言处理入门(一)--Keras实现BiLSTM+CRF中文命名实体识别_第2张图片
但仍然存在问题,

plt.plot(history.history['accuracy'])

这句代码里网络上给出的结果是将“accuracy”改为“acc”,但实际上仍有错误,不过暂时不影响模型的训练
3.现在整理一下研究思路
模型参考的这篇博文https://www.cnblogs.com/vipyoumay/p/ner-chinese-keras.html
其中BiLSTM+CRF的结构如下,很清晰
自然语言处理入门(一)--Keras实现BiLSTM+CRF中文命名实体识别_第3张图片
将已经标注好的训练样本送入进行训练即可

4.一些常见bug

(1)TypeError: Tensors in list passed to ‘values’ of ‘ConcatV2’ Op have types [bool, float32] that don’t match

情况一:
keras=2.3.1,tensorflow=2.2.0,keras_contribute=2.0.8

这个是因为版本的修改问题,可以修改crf.py 516行:

mask2 = K.cast(K.concatenate([mask, K.zeros_like(mask[:, :1])], axis=1),

修改为

mask2 = K.cast(K.concatenate([mask, K.cast(K.zeros_like(mask[:, :1]), mask.dtype)], axis=1),

这个是有效的,我的问题就在这里

情况二:
keras=2.3.1,tensorflow=1.3.1,keras=2.0.8

同样可以修改516,517行

mask2 = K.cast(K.concatenate([mask, K.zeros_like(mask[:, :1])], axis=1),
                           K.floatx())

修改为

mask2 = K.cast(K.concatenate([tf.to_float(mask), K.zeros_like(mask[:, :1])], axis=1),
                           K.floatx())

这个不清楚效果,有问题的话可以适用一下
其他情况欢迎大家补充.
(2)keras加载模型load_model报错——ValueError: Unknown layer: CRF

from keras.models import load_model
model = load_model(model_path) 

会报错,但具体原因没有弄清楚,希望懂的朋友可以讲解一下需要在load_model函数中添加custom_objects参数,来声明自定义的层
(用keras搭建bilstm-crf,在训练模型时,使用的是:from keras_contrib.layers.crf import CRF)

from keras_contrib.layers.crf import CRF, crf_loss, crf_viterbi_accuracy
model = load_model(model_path, custom_objects={
     "CRF": CRF, 'crf_loss': crf_loss,
                                               'crf_viterbi_accuracy': crf_viterbi_accuracy})

修改为这样的代码后即可解决问题,亲测是有效的
–to be continued

你可能感兴趣的:(自然语言处理)