文章目录

  • 一、简介
  • 二、原理
  • 三、实战
    • 1、规则集定义
    • 2、数据获取
    • 3、去除无关词组
    • 4、关系抽取
    • 5、抽取结果验证
    • 6、知识存储
    • 7、查询验证
  • 三、总结

阅读本文需要一定的python基础并具备代码调试能力,没有的请移步或者学习完再来,谢谢

一、简介

前面讲了一篇LSTM+CRF人物关系抽取实战,稍微有些复杂,本篇主要来一个简单的,基于规则

基于规则的知识抽取主要还是通过人工定义一些抽取规则,从文章中抽取出三元组信息(实体-关系-实体)。重点即是定义规则。虽然定义规则这种抽取方式看起来有点low,但却简单实用,很多时候,效果比很多高深的算法还要好一些(非绝对,具体领域具体分析)。
本文的数据来源和https://blog.csdn.net/qq_21120275/article/details/102159314保持一致。

二、原理

本文的抽取原理主要分为三个步骤(这三个步骤可以多看几遍,看懂了后面的部分其实就不需要看了)

第一步:定义需要抽取的关系集合,比如【父亲,母亲,儿子,女儿,…】
第二步:遍历文章的每一句话,将每句话中非实体和非关系集合里面的词去掉
第三步:从每句话的第二个词开始遍历,遇到关系集合中的词,就选出该词左右最近的实体

本文没有贴出全部代码,只拿重点代码作为讲解。

三、实战

1、规则集定义

本文从简单入手,依旧和https://blog.csdn.net/qq_21120275/article/details/102159314一样抽取人物关系,先定义需要抽取的关系集合

allowRelationships = ['母亲','父亲','儿子','女儿','母','父','下嫁','又嫁','祖父','祖母','孙','孙子','改嫁','哥哥','姐姐','弟弟']

2、数据获取

使用requests进行文章内容的爬取

