1. 关系抽取介绍
1.1 概念
关系抽取是一种关系识别任务,它旨在从文本数据中自动识别和提取出不同实体之间的关系,也就是从一段文本中抽取出 (主体,关系,客体) 这样的三元组,用英文表示就是(subject, relation, object)这样的三元组.
给定一个句子 S,其中包含实体 A 和实体 B,预测两个实体间的关系r ∈ R (R代表数据集中所有关系的集合) . 或者说,抽取实体之间的关系是将非结构化的文本信息转化为结构化的信息,最终以关系三元组〈S,P,O〉的形式来描述. 其中,S 和O为主、客实体,P为预测出的两个实体之间的关系.
由此可以看出,关系抽取有两大任务:
- 识别文本中的subject和object (实体识别任务)
- 判断这两个实体属于哪种关系 (关系分类)
1.2 常见关系种类
- 正常关系:
- 三元组之间没有重叠, 数据中只有一个实体对及关系
- 如: “《人间》是王菲演唱歌曲“中存在1种关系: (王菲-歌手-人间)
- 单一实体关系重叠问题 (Single Entity Overlap (SEO) )
- 数据中一个实体参与到了多个关系中
- 如: “叶春叙出生于浙江,毕业于黄埔军校”中存在两种关系: (叶春叙-毕业院校-黄埔军校) 、 (叶春叙-出生地-浙江)
- 实体对重叠(Entity Pair Overlap (EPO))
- 数据中一个实体对有两种不同的关系类型
- 如: “周星驰导演了《功夫》,并担任男主角”中存在2种关系: (周星驰-演员-《功夫》) 、 (周星驰-导演-《功夫》)
1.3 评估指标
- 准确率:对于给定的测试数据集,模型正确分类为正类的样本数与全部正类样本数之比
- 召回率:对于给定的测试数据集,预测正确的正类与所有正类数据的比值
- F1-score:准确率和召回率的调和平均值,对系统性能的综合评价
1.4 常用方法
- 基于规则方式
- 从文本中抽取出三元组信息 (实体-关系-实体)
- 基于Pipeline流水线方法
- 在实体识别已经完成的基础上再进行实体之间关系的抽取.
- 基于Joint联合抽取方法
- 修改标注方法和模型结构直接输出文本中包含的(ei ,rk, ej)三元组. Joint联合抽取方法又分为: "参数共享的联合模型" 和 "联合解码的联合模型"
2. 三种方法实现
2.1 基于规则方法
基于规则实现关系抽取的原理 (主要分为三个步骤)
- 第一步:定义需要抽取的关系集合,比如【夫妻关系,合作关系,,…】
- 第二步:遍历文章的每一句话,将每句话中非实体和非关系集合里面的词去掉
- 第三步:分别从实体集合和关系集合中,提取关系三元组
2.1.1优缺点
- 优点:实现简单、无需训练、小规模数据集容易实现
- 缺点:对跨领域的可移植性差、人工标注成本高以及召回率较低
2.1.2 代码案例:
用jieba.posseg进行分词,然后抽取出nr(实体)以及可能在关系集合中的关系
2.2 基于pipeline方法
2.2.1 流程:
- 先对输入的句子进行实体抽取,将识别出的实体分别组合;然后再进行关系分类.
- 注意:这两个子过程是前后串联的,完全分离.
2.2.2 优缺点:
- 优点:
- 易于实现,实体模型和关系模型使用独立的数据集,不需要同时标注实体和关系的数据集.
- 两者相互独立,若关系抽取模型没训练好不会影响到实体抽取.
- 缺点:
- 关系和实体两者是紧密相连的,互相之间的联系没有捕捉到
- 容易造成误差积累、实体冗余、交互缺失.
2.2.3 BiLSTM+Attention模型架构解析
- BiLSTM+Attention模型最初由Zhou等人在2016年的论文《Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification》中提出.
- 该模型结合了双向长短时记忆网络 (Bidirectional LSTM) 和注意力机制 (Attention) ,用于处理输入序列并提取关系信息. 该模型并被应用于关系分类任务.
基于上图模型架构所示: BiLSTM+Attention模型整体分为五个部分:
- 输入层(Input Layer):
- 输入的是句子,可以是字符序列也可以是单词序列,或者两者相结合. 此外,对于句子中的两个实体,分别计算各个字符相对于实体的位置. 比如有如下样本:
文本描述: “在《逃学威龙》这部电影中周星驰和吴孟达联合出演” 在这个样本中,实体1为周星驰,实体2为吴孟达. 关系为合作关系. 对于第一个字符“在”字来说,其相对于实体1的距离为: “在”字在字符序列中的索引 - 实体1在字符序列中的索引. 相对于实体2的距离为: “在”字在字符序列中的索引 - 实体2在字符序列中的索引. 因此,模型的输入为子序列+字符的相对位置编码
- 双向LSTM层 (BiLSTM Layer):
- BiLSTM是一种双向LSTM,它能够同时捕捉上下文信息,包括前向和后向信息,因此在关系抽取任务中得到了广泛应用.
- 输出层 (Output Layer) :
- 根据任务的不同,输出层可以是分类层或回归层. 在关系抽取任务中,输出层通常是一个分类层,用于预测两个实体之间的关系类型.
- 注意力机制层 (Attention Layer) :
- 注意力机制可以让模型集中注意力于关键词或片段,有助于提高模型的性能. 这里注意力机制被用来确定每个句子中的单词对于关系分类的重要性. 具体来说,对于输入句子中的每个单词,注意力机制会为其分配一个权重,表示该单词对于关系分类的重要程度. 这些权重将被用于加权输入句子中每个单词的表示,以计算关系分类的输出. 本次注意力机制的实现是采用的基于注意力权重的加权平均池化方式.
- 具体实现方式如下:
- 第一步: 将 BiLSTM 网络的输出 经过一个 激活函数,得到一个矩阵
- 第二步: 将 作为输入,通过权重向量 和一个 函数,计算每个单词对于关系分类的重要程度,得到的结果是一个权重向量 .
- 第三步: 将BiLSTM网络的输出 和注意力权重 相乘得到一个加权和
- 第四步: 将第三步得到的结果 ,经过一个 激活函数,得到最终加权后的输入句子中每个单词的表示,以方便后续计算关系分类的输出
2.2.4 BiLSTM+Attention模型架构实现
1. 数据预处理
对送入模型的数据预处理分为以下四个步骤
- 查看项目数据集
- 编写Config类项目文件配置代码
- 编写数据处理相关函数
- 构建DataSet类与dataloader函数
1.1 查看项目数据集
本次项目数据原始来源为公开的千言数据集https://www.luge.ai/#/,使用开源数据的好处,我们无需标注直接使用即可,本次项目的主要需要大家掌握实现关系抽取的思想。
- relation2id.txt
relation2id.txt中包含5个类别标签, 文件共分为两列,第一列是类别名称,第二列为类别序号,中间空格符号隔开
- 训练数据集:train.txt
train.txt 中包含18267行样本, 每行分为4列元素,元素中间用空格隔开,第一列元素为实体1、第二列元素为实体2、第三列元素为关系类型、第四列元素是原始文本
- 测试数据集:test.txt
test.txt中包含5873行样本, 每行分为4列元素,元素中间用空格隔开,第一列元素为实体1、第二列元素为实体2、第三列元素为关系类型、第四列元素是原始文本
1.2 编写Config类
config文件目的:配置项目常用变量,一般这些变量属于不经常改变的,比如: 训练文件路径、模型训练次数、模型超参数等等
代码
1.3 编写数据处理相关函数
相关代码保存在process.py中
代码
1.4 构建DataSet类Dataloader函数
相关代码保存在data_loader.py中
代码
2. 模型搭建与训练
本项目中BiLSTN+Attention模型搭建的步骤如下:
- 编写模型类的代码
- 编写训练函数
- 编写使用模型预测代码的实现.
2.1 编写模型类 BiLSTM_Atten
相关代码保存在bilstm_atten.py中
代码
在模型类搭建过程中,对于BiLSTM输出在注意力机制层数据的形状变化进行反向推导:
首先我们需要明确的三个张量形状:
- BiLSTM模型的输出形状为:(seq_len, batch_size, hidden_dim)
- logits为:(batch_size, tag_size)
- 权重向量 是每个单词对于关系分类的重要程度,其形状应为:(batch_size, seq_len, 1)
明确这三个张量形状之后就能推出BiLSTM输出在注意力机制中的变化过程
2.2 编写训练函数
相关代码保存在train.py中
代码
训练效果:
2.3 编写预测代码
相关代码保存在predict.py中
代码
预测结果展示: