Bi-LSTM+CRF模型实现命名实体识别

Bi-LSTM+CRF模型实现命名实体识别

向AI转型的程序员都关注了这个号????????????

机器学习AI算法工程  公众号: datayx

Bi-LSTM其实就是两个LSTM,只不过反向的LSTM是把输入的数据先reverse 首尾转置一下,然后跑一个正常的LSTM,然后再把输出结果reverse一次使得与正向的LSTM的输入对应起来。

我们就来看看如何通过BiLSTM+CRF来进行命名实体识别的任务。

例如:

命名实体识别的解法

一般序列标注的解决方法有:隐马尔科夫模型HMM或 条件随机场 CRF 或BiLSTM+CRF 或BiLSTM+最大熵。其中前两种是统计学习方法,后面两种是神经网络的方法。

本文只介绍神经网络的方法。

什么意思呢?例如,对于人名识别的任务来说,我们把每个字分类为三类:O,B-PER,I-PER。O表示这个字不是人名,B-PER表示这个字是一个人名的开头,I-PER表示这个字是一个人名的中间,前面一定存在一个最近的B-PER使得从B-PER到I-PER形成的连续子串构成一个人名。

例如:

Bi-LSTM+CRF模型实现命名实体识别

其中“周恩来”是一个人名,于是这三个词被标注为B-PER I-PER I-PER。

这种方法很简单,实现也方便。但是这种方法把各个词的标注结果独立开来,过度“相信”神经网络会自己学到词的标注结果之间的某种关系。

例如:

经典模型:

Bi-LSTM+CRF模型实现命名实体识别

Bi-LSMT+CRF 解法

Bi-LSTM +CRF是在原来的Bi-LSTM+最大熵的基础上优化过来的,它最大的思想就是在Bi-LSTM的上面挂了一层条件随机场模型作为模型的解码层,在条件随机场模型里面考虑预测结果之间的合理性。

经典模型:

Bi-LSTM+CRF模型实现命名实体识别

Bi-LSTM+CRF 模型的实现

模型:CRF的转移矩阵A由神经网络的CRF层近似得到,而P矩阵 也就是发射矩阵由Bi-LSTM近似得到。

词向量,即可以预先训练,也可以一并训练。


访问AI图谱 技术分享社区 

https://loveai.tech


实现详解

数据处理逻辑

Bi-LSTM+CRF模型实现命名实体识别

数据处理模块主要是为了实现两个函数:next_train_batch和next_valid_batch,用于从训练集和预测集获取一个batch的数据,注意这里的batch不是随机的,而是序惯的。

注意这里面的pad 填充函数,它会把序列填充到给定的sentence_length的长度,填充方法是倍增填充。

神经网络模型

Bi-LSTM+CRF模型实现命名实体识别

Ssupervise

Ssupervise,与预测的实体集SpredicSpredict之间交集占各自的比例。

这个模型不难,但是却让我调试了1个月,原来的模型实现中模型始终预测出"O",调试中看了各个词的发射概率scores ,发现"O"标签的概率最大,让人如何也想不出问题所在。

后来,在一个偶然的机会中,本人意识到一个问题:那就是dynamic_rnn函数的有一个参数sequence_length 是需要正确设置的。

Bi-LSTM+CRF模型实现命名实体识别

之前对sequence_length理解不深,后面翻阅文档知道这个参数的含义是:

Bi-LSTM+CRF模型实现命名实体识别

也就是说,这个sequence_length反映的是序列真实的有效的长度,如果不指定就按照完整序列来迭代rnn。大家想之前为了矩阵表示的方便,最起码在每个batch里面我们需要让各个序列的长度相同,不够长度的我们采用一些填充的办法。

原文 https://blog.****.net/jmh1996/article/details/84779680


阅读过本文的人还看了以下:

不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  

Bi-LSTM+CRF模型实现命名实体识别

长按图片,识别二维码,点关注

访问AI图谱  

https://loveai.tech

Bi-LSTM+CRF模型实现命名实体识别

Bi-LSTM+CRF模型实现命名实体识别