跳转至

基于规则方式实现关系抽取

学习目标

  • 理解利用规则进行关系抽取的概念
  • 掌握利用规则进行关系抽取的原理
  • 掌握规则实现关系抽取的代码实现

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 利用规则实现关系抽取的优缺点:


  • 优点:实现简单、无需训练,小规模数据集容易实现.
  • 缺点:对跨领域的可移植性较差、人工标注成本较高以及召回率较低.


小节总结:

  • 学习了什么是规则的关系抽取方式:
    • 基于规则的知识抽取主要还是通过人工定义一些抽取规则,从文章中抽取出三元组信息 (实体-关系-实体) . 重点即是定义规则.
  • 学习了基于规则实现关系抽取的原理 (主要分为三个步骤)
    • 第一步:定义需要抽取的关系集合,比如【夫妻关系,合作关系,,…】
    • 第二步:遍历文章的每一句话,将每句话中非实体和非关系集合里面的词去掉
    • 第三步:分别从实体集合和关系集合中,提取关系三元组
  • 学习了利用规则进行关系抽取的代码实现
  • 利用规则实现关系抽取的优缺点:
    • 优点:实现简单、无需训练,小规模数据集容易实现.
    • 缺点:对跨领域的可移植性较差、人工标注成本较高以及召回率较低.