实体关系的抽取详解

引言

前面我们讲到了命名实体识别,在信息抽取领域是非常重要的,那么今天我们来说一下另一个比较重要的领域实体关系抽取,也就是我们再抽取完实体之后,再抽取他们之间的关系,举个例子:”张三毕业于北京大学,工作在北京。”首先我们可以抽取实体“张三”、“北京大学”和“北京”,下面我们就是得进行关系的抽取。如下图:
在这里插入图片描述
因此我们在信息抽取后一般就会形成这样的三元组{张三,毕业于,北京大学},{张三,工作在,北京},我们在使用这样的三元组进行我们相应的任务。下面我们来看一下关系抽取相关的技术有哪些:

1、基于规则

2、监督学习

3、半监督学习/无监督学习
B o o t s t r a p \quad\quad-Bootstrap
D i s t a n t s u p e r v i s i o n \quad\quad-Distant supervision

基于规则的关系抽取

基于规则的关系抽取的方法是人工定义好某种关系的实体集合,然后遍历文本,找到符合的实体,将实体之间的关系抽取,举个例子:
在这里插入图片描述
我们现在定义了is-a的实体,也就是属于关系的,下一步我们就开始遍历文本,在文本中我们发现这么一句话:“苹果是一种水果”,这里我们找到了实体“苹果”,和“水果”,那么我们就将“是一种”提取出来。如果又遍历到“香蕉属于水果”同理我们可以将“属于”提取出来就这样根据我们的规则将遍历内部实体,将对应的关系提取出来。这种方法实现起来比较简单 我们来分析一下它的优缺点:
优点:
1、也就是它只返回我们想要的结果,不会出现其他不正确的结果,比较准确。

2、不需要训练数据

缺点:

1、大量关系未覆盖

2、人力成本比较高

3、规则本身就很难设计

基于监督的学习方法

这种方法也就是我们比较常用的利用训练数据计算出一个比较优秀的模型。然后利用模型提取实体关系。一般的流程是:

1、定义实体关系

2、定义实体类型

3、训练数据的准备

举个例子:
“中国是沉睡的雄狮,拿破仑曾经这么说过”

在这里我们要有实体"中国”和“拿破仑”那么我们怎么训练呢?

就是我们将特征向量<“中国”,”拿破仑”>输入到模型中,然后让模型输出出这个向量属于每个关系的概率,所以这里的关键点是特征向量,也就是我们怎么定义向量<“中国”,“拿破仑”>这里就用到了我们在命名实体识别时提到的特征工程

特征工程:我们尽可能的将特征向量体现出两个实体之间关系的特点,因此特征工程可以:

1、将两实体之间的词,前后词作为特征

2、将当前词前后词的词性考虑为特征

3、将实体类别作为特征

4、位置相关的信息:实体之间的数量,实体的在文本中的位置

5、句法分析:两词之间的最短路径

6、依存文法:最短路径

等等你能够想到的能够体现两词之间的关系的特征

下面我们将特征输入到模型中进行分类如下图:
在这里插入图片描述

当然现在还有中模型时这样的
在这里插入图片描述
加一个二分类模型判断是否有关系,如果有关系在进行分类。因为数据集中很多实体都是无关系的,所以加上一个二分类的模型进行预判一下。

分类模型有很多种选择:SVM,HMM,LSTM等都行

基于半监督的学习方法

在这里我们主要介绍Bootstrap算法:利用算法生成规则

Bootstrap算法

刚开始与基于规则类似,我们先设置一个基于某种关系的实体库:
在这里插入图片描述
第一步:生成规则

1、文本:李航写了统计分析

规则:xx写了xx

2、机器学习是由周志华写的

规则:xx是由xx写的

第二步:将规则加入规则库

xx写了xx

xx是由xx写的

3、利用规则库搜索其他实体

文本:王五写了数据结构

实体:王五,数据结构

文本:算法基础是由赵六写的

实体:算法基础,赵六

4、将实体加入实体库
在这里插入图片描述
然后循环上面的步骤,让计算机自己寻找规则以及相应的实体

我们来分析一下这个算法的优缺点:
优点很明显:
不需要训练数据
不需要人工成本
规则自己生成
关系提取的范围比较广
缺点:
精度不够,一旦某一环节发生错误,错误会随着循环不断扩大,举个例子:我们在第一步一旦提取了一个”苹果”,”水果”这样的实体。随着循环我们提取的规则会跑偏。
所以我们为了解决这个问题,我们在循环的过程中会加入评估和过滤这也就是Bootstrap的改进算法:snow Ball

snow Ball算法

snow Ball算法是基于Bootstrap算法的只是在循环中加入了评估和过滤机制,我们来看一下对应的流程:

首先我们还是设计一个关于某种关系的实体库:
在这里插入图片描述

