知识图谱框架DeepKE简单使⽤+关系抽取+⼩⼩bug修复
⼀、关系抽取
知识图谱⾥⾯主要涉及两个很重要的领域:实体识别、关系抽取。当然,⼀般来说实体识别是关系抽取的前提条件,实体识别是序列标注的⼀种,通过将语句中的各种词的词性进⾏标注作为标签放⼊模型中训练,便可进⾏识别。当⼀段话能被识别出具体的实体信息后,我们便可以做关系抽取,关系抽取逻辑也⽐较简单,最简单是是三元组POI,
也即(吴京,战狼,主演)。其中实体head为吴京,实体tail为战狼,关系为主演,那么词性呢?吴京词性是⼈名,战狼词性是电影名或影视剧名。
如何实现的关系抽取,⼀般训练的数据是带有标签的,⽐如数据:
周星驰导演了《⼤话西游》,这是很棒的⼀部电影。 -- label = "导演"
《战狼2》是⼀部很成功的爱国主义情怀电影,主演是吴京。--label="主演"
导弹之⽗钱学森毕业于上海交通⼤学。--label="毕业院校"
于是我们先进⾏实体抽取,每段话⾥⾯会抽取到很多不同的实体,然后再进⾏训练识别标签,那么我得到标签之后,也就是三元组的relation,我们还需要两个对应的实体,也就是,⽐如关系“毕业院校”对应的两个实体应该是⼈名和学校名,于是我们进⾏实体识别,发现钱学森是⼈名,上海交通⼤学是学校名,于是得到了抽取的结果为:
(钱学森,上海交通⼤学,毕业院校)的三元组关系,从⽽实现了⽐较简单的关系抽取。
那么这就需要我们⼈为提前的告知,这个关系表是啥样的,所以关系抽取部分,会需要⼀个额外的⽂件信息,关系表relation.csv。如DeepKE框架中给出的关系表内容如下所⽰。
index为索引,模型训练⽤的,⽐如这⾥对应了11个关系,第0个None指的是如果⽂本中出现了关系表中没有的关系,就输出为None。如果模型训练输出的数值为第3个概率最⼤,多分类⽤softmax,于是对应的关系应该是:⼈物,地点,祖籍,3。然年去这个⽂本中到⼈物和地点的实体。
当然可能有⼈提问,如果⼀个⽂本中出现多个相同的实体呢?那咋办。
⽐如样例:
周星驰指导电影《功夫》的拍摄时,请教了很多武打明星如洪⾦宝进⾏武术指导。关系relation为导演。
那么导演对应的实体为:head:⼈名,tail:影视作品。
上⾯的⽂本中出现多个⼈名的实体:周星驰、洪⾦宝。
那么现在⼜怎么识别周星驰才是我们需要的那个⼈名的实体呢?
于是⼜提出了空间关系的⽅法,也就是进⾏位置标记。为了更精确进⾏识别,我们对出现的位置进⾏标记:
于是标签就是:周星驰,0,功夫,7,导演。
这样把很多数据进⾏位置标记后,再通过模型去训练识别这种空间上的位置关系,那么当出现多个实体后,模型就能很⾼效的识别出哪对实体对才是正确的,⽐如上⾯的⽂本中出现两个实体对:
(周星驰、功夫)—>(0,7)
(洪⾦宝,功夫)—>(26,7)
反复训练位置关系后,会认为(0,7)的关系对更接近模型要求,于是选择了周星驰和功夫,这样做后效果精确率⼤⼤提⾼了不少。
这就是关系抽取的简单介绍了。
⼆、DeepKE
2.1 框架介绍
DeepKE是我们课程⽼师和他的课题组联合开源到github的⼀个知识图谱操作框架,主要功能就是实体识别和关系抽取,这次使⽤这个框架就是⽼师的期末课程⼤作业要求,,,,,。不过框架还是设计的很棒的,包含了cnn, rnn, transformer, capsule, gcn, lm这些框架,相当于集成了很多基本的模型,可以任意调⽤。
但是有⼀个⼩⼩的bug,⼀开始我下载框架按样例运⾏,读取框架给的样例数据,没问题,可以正常运⾏,但是我换成了⾃⼰的其他数据集,读取就报错了,说是⼀些列名不存在,我就很奇怪了,明明是有的。这个框架当时按流程是直接把deepke安装到了python⾥⾯,当然你也可以直接下载deepke的源代码读取。因为读取报错,然后读取⽂件是deepke⾥⾯的,所以我只好卸载了安装在python⾥⾯的deepke,直接⽹上下载了源代码使⽤。
然后到报错的那部分代码,才发现了原因,然后修复了下bug提交到了DeepKE,今天刚提交的,可能DeepKE的维护的⼈员还没来得及审核提交修复申请,不过下⾯我会说⼀下原因,问题不⼤。
请先下载DeepKE源代码。
⽂件截屏如下:
我们使⽤关系抽取的话,按照官⽹的readme.md说明就⾏,就是直接到这个⽬录下:/DeepKE-main/example/re/standard。
内容如下:
然后按照⼈家的要求配置python模块如下:
这⾥我为啥单独说⼀下环境呢?我当时是在服务器上跑的,服务器的话是Linux系统,然后我同学做这个作业的时候,直接windows上安装的模块,⼀直报错torch1.5不到,后来仔细思考回忆到python的很多模块的开发都是基于Linux或Ubuntu,很多模块windows版本是没有的,然后他⽤电脑开启了⼀个Linux的虚拟机,然后直接安装成功了这⾥也提个醒,建议很多同学可以这样试试,跑代码在windows环境确实不太友好,不是这样错就是那样错。。。。
安装成功后,看吧,最后就是让你安装deepke到python内部,当然你也可以直接下载源代码。安装成功后,直接python run.py运⾏即可。
刚才看了下,⼯作⼈员还没审核更新修复读取bug,所以建议可以先直接⽂件读取试试,直接卸载deepke模块,下载deepke的⽂件。
其实就是在主页的src⽂件夹下就是deepke的代码⽂件,请单独把这个⽂件夹复制到/DeepKE-main/example/re/standard⽬录下。
如下:
因为我们从python中卸载了deepke,run.py⾥⾯是直接加载的,所以需要把deepke源代码和run.py同⼀⽬录下。
2.2 bug修复
现在解释下错误在哪⾥。
到deepke⾥⾯关于关系抽取的读取代码部分,/deepke/relation_extraction/standard/tools/preprocess.py,错误的部分如下:
我们先看⼀下样例中提供的样例数据,格式如下。
head和tail为实体,head_offset为出现的位置。
在preprocess.py⽂件中,加载数据格式是把⽂本setence中对应的head和tail的词都替换成head和tail,⽐如:
孔正锡,导演,2005年以⼀部温馨的爱情电影《长腿叔叔》敲开电影界⼤门
head=长腿叔叔
tail=孔正锡
电影源代码 下载head -> 导演 -> tail
替换后为:
tail,导演,2005年以⼀部温馨的爱情电影《head》敲开电影界⼤门
替换的⽬的在于后⾯模型加载训练数据⽐较⽅便,也是为了在⽂本中标出哪些实体是我们的⽬标。
好的,我们再回去看看preprocess.py读取⽂件的源码
sent = d['sentence'].strip()
sent = place(d['head'],' head ',1).replace(d['tail'],' tail ',1)
这⾏代码的作⽤是啥呢?
d是⼀个字典,d[‘head’]代表的就是具体内容,⽐如d[‘head’]为长腿叔叔,d[‘tail’]为孔正锡,place(d[‘head’], ’head ', 1)的作⽤就是替换⽂本’sentence’中第⼀个出现的字符串’长腿叔叔‘,然后结果为:孔正锡,导演,2005年以⼀部温馨的爱情电影《head》敲开电影界⼤门。然后后⾯的.replace(d[‘tail’], ’ tail ‘, 1)就是在这个基础上继续替换’孔正锡’。最后得到我们的:tail,导演,2005年以⼀部温馨的爱情电影《head》敲开电影界⼤门。
好的,现在仔细想想这个逻辑有没有啥问题呢
有!那就是两个实体包含的情况,就会出错,我的数据集内容⽐较多,就出现这样的错误,例如:
中国共产党领导了曾经落后的中国⾛向了繁荣富强。三元组为(中国,中国共产党,领导)。
head=中国、tail=中国共产党、relation=领导。
那么此时再按照上⾯的语句,操作如下:
然后再继续place(d[‘tail’], ’ tail ', 1),但是此时的中国共产党这个内容就没有了,于是就报错了
那么怎么修改了,如果语句信息很复杂就另说了,所以我就简单了写了个粗暴的判断⽅式:
if d['head']place(d['tail'],' tail ',1):
sent = place(d['tail'],' tail ',1).replace(d['head'],' head ',1)
else:
sent = place(d['head'],' head ',1).replace(d['tail'],' tail ',1)
这样就可以了。
但是还有些问题,就是有些数据⾥⾯本⾝就不包含实体的名词,就是所谓的脏数据,所以我⼜额外添加了个数据清洗函数,把不符合要求的数据打印显⽰了下。
def clean_data(data):#数据清洗,去除不符合要求的脏乱数据
true_data =[]
false_data =[]
for d in data:
if is_true_setence(d['sentence'].strip(),d['head'],d['tail']):
true_data.append(d)
else:
false_data.append(d)
logger.info('These data do not meet ')
for d in false_data:
logger.info(d)
return true_data
完整修复后的preprocess.py⽂件内容如下:
import os
import logging
from collections import OrderedDict
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论