Bi-lstm+CRF实现NER(随机生成词向量)

尊敬的读者您好:笔者很高兴自己的文章能被阅读,但原创与编辑均不易,所以转载请必须注明本文出处并附上本文地址超链接以及博主博客地址:https://blog.csdn.net/vensmallzeng。若觉得本文对您有益处还请帮忙点个赞鼓励一下,笔者在此感谢每一位读者,如需联系笔者,请记下邮箱:[email protected],谢谢合作!

 

 

 

        最近跟进的项目中时刻不离NER任务,笔者团队采用过多个版本bi-lstm+CRF程序去实现NER的bi-lstm+CRF,感觉每个版本都有每个版本的优势,所以下面就来分享第一个版本,该版本中的输入词向量是随机生成的并且所有的.py文件中有不容易读懂的地方,笔者都进行了注释,方便自己也方便大家。

1、如果需要本文源码请自行转向“https://download.csdn.net/download/vensmallzeng/11212457”。

2、该版本主要包括以下几个部分:

Bi-lstm+CRF实现NER(随机生成词向量)

checkpoints文件夹用于保存训练好的模型以及参数;

Bi-lstm+CRF实现NER(随机生成词向量)

data文件夹用于保存训练、验证、测试数据等;

Bi-lstm+CRF实现NER(随机生成词向量)

tensorboard文件夹用于保存张量可视化的数据; 

Bi-lstm+CRF实现NER(随机生成词向量)

3、Data_process.py文件包含一些数据预处理的函数如read_data、build_vocab、sequence2id以及process_seq等,各函数具体功能见注释。

Bi-lstm+CRF实现NER(随机生成词向量)

 Bi-lstm+CRF实现NER(随机生成词向量)

Bi-lstm+CRF实现NER(随机生成词向量)

Bi-lstm+CRF实现NER(随机生成词向量)

4、Parameters.py文件见其名知其义,应该存放一些用于模型训练、测试的参数。

Bi-lstm+CRF实现NER(随机生成词向量)

5、biLstm_Crf.py文件主要是用于实现bi-Lstm+CRF功能,下面将着重介绍该文件。

首先随机生成词向量(每一次训练都会重新生成,所以省去了预训练词向量的工作),生成的词向量被用于查询bi-Lstm+CRF模型的输入词向量。

Bi-lstm+CRF实现NER(随机生成词向量)

然后构建bi-Lstm+CRF模型,该模型的输入为查询得到的词向量。

bi-Lstm层:

Bi-lstm+CRF实现NER(随机生成词向量)

CRF层:

Bi-lstm+CRF实现NER(随机生成词向量)

损失函数用的是最大似然函数,这里采用梯度下降算法来优化损失函数,所以需要给损失函数加负号:

Bi-lstm+CRF实现NER(随机生成词向量)

优化损失函数

Bi-lstm+CRF实现NER(随机生成词向量)

模型搭建好后要考虑给模型喂数据,因此需要将数据按要求进行打包处理之后方能喂给模型。

Bi-lstm+CRF实现NER(随机生成词向量)

模型测试调用代码

Bi-lstm+CRF实现NER(随机生成词向量)

实际应用调用代码

Bi-lstm+CRF实现NER(随机生成词向量)

6、Train_Model.py文件主要是用于训练bi-Lstm+CRF模型,并将训练好的模型参数保存下来,以便后期直接调用。

 Bi-lstm+CRF实现NER(随机生成词向量)

 7、serve.py文件主要是用于实际应用,可以实现输入一句话,自动提取出人名、地点和机构。

主体代码如下:

Bi-lstm+CRF实现NER(随机生成词向量)

 实际效果如下:

Bi-lstm+CRF实现NER(随机生成词向量)

 

最后想和大家谈谈几个关于Bi-lstm+CRF的个人总结:

① 与传统Lstm不同,双向Lstm同时考虑了过去的特征(通过前向过程提取)和未来的特征(通过后向过程提取)。说直白点,后向过程其实相当于将原始序列逆向输入到Lstm中。因此从这个角度来看,双向Lstm相当于两个Lstm(一个正向输入序列,一个反向输入序列),最后将两者的输出结合起来作为最终的结果。

② 采用CRF层的原因:Bi-lstm考虑了输入词(字符)向量序列的上下文信息,CRF考虑了tag之间的依赖关系信息,因此二者结合无疑可以选择出最适合的预测tag序列。

如:句子的开始单词的标签类型应该是BO,而不是I;限制一些格式,B-Person I-Person是合理的,B-Person I-Organization是不合理的

③ 需要训练的参数有:Bi-lstm中的参数与CRF中转移概率矩阵A

④  Bi-lstm+CRF训练时采用监督学习方法,通过最大化预测为真实标记序列的概率(将概率取对数再取负,然后用梯度下降算法优化)来更新Bi-lstm中的参数与CRF中转移概率矩阵A。虽然刚开始训练“真实标记序列不会对应最大的概率值”,但通过样本的连续迭代优化,最终会实现“真实标记序列应该对应最大的概率值”;Bi-lstm+CRF测试时,直接根据训练好的参数求出所有可能的预测序列对应的得分(这里应该会用到维特比算法),最后取对应最大得分的预测序列作为最终预测结果。

⑤ Bi-lstm+CRF的输入是一组词(字符)向量,输出是一组预测tag序列。

参考文献:

【1】https://blog.csdn.net/bobobe/article/details/80489303

 

 

 

日积月累,与君共进,增增小结,未完待续。