数据代码见:https://gitee.com/lj857335332/bert_finetune_re
引言
关系分类任务在信息抽取中处于核心地位。关系分类任务就是从非结构化文本中抽取出结构化知识;具体为:区分出头实体与尾实体之间的语义关系,比如:
通过模型将头实体与尾实体的语义关系分类分出来。那么BERT模型如何应用在关系分类任务当中呢?关系分类模型的架构有多种选择:
- 第一种实现方式:将BERT模型应用于句子的向量表征,不管实体位于句子当中的哪个位置,仍然将句子分词,首尾加上[CLS]与[SEP],将[CLS]的向量表征拿出来,输入到分类器中,这个分类器输出关系预测类型上的打分。
- 第二种实现方式:不是直接拿到句子的向量表征,而是将句子中的向量表征拿出来,这两个向量表征进行拼接后输入到分类器中,这里就要涉及到MENTION POOLING操作。因为实体可能是单个token,也可能是多个token。如果是多个token的话,多个token的向量表征要转化成整个实体的固定大小的向量表征。
- 第三种方式:通过外部的信息告诉模型头实体与尾实体的位置,这就是所谓的POSITIONAL EMBEDDING。这种信息在传统的关系分类任务当中被验证是非常有帮助的,模型更容易表征两个实体的语义关系
- 第四种方式:通过在句子中添加特殊符号来标识两个实体的位置,这种实现方法对句子有一定的改变
研究者们已经将这7种架构在基准数据集上进行了对比,
下面就ENTITY MARKERS与CLS相结合予以实现。
一、项目环境配置
- torch==1.6.0
- transformers==3.0.2
- seqeval==0.0.12
- pytorch-crf==0.7.2
二、数据集介绍
Train | Dev | Test | Slot Labels | |
---|---|---|---|---|
SemEval10 | 6507 | 1493 | 2717 | 19 |
- 关系分类标签的数量由数据集决定
我们这一节使用semeval10
数据,数据集由训练集、验证集、测试集组成
semeval.txt
文件是semeval10
数据,是一个在学术论文中广泛使用的数据集。这个数据集每一行是一个JSON
文件,形式如下:
{
"token": ["the", "original", "play", "was", "filled", "with", "very", "topical", "humor", ",", "so", "the", "director",
"felt", "free", "to", "add", "current", "topical", "humor", "to", "the", "script", "."], "h": {
"name": "play",
"pos": [2, 3]}, "t": {
"name": "humor", "pos": [8, 9]}, "relation": "Component-Whole(e2,e1)"}
semeval_rel2id.json
文件是给定的关系分类标签映射,一共19个关系分类标签
三、代码介绍
data_loader.py
文件:这个文件的功能是将文本文件转化成InputExample类数据,并将输入样本转化为bert能够读取的InputFeatures类数据,最后保存至cache文件中,方便下次快速加载。utils.py
文件:封装了很多实用程序,方便统一调用trainer.py
文件:定义了任务的训练与评估以及保存模型与加载模型main.py
文件:用于模型的训练与评估predict.py
文件:用于模型的预测modeling_bert.py
文件:自定义关系分类BERT模型
1.Focal loss损失函数
F L ( p t ) = − α t ( 1 − p t ) γ l o g ( p t ) FL(p_t)=-\alpha_t(1-p_t)^{\gamma}log(p_t) FL(pt)=−αt(1−