自然语言处理(NLP)之四:信息抽取

本文详细介绍了信息抽取中的关键任务——实体抽取(NER)和关系抽取,包括命名实体识别的规则基、统计基、非时序模型和时序模型方法,以及实体链接的实体消岐、指代消解和实体统一过程。关系抽取涉及基于规则、监督学习和半监督学习的策略,探讨了各自优缺点和应用场景。
摘要由CSDN通过智能技术生成

0. 信息抽取

信息抽取(information extraction, IE)是将非结构化或半结构化描述的自然语言文本转化成结构化特征的一种基础自然语言处理(NLP)任务,它包括三类子任务:

  1. 抽取文本中指定类型的实体(实体抽取/命名实体识别,NER);
  2. 抽取实体之间的语义关系(关系抽取,RE);
  3. 文本中的事件(event)。

1. 实体抽取(命名实体识别,NER)

实体抽取(Entity Extraction)又名命名实体识别Named Entity Recognition, NER)或专名识别,是指一类用于识别文本中具有特定意义的实体(名词)的技术。其实现过程可分为三步:

  1. 定义待标记实体种类;
  2. 准备训练数据集(即:给训练集数据打上定义的实体标记);
  3. 构建并训练命名实体识别模型。

命名实体识别任务的目的是预测出输入序列文本中,每个token所属于的实体类别,它可以是已定义的某一实体种类别,也可以是非实体类别。因此,命名实体识别可以抽象成一种文本分类任务,其预测模型可采用以下四类:

  1. 规则模型
  2. 统计模型
  3. 非时序模型
  4. 时序模型

其中,前两种方法常用作Baseline,或为后两种机器学习方法提供预测特征(作为人工特征工程中设计的一类特征),生产环境下最常用的还是基于CRF的命名实体识别(一种时序模型方法)。

1.1.1 基于规则的命名实体识别方法

基于规则的命名实体识别有两种常见方法:

  • 正则匹配法:是根据已知命名实体特点,制定正则匹配规则,然后预测时通过正则表达式匹配来进行实体识别。像邮编,电话号码等具有统一规律的实体,多适用这种识别方法。
  • 词库匹配法:是将已知命名实体收入到数据库中,预测时通过数据库匹配来进行实体识别。像国家、地区、组织等可有限穷举的实体,多适用于这种方法。

基于规则的实体识别方法虽然简单,实际上也比较实用,特别是对于一些垂直领域的应用,或者数据量比较少或者没有标签数据的时候。如果我们有一个足够丰富的词典库,那么仅仅根据词库也能做到不错的准确率。另外,基于规则的识别方法是一套非常有效的基准(baseline)。

1.1.2 基于统计的命名实体识别方法

基于统计的命名实体识别是一种特别的词库匹配方法。它基于已有的语料实体识别结果,统计每一个token被标记为每一种实体的频数,然后取频数最高的类别作为此token的实体标记存入数据库;在命名实体识别时通过数据库匹配的方式,查找文本token的实体类别。这种方法对于某一类单词(可以同时属于多个实体类别,而且不确定性较高)有效性会比较弱

1.1.3 基于非时间序列模型的名实体识别方法

在非时序模型不考虑token出现的先后顺利,它独立预测文本中每个token属于哪个实体类别。常用的有随机森林、SVM和神经网络等非时间序列模型。

1.1.4 基于时间序列模型的命名实体识别方法

时间序列模型是命名实体识别的最常用方法,一般生产中多通过人工特征工程+CRF,或LSTM/Bert等深度学习方法自动特征工程方法+CRF来进行预测。

常用的人工特征工程方法有

  • 当前token向量
  • 前一token向量
  • 后一token向量
  • 前一token与当前token组成的词组的向量(采用由词向量产生句向量的方法,计算词组向量)
  • 当前token与后一token组成的词组的向量
  • 当前token的词性
  • 前一token的词性
  • 后一token的词性

此外,还可以将Baselin NER标签也作为特征添加进来:

  • 基于规则的NER标签
  • 基于统计的NER标签

2. 实体链接(Entity Linking)

2.1 实体消岐

实体消岐Entity Disambiguiation)是指:对具有多种可能实体类型的token,明确其在上下文中所表示的实体类型(就像明确上下文中,多义词所表达的含义一样)。

其具体实现方法是:

  1. 首先获取token所有实体类型的解释文本;
  2. 然后计算待识别token所处上下文语段,与每种类型解释文本的相似度;
  3. 最后选出相似度最高的实体类型,作为此处上下文中token的实体类型标记。

2.2 指代消解

指代消解:是将代表同一实体(Entity)的不同指称(Mention)划分到一个等价集合(指代链,Coreference Chain)中的过程,能有效解决文本当中的指代不明问题。

2.3 实体统一

