Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf

文章目录

  • 基本介绍
  • BertForTokenClassification
  • pytorch-crf
  • 实验项目
  • 参考

基本介绍

  • 命名实体识别:命名实体识别任务是NLP中的一个基础任务。主要是从一句话中识别出命名实体。比如

姚明在NBA打球

从这句话中应该可以识别出姚明(人), NBA(组织)这样两个实体。
常见的方法是对字或者词打上标签。B-type, I-type, O, 其中B-type表示组成该类型实体的第一个字或词。I-type表示组成该类型实体的中间或最后字或词,O表示该字或词不组成命名实体,当然有的地方也采用B-type, I-type, E-typeO形式。
比如上一句话就可以有如下标签

姚/B-PER 明/I_PER 在/O NBA/B_ORG 打/O 球/O

这样根据标签我们就可以提取出命名实体了

BertForTokenClassification

Bert作为进来比较火的模型,自然官方给出了进行命名实体识别的方法。就是BertForTokenClassfication类。使用如下:

  • 引入模型:

    from pytorch_pretrained_bert import BertForTokenClassification
    
  • 创建模型

    model = BertForTokenClassification.from_pretrained(bert_model_dir, num_labels=self.opt.tag_nums)
    
    • 参数:
      • bert_model_dir: bert预训练模型参数
      • num_labels: 词标签类的个数。即(2 or 3)*type+1
  • 模型使用

    out = model(batch_data, token_type_ids=None, attention_mask=batch_masks, labels=labels)
    

    参数解释:

    • 输入:
      • input_ids:训练集,torch.LongTensor类型,shape是[batch_size, sequence_length]
      • token_type_ids:可选项,当训练集是两句话时才有的。
      • attention_mask:可选项,当使用mask才有,可参考原论文。
      • labels:数据标签,torch.LongTensor类型,shape是[batch_size]
    • 输出:
      • 如果labels不是None(训练时):输出的是分类的交叉熵
      • 如果labels是None(评价时):输出的是shape为[batch_size, num_labels]估计值
    • From:https://zhuanlan.zhihu.com/p/56155191

这样通过BertForTokenClassificaiton类,我们就可以很容易实现命名实体识别了。

pytorch-crf

条件随机场(CRF)命名实体识别的传统方法。自深度学习火后,BiLstm+CRF成为命名实体识别的标准方法。具体原理可以参看这篇博客.
由于pytorch官方没有实现条件随机场。但是有人自己实现了pytorch-crf, 是一个不错的开源包。

  • pytorch-crf基本操作:https://pytorch-crf.readthedocs.io/en/stable/
  • pytorch-crf接入BiLstm:
    • 流程:
      • BiLstm输出:
        • (BatchSize, Sequence Length, 2*hidden_size)
      • 经过一个linear层:
        • (BatchSize, Sequence Length, tag_nums)
      • 可以考虑对tag_nums这个维度softmax一下.
      • 最后输入到CRF中.
    • 输出:
      • CRF的前向传播最后输出的是真实标签序列的分数。形式是 l o g ( r e a l a l l ) log(\frac{real}{all}) log(allreal), 因此是一个负值。作为损失函数需要加一个负号
      • 预测时调用decode就可以输出(BatchSize, Sequence)的序列标签。
      • 具体细节可以参见这个issue

实验项目

见个人github. 待补充

参考

  • 最通俗易懂的BiLSTM-CRF模型中的CRF层介绍
  • kmkurn/pytorch-crf
  • 一起读Bert文本分类代码

你可能感兴趣的:(信息科学)