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

本文介绍如何使用Keras实现BiLSTM+CRF进行中文命名实体识别,包括环境配置、常见问题解决及模型训练过程。参照开源项目进行实践,针对不同版本的Keras和TensorFlow出现的问题提供了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

自然语言处理入门(一)–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跑通的结果
结果图1-1
结果图1-2
但仍然存在问题,

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

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值