基于规则方式实现关系抽取¶
学习目标¶
- 理解利用规则进行关系抽取的概念
- 掌握利用规则进行关系抽取的原理
- 掌握规则实现关系抽取的代码实现
1 利用规则进行关系抽取的理解¶
基于规则的关系抽取主要是通过人工定义一些抽取规则,从文本中抽取出三元组信息 (实体-关系-实体) ,这些规则通常基于领域知识和语言学知识,由专业人员设计和优化,重点即是定义规则. 虽然定义规则这种抽取方式看起来有点 low,但却简单实用,很多时候,效果比很多高深的算法还要好一些 (非绝对,具体领域具体分析) .
2 利用规则进行关系抽取的原理¶
基于规则实现关系抽取的原理 (主要分为三个步骤)
- 第一步:定义需要抽取的关系集合,比如【夫妻关系,合作关系,,…】
- 第二步:遍历文章的每一句话,将每句话中非实体和非关系集合里面的词去掉
- 第三步:分别从实体集合和关系集合中,提取关系三元组
3 利用规则进行关系抽取的代码实现¶
- 注意:下面的代码实例只代表规则实现方式的一种,其他场景下需要根据业务需求进行人为设定.
- 代码实战:
import jieba.posseg as pseg
# 需要进行关系抽取的样本数据
samples = ["2014年1月8日,杨幂与刘恺威的婚礼在印度尼西亚巴厘岛举行",
"周星驰和吴孟达在《逃学威龙》中合作出演",
'成龙出演了《警察故事》等多部经典电影']
# 定义需要抽取的关系集合
relations2dict = {'夫妻关系':['结婚', '领证', '婚礼'],
'合作关系': ['搭档', '合作', '签约'],
'演员关系': ['出演', '角色', '主演']}
# 通过jieba词性识别抽取出nr的实体和带有关系的词组
for text in samples:
entities = [] # 存储实体
relations = [] # 存储关系
move_name = []
for word, flag in pseg.lcut(text):
if flag == 'nr':
entities.append(word)
elif flag == 'x':
if len(move_name) == 0:
move_name.append(text.index(word))
else:
move_name.append(text.index(word))
entities.append(text[move_name[0] + 1: move_name[1]])
else:
for key, value in relations2dict.items():
if word in value:
relations.append(key)
if len(entities) >= 2 and len(relations) >= 1:
print("原始文本:", text)
print('提取结果:', entities[0] + '->' + relations[0] + '->' + entities[1])
else:
print("原始文本:", text)
print('不好意思,暂时没能从文本中提取出关系结果')
print('*'*80)
运行结果:
原始文本: 2014年1月8日,杨幂与刘恺威的婚礼在印度尼西亚巴厘岛举行
提取结果: 杨幂->夫妻关系->刘恺威
********************************************************************************
原始文本: 周星驰和吴孟达在《逃学威龙》中合作出演
提取结果: 周星驰->合作关系->吴孟达
********************************************************************************
原始文本: 成龙出演了《警察故事》等多部经典电影
提取结果: 成龙->演员关系->警察故事
********************************************************************************
4 利用规则实现关系抽取的优缺点:¶
- 优点:实现简单、无需训练,小规模数据集容易实现.
- 缺点:对跨领域的可移植性较差、人工标注成本较高以及召回率较低.
小节总结:¶
- 学习了什么是规则的关系抽取方式:
- 基于规则的知识抽取主要还是通过人工定义一些抽取规则,从文章中抽取出三元组信息 (实体-关系-实体) . 重点即是定义规则.
- 学习了基于规则实现关系抽取的原理 (主要分为三个步骤)
- 第一步:定义需要抽取的关系集合,比如【夫妻关系,合作关系,,…】
- 第二步:遍历文章的每一句话,将每句话中非实体和非关系集合里面的词去掉
- 第三步:分别从实体集合和关系集合中,提取关系三元组
- 学习了利用规则进行关系抽取的代码实现
- 利用规则实现关系抽取的优缺点:
- 优点:实现简单、无需训练,小规模数据集容易实现.
- 缺点:对跨领域的可移植性较差、人工标注成本较高以及召回率较低.