知识抽取方法

2024-08-20 21:32
文章标签 方法 知识 抽取

本文主要是介绍知识抽取方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://pelhans.com/2018/03/16/xiaoxiangkg-note2/

本节介绍了针对结构化数据、非结构化数据、半结构化数据的知识抽取方法。

  • 知识抽取的概念
    • 知识抽取的子任务
  • 面向非结构化数据的知识抽取
    • 实体抽取
    • 实体识别与链接
    • 关系抽取
      • 基于模板的方法
        • 基于触发词的Pattern
        • 基于依存分析的Pattern
      • 监督学习
        • Pipeline训练
        • 联合模型
      • 半监督学习方法
        • 远程监督
    • 事件抽取
      • 事件抽取的pipeline方法
      • 联合训练
      • 基于深度学习的事件抽取方法
  • 面向结构化数据的知识抽取
  • 面向半结构化数据的知识抽取
    • 百科类知识抽取
    • Web网页数据抽取:包装器生成
      • 包装器归纳
      • 自动抽取
  • Ref

知识抽取的概念

知识抽取,即从不同来源、不同结构的数据中进行知识提取,形成知识(结构化数据)存入到知识图谱。大体的任务分类与对应技术如下图所示:

知识抽取的子任务

  • 命名实体识别
    • 检测: 北京是忙碌的城市。 [北京]: 实体
    • 分类:北京是忙碌的城市。 [北京]: 地名
  • 术语抽取 
    从语料中发现多个单词组成的相关术语。
  • 关系抽取 
    王思聪是万达集团董事长王健林的独子。 →  [王健林] <父子关系> [王思聪]
  • 事件抽取 
    例如从一篇新闻报道中抽取出事件发生是触发词、时间、地点等信息,如图二所示。
  • 共指消解 
    弄清楚在一句话中的代词的指代对象。例子如图三所示。

P3

面向非结构化数据的知识抽取

实体抽取

实体抽取抽取文本中的原子信息元素,通常包含任命、组织/机构名、地理位置、时间/日期、字符值等标签,具体的标签定义可根据任务不同而调整。如:

单纯的实体抽取可作为一个序列标注问题,因此可以使用机器学习中的HMM、CRF、神经网络等方法解决。

实体识别与链接

实体识别即识别出句子或文本中的实体,链接就是将该实体与知识库中的对应实体进行链接。其中涉及到了实体的识别与消岐技术。实体识别技术刚刚介绍过,下面把重点放在实体链接部分。

实体链接的流程如下图所示:

文字表述为,首先输入的是非结构化的文本数据,经由命名实体识别或词典匹配技术进行实体的指称识别。由于刚刚识别出来的实体可能是实体的部分表示或另类表示,因此需要结束表层名字扩展、搜索引擎、构建查询实体引用表等技术来对候选实体进行生成。经过该步骤生成的实体可能有多个候选项,因此需要对候选实体进行消岐,此处可使用基于图的方法、基于概率生成模型、基于主题模型或基于深度学习的方法。经过实体消岐后得到的唯一实体候选后就可以与知识库中的实体进行连接了。

举个例子:

关系抽取

关系抽取是从文本中抽取出两个或多个实体之间的语义关系。它是信息抽取研究领域的任务之一。如:

  • 王健林谈儿子王思聪:我期望他稳重一点。
    • 父子 (王健林, 王思聪)

根据关系抽取方法的不同,可以将其分为:基于模板的方法(触发词的Pattern, 依存句法分析的Pattern)、基于监督学习的方法(机器学习方法)、弱监督学习的方法(远程监督、Bootstrapping)。

基于模板的方法

基于模板的方法在小规模数据集上容易实现且构建简单,缺点为难以维护、可移植性差、模板有可能需要专家构建。

基于触发词的Pattern

首先定义一套种子模板,如:

其中的触发词为老婆、妻子、配偶等。根据这些触发词找出夫妻关系这种关系,同时通过命名实体识别给出关系的参与方。

基于依存分析的Pattern

以动词为起点,构建规则,对节点上的词性和边上的依存关系进行限定。一般情况下是形容词+名字或动宾短语等情况,因此相当于以动词为中心结构做的Pattern。其执行流程为:

监督学习

在给定实体对的情况下,根据句子上下文对实体关系进行预测,执行流程为:

  • 预先定义好关系的类别。
  • 人工标注一些数据。
  • 设计特征表示。
  • 选择一个分类方法。(SVM、NN、朴素贝叶斯)
  • 评估方法。

其优点为准确率高,标注的数据越多越准确。缺点为标注数据的成本太高,不能扩展新的关系。

Pipeline训练

即识别实体和关系分类是完全分离的两个过程,不会相互影响,关系的识别依赖于实体识别的效果,这样的好处的各模型相互独立,设计上较为容易,但误差会逐层传递,步骤太多有可能导致后续不可用。

联合模型

将实体识别和关系分类一起做,在一个模型中完成。

半监督学习方法

前面的监督学习效果虽好,但有标注数据集的获取困难。因此可以借助半监督学习的方法,此处又分为远程监督学习和Bootstrapping方法两种。