实体统一Entity Resolution):是统一同一个实体的多种不同表达方式的过程(如:某人的大名、小名、外号等称呼都代表这同一个人,所以要将它们统一成同一个实体)。

其具体实现方法是:

  1. 首先构建所有实体的特征向量;
  2. 然后两两一组计算各实体对的特征向量相似度;
  3. 最后将相似度高于阈值的实体对标记为同一个实体;
  4. 合并同类项后,完成实体统一。

3. 关系抽取

关系抽取:通常在实体抽取和实体链指之后进行,它对给定句子中两个实体之间的语义关系进行判断,属于多分类问题。常见关系抽取技术有三大类,它们分别是:

  1. 基于规则的关系抽取方法;
  2. 监督学习方法的关系抽取方法;
  3. 半监督学习或无监督学习的关系抽取方法。

3.1 基于规则的关系抽取

基于规则的方法依靠人工指定关系抽取规则,它首先定义待抽取关系的类型,然后定义所需抽取的实体种类,最后尽量全面地制定出符合待抽取关系的文本匹配规则(且所有匹配规则组成的集合,称为规则集合)。

该方法具有抽取结果准确不需要任何训练数据的优点,也具有查全率低(low recall rate)、人工成本高、规则设计困难和可移植性差的不足,但瑕不掩瑜,基于规则的方法,仍是目前最主流、且见效速度最快的关系抽取方法。尤其是在手里几乎没有任何训练数据时,依赖人的经验进行关系抽取的该方法是必然的选择,等数据量逐渐积累后,可再慢慢替换成基于模型的方法。

其中,查全率低和规则设计困难是两种无法克服的系统固有特性。查全率低,是因为关系抽取规则全凭人工经验设定,而人的经验不可避免的具有局限性,所以人工能想象出的规则一定仅占全部匹配规则中的一小部分。规则设计困难,是为保证查全率而设计足够多条规则时,如何保证各规则间不冲突、不冗余,是十分困难的。

3.2 基于监督学习的关系抽取

基于监督学习的关系抽取,本质上是一个分类问题,它的实现方法分为四步:1)定义带抽取关系类型;2)定义所需实体类型;3)准备训练数据(命名实体识别+关系标记);4)数据建模。这其中训练数据准备的成本极高,实际工作中很难为开发监督学习的关系抽取模型特意制作一份训练数据。

数据建模中,常用的特征工程方法有基于词袋模型的词向量特征、单词词性特征、命名实体识别特征、位置信息特征、句法结构特征和依存文法特征等。

对于正样本比例占总体少数且还分为多个类别的不均衡样本的多分类问题,从模型设计角度:可采用 Stacking 模型融合方法,组合使用一个二分类模型和一个多分类模型来缓解样本不均衡的影响(此外,还可从数据准备角度:正采样或负采样操作来缓解样本不均衡问题。)。其实现方法如下:

  1. 首先,集中数据集中所有类别的正样本统一标记为1、负样本标记为0,以提升训练集中正样本所占比例;
  2. 然后,采用新构建的数据集训练一个二分类模型,来区分正/负样本;
  3. 最后,以数据集中所有类别的正样本作为训练集,构建一个多分类模型,来区分正样本的具体类别。

3.3 基于半监督学习的关系抽取

当有少量已标记数据和大量无标记数据时,可采用半监督学习方法来提升模型预测效果,比较经典的有Bootstrap和Distant Supervision方法。其中Distant Supervision(远程监督)方法借助已建立的知识图谱,来进行关系抽取。

  • 7
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用自然语言处理NLP)库来实现答案抽取。以下是一个简单的答案抽取示例: 1. 导入必要的库: ```python import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize, sent_tokenize ``` 2. 准备文本: ```python text = "The quick brown fox jumped over the lazy dog. The dog slept all day." ``` 3. 分句和分词: ```python sentences = sent_tokenize(text) words = word_tokenize(text) ``` 4. 去除停用词: ```python stop_words = set(stopwords.words('english')) filtered_words = [word for word in words if word.casefold() not in stop_words] ``` 5. 找到问题中的关键词: ```python question = "What did the dog do all day?" question_words = word_tokenize(question) keywords = [word for word in question_words if word.casefold() not in stop_words] ``` 6. 对于每个句子,找到包含关键词的词组: ```python for sentence in sentences: sentence_words = word_tokenize(sentence) for i in range(len(sentence_words)): if sentence_words[i].casefold() == keywords[0]: answer = " ".join(sentence_words[i:i+len(keywords)]) print(answer) ``` 在上述代码中,我们首先将文本分成句子和单词。然后,我们去除停用词,找到问题中的关键词,并使用这些关键词在每个句子中找到包含它们的词组。最后,我们将找到的答案打印出来。 需要注意的是,这只是一个简单的答案抽取示例,实际应用中需要更加复杂的算法和技术来实现更精确的答案抽取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值