import requests
from lxml import etree
import jieba
from jieba import posseg
import re
hraders={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763'}
url='http://www.uuqgs.com/lsrw/1358.html'
html = requests.get(url,headers=hraders)
text = html.content.decode("gb2312","ignore")
selector = etree.HTML(text)
content=selector.xpath('//div[@id="newscont"]/p/text()')

3、去除无关词组

通过jieba词性识别抽取出nr的实体和带有关系的词组,比如

武德九年(626年),玄武门之变后,李渊退位称太上皇,禅位于儿子李世民  => 李渊  儿子 李世民
# 抽取的实体词性
allowTags = ['nr']
relationships = set()
for line in content:sentence = []for word, tag in posseg.cut(line):if tag == 'nr' or word in allowRelationships:sentence.append(word)sentence = ' '.join(sentence)

4、关系抽取

遍历一句话,从第二个词组开始,如果该词组属于要抽取的关系词组,则抽出前一个词组作为主语,后一个词语作为宾语:
比如通过上一步骤,得到

李渊  儿子 李世民

从第二个词 儿子开始 ,判断属于关系词,则可认为李渊为主语,李世民为宾语

    sentenceSplit = sentence.split(' ')print("原始文本:", line)for i in range(1,len(sentenceSplit)-1):if sentenceSplit[i] in allowRelationships:source = sentenceSplit[i-1]relationship = sentenceSplit[i]target = sentenceSplit[i+1]# 不同场景中需要根据实际情况进行一些特殊的过滤print('提取结果:',source+'->'+relationship+'->'+target)relationships.add(source+'->'+relationship+'->'+target)

5、抽取结果验证

结果如下:

'''
原始文本: 武德九年(626年),玄武门之变后,李渊退位称太上皇,禅位于儿子李世民。
提取结果: 太上皇->儿子->李世民
原始文本: 李渊的祖父李虎,在西魏时官至太尉,是西魏八柱国之一。李渊的父亲李昞,北周时历官御史大夫、安州总管、柱国大将军,袭封唐国公。李渊的母亲是隋文帝独孤皇后的姐姐[7] 。
提取结果: 李渊->祖父->李虎
提取结果: 李渊->父亲->李昞
提取结果: 李渊->母亲->隋文帝  #错误结果
'''

6、知识存储

本文的存储形式采用rdf格式,使用rdflib工具包进行操作

import rdflibg = rdflib.Graph()
pesonUrl = 'http://www.huoyo.org/person/'
relationshipUrl = 'http://www.huoyo.org/relationship/'
for line in relationships:line = line.split('->')p1 = rdflib.URIRef(pesonUrl+line[0])re = rdflib.URIRef(relationshipUrl+line[1])#p2 = rdflib.URIRef(pesonUrl+line[2])p2 = rdflib.Literal(line[2])g.add((p1,re,p2))g.serialize("graph.rdf")

文件结果如下

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDFxmlns:ns1="http://www.huoyo.org/relationship/"xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
><rdf:Description rdf:about="http://www.huoyo.org/person/李渊"><ns1:女儿>南昌公主</ns1:女儿>...<ns1:女儿>高密公主</ns1:女儿><ns1:女儿>长沙公主</ns1:女儿><ns1:儿子>彭思王李元则</ns1:儿子></rdf:Description><rdf:Description rdf:about="http://www.huoyo.org/person/周王李元方"><ns1:母>张婕妤</ns1:母></rdf:Description>...<rdf:Description rdf:about="http://www.huoyo.org/person/韩王李元嘉"><ns1:母>宇文昭仪</ns1:母></rdf:Description>
</rdf:RDF>

7、查询验证

使用sparql语言进行查询验证:查询李渊的儿子是谁?

g = rdflib.Graph()
g.parse("graph.rdf", format="xml")
q = "PREFIX p: <"+pesonUrl+">" \"PREFIX r: <"+relationshipUrl+">" \"select distinct ?b where { p:李渊 r:儿子 ?b }"
x = g.query(q)
t = list(x)
for i in t:print(i)

三、总结

本文主要基于规则进行知识的抽取,核心点就是关系规则的定义和规则两边的实体抽取,整体效果还行,会有部分错误需要人工干预。基于规则抽取的优缺点如下:

  • 优点
  • 无需训练
  • 实现简单
  • 缺点(请一定重视缺点)
  • 需要人工干预,特别是细节处理上
  • 只能抽取实体-关系-实体模式的三元组,对于实体-实体-关系模式需要人工识别(或者定义多重规则)
  • 局限于通用领域的实体识别,特殊实体和词性需要单独处理

注意:根据场景进行适当选择与参考,不可完全照搬照抄,否则效果可能不理想


以上内容中包含全部核心思想和核心代码(请详细看上文的原理),复制黏贴即可!
有点尴尬的是,最近发现,由于写文章太早,当时所用的数据来源网站现在已经无法访问。

由于少部分同学有特殊需求,期待一个现成能跑的代码,本人做了一些整理,基于规则的关系抽取下载,找到资源下载模块自取,包含了需要抽取的数据、抽取代码,以及生成的关系文件(重新梳理不易,您可以赏我一瓶矿泉水喝喝)

知识图谱-基于规则的关系抽取相关推荐

  1. 知识图谱关系抽取 python_中文知识图谱-基于规则的关系抽取

    一.概述: 首先基于规则和人工抽取关系词,随后基于抽取的关系词抽取关系句,然后基于人工总结的模板结合同义词和re模块进行模板匹配抽取三元组. 二.规则抽取流程 1)句子关系词抽取(所谓的关系词就是含有 ...

  2. 知识图谱课程报告-关系抽取文献综述

    关系抽取文献综述 引言: ​ 随着大数据的不断发展,在海量的结构化数据或非结构化数据中更低成本的抽取出有价值的信息越来越重要,可以说信息抽取是自然语言处理领域的一项最基本任务,信息抽取进而可被分成三个 ...

  3. 知识图谱中传统关系抽取方法

    目前主要采用统计机器学习的方法,将关系实例转换成高 维空间中的特征向量或直接用离散结构来表示,在标注语 料库上训练生成分类模型,然后再识别实体间关系  基于特征向量方法 最大熵模型(Kambhatl ...

  4. 知识图谱构建中的抽取方法

    知识图谱构建中的抽取方法看法 一.实体抽取 二.属性值抽取 三.关系三元组抽取 基于规则的关系抽取 有监督关系抽取 半监督关系抽取 无监督关系抽取 远程监督关系抽取 开放域关系抽取 四.属性三元组抽取 ...

  5. 知识图谱中的关系方向与强度研究

    知识图谱中的关系方向与强度研究 臧根林1,2, 王亚强1,2, 吴庆蓉1,2, 占春丽1,2, 谢新扬1,2 1 拓尔思知识图谱研究院,广东 广州 510665 2 广州拓尔思大数据有限公司,广东 广 ...

  6. 论文浅尝 | AAAI2020 - 基于生成对抗的知识图谱零样本关系学习

    论文笔记整理:耿玉霞,浙江大学直博生.研究方向:知识图谱,零样本学习等. 来源:AAAI2020 论文链接:https://arxiv.org/pdf/2001.02332.pdf 本文是发表在AAA ...

  7. 基于生成对抗的知识图谱零样本关系学习 AAAI2020

    论文来源:AAAI 2020 论文链接:https://arxiv.org/pdf/2001.02332.pdf 本文是发表在AAAI2020上的一篇基于生成对抗网络进行知识图谱零样本关系学习的文章. ...

  8. 本体、知识库、知识图谱之间的关系

    这里引用漆桂林老师的解释: 从抽象层面看,本体最抽象,其次是知识库,最后才是知识图谱.举个例子,如果我们要做图书领域的知识库或者知识图谱,首先要对图书进行分类,这个分类就是本体,比如说,图书分为计算机 ...

  9. 知识图谱问答 | (3) 关系分类概述

    本篇博客主要基于微软亚洲研究院段楠老师的<智能问答>第三章 关系分类 进行整理. 1. 简介 给定一段自然语言文本以及该文本中出现的若干实体(e1,...,en)(e_1,...,e_n) ...

最新文章

  1. Docker(十四):Docker:网络模式详解
  2. String类(二)
  3. ACL 2020 | 知识库问答的多跳复杂问题查询图生成
  4. 有关提高visual studio开发效率的方法
  5. 使用 mock 数据在本地运行 SAP Fiori Elements 应用的工作原理
  6. Dubbo-gok8s注册中心设计方案与实现
  7. 小程序保存base64类型图片和普通图片实例
  8. Java工作笔记-发送SOAP协议请求
  9. BootstrapTable冻结表头(二)
  10. 【解决方案】: hyper-v 导入虚拟机报这个错误 32784
  11. 开源新手必看7个小技巧
  12. 1.5(java学习笔记)this关键字
  13. 用栈实现计算器c语言报告,利用栈实现c语言计算器
  14. PHP用户注册邮箱验证激活帐号
  15. 政府推荐:房屋租赁合同电子版模板出租房个人住房商业租房Word协议书范本
  16. React Concurrent Mode 之 Suspense 实践
  17. 如何集中自己的注意力
  18. 在Windows10环境下安装RabbitMAQ、Erlang的坑
  19. 手把手教会你如何玩转SpringMVC
  20. HTML中关于<br>,<P>换行符的区别和使用影响

热门文章

  1. Bounds(包围盒)概述与AABB包围盒应用
  2. 计算机如何识别数据恢复,【Mac数据恢复】如何恢复Mac数据到计算机?
  3. CPU指令解析及函数调用机制
  4. 5-24 css内容的补充
  5. 联想家庭版 mysql_1U小型数据库 联想万全R510售25500元
  6. VUE element-ui 之table表格第一行插入输入框
  7. java生成excel文件并且隔行换色。
  8. JavaScript高级语法之异步Promise(2:深入)
  9. python排版word文档命令方法大全_教你怎么使用Python对word文档进行操作
  10. ISW 2017:比CTF更刺激的真实网络攻防竞赛