所谓远程监督方法就是知识库与非结构化文本对齐来自动构建大量训练数据,减少模型对人工标注数据的依赖,增强模型跨领域适应能力。Bootstrapping是通过在文本中匹配实体对和表达关系短语模式,寻找和发现新的潜在关系三元组。

远程监督

该方法认为若两个实体如果在知识库中存在某种关系,则包含该两个实体的非结构化句子均能表示出这种关系。如在某知识库中存在“创始人(乔布斯,苹果公司)”。那么就认为出现乔布斯和苹果公司的句子就是表述创始人这项关系。因此可构建训练正例:乔布斯是苹果公司的联合创始人和CEO。

远程监督流程为:

  • 从知识库中抽取存在关系的实体对。
  • 从非结构化文本中抽取含有实体对的句子作为训练样例。

远程监督可以利用丰富的知识库信息,减少一定的人工标注,但它的假设过于肯定,如乔布斯被赶出苹果公司。这句话表达的就不是创始人的例子,因此会引入大量的噪声,存在语义漂移现象。同时由于是在知识库中抽取存在的实体关系对,因此很难发现新的关系。

#### Bootstrapping

这个方法在很多任务中都有提到,其执行流程为:

  • 1.从文档中抽取出包含种子实体的新闻,如:
    • 姚明老婆 叶莉 简历身高曝光 
      X 老婆 Y 简历身高曝光
    • 姚明 与妻子 叶莉 外出赴约 
      X 与妻子 Y 外出赴约
    1. 将抽取出的Pattern去文档集中匹配
      • 小猪 与妻子 伊万 外出赴约
    1. 根据Pattern抽取出的新文档如种子库,迭代多轮直到不符合条件

该方法的优点为构建成本低,适合大规模的构建,同时还可以发现新的(隐含的)关系。缺点为对初始给定的种子集敏感,存在语义漂移现象,结果的准确率较低等。

事件抽取

从自然语言中抽取出用户感兴趣的事件信息,并以结构化的形式呈现出来,例如事件发生的时间、地点、发生原因、参与者等。如:

时间抽取任务最基础的部分包括:

  • 识别事件触发词及事件类型
  • 抽取事件元素同时判断其角色
  • 抽出描述事件的词组或句子

此外,事件抽取任务还包括:

  • 事件属性标注
  • 事件共指消解

对于事件抽取,也可分为Pipeline方法和联合训练的方法。

事件抽取的pipeline方法

有监督的事件抽取方法的标准流程一种pipeline的方法,将事件抽取任务转化为多阶段的分类问题,需要的分类器包括:

  • 事件触发次分类器(Trigger Classifier)
    • 用于判断词汇是否是是事件触发词,以及事件的类别
  • 元素分类器(Argument Classifier)
    • 判别词组是否是事件的元素
  • 元素角色分类器(Role Classifier)
    • 判定元素的角色类别
  • 属性分类器(attribute classifier)
    • 判定事件的属性
  • 可报告性分类器(Reportable-Event Classifier)
    • 判定是否存在值得报告的事件实例

可以看到,这个流程还是蛮长的,因此Pipeline存在的误差传递问题在这里格外严重,因此我们需要联合训练:

联合训练

基于深度学习的事件抽取方法

传统的方法需要借助外部NLP工具,还需要人工设计特征,但深度学习可以自动提取句子特征,减少对外部NLP工具的依赖。

下图给出一个典型的基于动态多池化卷积神经网络的事件抽取方法:

面向结构化数据的知识抽取

所谓结构化数据就是指类似于关系库中表格那种形式的数据,他们往往各项之间存在明确的关系名称和对应关系。因此我们可以简单的将其转化为RDF或其他形式的知识库内容。一种常用的W3C推荐的映射语言是R2RML(RDB2RDF)。一种映射结果如下图所示:

现有的工具免费的有D2R,Virtuoso、MOrph等。

面向半结构化数据的知识抽取

半结构化数据是指类似于百科、商品列表等那种本身存在一定结构但需要进一步提取整理的数据。

百科类知识抽取

对于百科类数据我们都较为熟悉,下面着重介绍怎么从百科里抽取知识:

上图给出从百科里抽取知识的流程介绍。(待补)

Web网页数据抽取:包装器生成

现在我们的目标网站是部分结构化的,如:

包装器是一个能够将数据从HTML网页中抽取出来,并且将它们还原为结构化的数据的软件程序。使用它提取信息流程为:

包装器归纳

对于一般的有规律的页面,我们可以使用正则表达式的方式写出XPath和CSS选择器表达式来提取网页中的元素。但这样的通用性很差,因此也可以通过包装器归纳这种基于有监督学习的方法,自动的从标注好的训练样例集合中学习数据抽取规则,用于从其他相同标记或相同网页模板抽取目标数据。其运行流程为:

自动抽取

对于监督学习我们知道标注数据是它的短板,因此我们想到自动抽取的方法。网站中的数据通常是用很少的一些模板来编码的,通过挖掘多个数据记录中的重复模式来寻找这些模板是可能的。自动抽取的流程如图所示:

Ref

王昊奋知识图谱教程


这篇关于知识抽取方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091228

相关文章

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法