BERT-BiLSTM-CRF命名实体识别应用

引言

本文将采用BERT+BiLSTM+CRF模型进行命名实体识别(Named Entity Recognition 简称NER),即实体识别。命名实体识别,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。

  • BERT(Bidirectional Encoder Representation from Transformers),即双向Transformer的Encoder。模型的创新点在预训练方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的表示。
  • BiLSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。
  • CRF为条件随机场,可以用于构造在给定一组输入随机变量的条件下,另一组输出随机变量的条件概率分布模型。

环境

采用的Python包为:Kashgari,此包封装了NLP传统和前沿模型,可以快速调用,快速部署模型。

  • Python: 3.6
  • TensorFlow: 1.15
  • Kashgari: 1.x

其中Kashgari1.x版本必须使用TensorFlow一代。

BERT中文预训练数据

谷歌提前训练好的数据,其中中文模型可以从https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip下载。

更多预训练模型参考:https://github.com/ymcui/Chinese-BERT-wwm

自带数据训练评价

数据为中国日报的NER语料库,代码自动下载。

训练集、测试集和验证集的存储格式:

train_x: [[char_seq1],[char_seq2],[char_seq3],..... ]
train_y:[[label_seq1],[label_seq2],[label_seq3],..... ]
其中 char_seq1:["我","爱","中","国"]
对应的的label_seq1:["O","O","B_LOC","I_LOC"]

最后注释的为模型保存和调用代码。

实例

此本分将用自己的数据来进行命名实体识别。train_x和y存储格式和上面相同。

可用的标注格式

BIO标注模式: (B-begin,I-inside,O-outside)

BIOES标注模式: (B-begin,I-inside,O-outside,E-end,S-single)

  • B,即Begin,表示开始
  • I,即Intermediate,表示中间
  • E,即End,表示结尾
  • S,即Single,表示单个字符
  • O,即Other,表示其他,用于标记无关字符

代码

结果

输出展示了BERT的12层Transformer结构,以及它的参数量。最后是NER的结果。

参考资料

  • https://kashgari-zh.bmio.net/
  • https://www.jianshu.com/p/1d6689851622
  • https://blog.csdn.net/ctwy291314/article/details/102819221

 

5 评论

  1. 您好~想请教一下这个模型evaluate后,关于p、r、f1的micro avg和macro avg这两个值怎么解读,为什么我看有的关于kashgari的使用教程最后出来的有avg / total(p、r、f1)值,即有个总值,我评估出来的没有这个呀(因为没法贴图不知道您是否可以理解我的疑问

    • macro avg:对所有类别的平均。

      micro avg:对数据集中的每⼀个实例不分类别进⾏统计建⽴全局混淆矩阵,然后计算相应指标。

  2. re.error: nothing to repeat at position 0;运用以上代码跑出来是这个结果,对比你给出的结果,那个结果中最后一行没有[{‘text’: ‘吴 恩 达 在 北 京 大 学 。’, ‘text_raw’: [‘吴’, ‘恩’, ‘达’, ‘在’, ‘北’, ‘京’, ‘大’, ‘学’, ‘。’……这个出不来,其他都有。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注