根据实体生成规则

第一步根据实体生成规则:
我的都知道微软(部署在)美国地区

优秀的知音(建立在)中国的广州

某某年IBM(成立于)德国南部

这个时候我们希望对这些规则做一个相似度的匹配,下面问题来了,怎么计算规则之间的相似度:
这里采用的是转换向量的形式,我们将规则设计成一个五元组的形式:

左边 实体 中间 实体 右边

比如:优秀的知音(建立在)中国的广州我们将其设置为

“优秀的”,“知音”,“建立在”,“中国”,“的广州”

然后分别将“左边”,“中间”,"右边”转换成向量,这样对于一个规则那就是:

<左>,实体,<中间>,实体,<右>

那我们在计算规则之间的相似度就是计算对应<左>,<中间>,<右>的相似度。例如:

我的都知道微软(部署在)美国地区

优秀的知音(建立在)中国的广州

转换为:

<左1>,微软,<中间1>,美国,<右1>

<左2>,知音,<中间2>,中国,<右2>

s i m = u 1 s i m ( 1 , 2 ) + u 2 s i m ( 1 , 2 ) + u 3 s i m ( 1 , 2 ) sim=u_1sim(左1,左2)+u_2sim(中间1,中间2)+u_3sim(右1,右2)

u u 表示权重,一般中间的权重比两边大,并且 u 1 + u 2 + u 3 = 1 u_1+u_2+u_3=1

那么我们就可以利用向量进行聚类的操作,留下相似度比较好的规则

同时,snow Ball还有一个很好的机制,也就是说假如多个规则相似度非常高,那么我们选择其中一个就可以了,或者做一个平均,也就是:

我们现在生成了 [ p 1 , p 2 , p 3 , p 4 ] [p1,p2,p3,p4] 我们进行一个简单的计算:

先计算p1,p2的sim,如果大于阈值
[p1,p2,]
计算与p3的sim,如果小于阈值

[p1,p2,],[p3]

计算[p1,p2,],[p3]与p4的sim,如果[p1,p2,],与p4的sim大于阈值

[p1,p2,p4],[p3]

最后我们将[p1,p2,p4]求平均形成一个新的规则

规则形成新的实体

第二步将规则加入到规则库,并利用规则形成新的实体
在这里插入图片描述
如上图我们在文本中提取到实体进行与规则库中的规则进行匹配,如果大于有规则的相似度大于0.7那么我们就将实体压入实体库中

模板的评估

下一步我们对规则库中的每条规则进行评估如下图:
在这里插入图片描述
对于每一条规则提取文本集中的实体,然后再与其他实体库进行比较,并记录每个实体提取的是否正确,计算每个规则最后的分值:

\dfrac{正确}{全部} 如上图规则1的分值为 3 4 \dfrac{3}{4}

实体的评估和筛选

最后一步实体的评估和筛选:

在这里插入图片描述
如上图我们知道每一个实体都是由对应的一条或者多条关系产生的,那么我们怎么评判每个实体的好坏呢?

有两个方面:
1、生成的对应规则是否靠谱

2、有几条规则生成该模型。

1的意思是说,比如上图的“知音”和“IBM”分别是由p1和p2生成的由于p2的值大于p1那么我们就可以说“IBM”比“知音”更靠谱

2的意思是对于“IBM”和“百度”来说百度是由两条规则生成的,要比“IBM”更靠谱

我们把这两条规则写成了一个公式:

s o c r e T i = 1 i = 1 k ( 1 s c o r e ( p i ) ) socre(T_i)=1-\prod ^{k}_{i=1}(1-score(p_i))

对于“知音“”来说

s o c r e = 1 i = 1 k ( 1 s c o r e ( p 1 ) ) = 1 ( 1 0.78 = 0.78 socre(知音)=1-\prod ^{k}_{i=1}(1-score(p_1))=1-(1-0.78)=0.78

对于“IBM“”来说

s o c r e I B M = 1 i = 1 k ( 1 s c o r e ( p 2 ) = 1 ( 1 0.8 = 0.8 socre(IBM)=1-\prod ^{k}_{i=1}(1-score(p_2)=1-(1-0.8)=0.8

对于“百度“”来说

s o c r e = 1 i = 1 k ( 1 s c o r e ( p 2 ) = 1 ( 1 0.76 1 0.89 = 0.973 socre(百度)=1-\prod ^{k}_{i=1}(1-score(p_2)=1-(1-0.76)(1-0.89)=0.973

我们对于 s o c r e T i < 0.7 socre(T_i)<0.7 直接删掉达到过滤的效果

snow Ball总结

在关系抽取比较重要,五元组的思路

发布了18 篇原创文章 · 获赞 8 · 访问量 984

猜你喜欢

转载自blog.csdn.net/li15006474642/article/details/104683237