中文命名实体识别,HMM,CRF,BiLSTM,BiLSTM+CRF的具体实现
向AI转型的程序员都关注了这个号????????????
人工智能大数据与深度学习 公众号:datayx
数据集
本项目尝试使用了多种不同的模型(包括HMM,CRF,Bi-LSTM,Bi-LSTM+CRF)来解决中文命名实体识别问题,数据集用的是论文ACL 2018Chinese NER using Lattice LSTM中收集的简历数据,
https://github.com/jiesutd/LatticeLSTM
该数据集就位于项目目录下的ResumeNER
文件夹里。
数据的格式如下,它的每一行由一个字及其对应的标注组成,标注集采用BIOES,句子之间用一个空行隔开。
运行结果
下面是四种不同的模型以及这Ensemble这四个模型预测结果的准确率(取最好):
最后一列Ensemble是将这四个模型的预测结果结合起来,使用“投票表决”的方法得出最后的预测结果。
(Ensemble的三个指标均不如BiLSTM+CRF,可以认为在Ensemble过程中,是其他三个模型拖累了BiLSTM+CRF)
具体的输出可以查看output.txt
文件。
代码获取方式
关注微信公众号 datayx 然后回复 NER 即可获取。
AI项目体验地址 https://loveai.tech
代码中一些需要注意的点
-
HMM模型中要处理OOV(Out of vocabulary)的问题,就是测试集里面有些字是不在训练集里面的, 这个时候通过观测概率矩阵是无法查询到OOV对应的各种状态的概率的,处理这个问题可以将OOV对应的状态的概率分布设为均匀分布。
-
HMM的三个参数(即状态转移概率矩阵、观测概率矩阵以及初始状态概率矩阵)在使用监督学习方法进行估计的过程中,如果有些项从未出现,那么该项对应的位置就为0,而在使用维特比算法进行解码的时候,计算过程需要将这些值相乘,那么如果其中有为0的项,那么整条路径的概率也变成0了。此外,解码过程中多个小概率相乘很可能出现下溢的情况,为了解决这两个问题,我们给那些从未出现过的项赋予一个很小的数(如0.00000001),同时在进行解码的时候将模型的三个参数都映射到对数空间,这样既可以避免下溢,又可以简化乘法运算。
CRF中将训练数据以及测试数据作为模型的输入之前,都需要先用特征函数提取特征!
-
Bi-LSTM+CRF模型可以参考:Neural Architectures for Named Entity Recognition,
https://arxiv.org/pdf/1603.01360.pdf
-
可以重点看一下里面的损失函数的定义。代码里面关于损失函数的计算采用的是类似动态规划的方法,不是很好理解,这里推荐看一下以下这些博客:
-
CRF Layer on the Top of BiLSTM - 5
https://createmomo.github.io/2017/11/11/CRF-Layer-on-the-Top-of-BiLSTM-5/
-
Bi-LSTM-CRF for Sequence Labeling PENG
-
https://zhuanlan.zhihu.com/p/27338210
Pytorch Bi-LSTM + CRF 代码详解
https://blog.****.net/cuihuijun1hao/article/details/79405740
阅读过本文的人还看了以下:
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx
长按图片,识别二维码,点关注
AI项目体验
https://loveai.tech