带你轻松入门信息抽取|Python主题月

本文正在参加「Python主题月」,详情查看 活动链接

什么是信息抽取

定义:自动从无结构或半结构文本中抽取出结构化信息的任务

信息抽取的分类

1.根据抽取结果是否在原文中,可以将信息抽取分类为抽取式和生成式,抽取模型相对比较死板,原文中有什么信息就返回什么信息,而生成模型相对比较人性化,会将目标信息进行整理,本文主要介绍前一种。举例如下:

抽取式:

空腹血糖控制在 7mmol/L  ----->    空腹:7mmol/L 
复制代码

生成式:

肿瘤为隆起溃疡性,位于胃窦处 -----> Borrmann 分型:息肉型
复制代码

2.根据抽取结果结果可以将信息抽取分为:实体抽取、关系抽取、事件抽取。举例如下。

实体抽取:

疾病:间质性肺炎
复制代码

关系抽取:

疼痛 --疾病部位--> 双膝关节
复制代码

事件抽取:

病变事件:描述:类圆;病变大小 27*28 ;病变部位:左下肺背段
复制代码

通用评测标准

  • 精确率 P :模型预测出来的结果准不准,预测正确的个数/预测出的结果个数
  • 召回率 R :模型漏了哪些东西,预测正确的个数/人工标注的个数
  • F1:综合评价指标 ,2*P*R/(P+R)

信息抽取的应用

  • 医疗,从医疗文本中抽取病名,药名,症状等
  • 金融,从金融文件中抽取风险预警相关的信息等
  • 法律,从以往案例中抽取出关键信息辅助判案,或者构建法律知识图谱等
  • 构建知识图谱

信息抽取模型的关键点

信息抽取模型的关键要素就是解码设计,解码设计就是标注标签到结构化信息的转化过程,这是模型的核心。常见的解码设计有三种:

  • 序列标注:单类或者多类别标注,常用的有 BIO 解码或者 BMEO 解码
  • Pointer :标注抽取结果的 start 和 end
  • Token Pair:对句子中的字两两之间标注类别

实体抽取

1.定义:从文本中抽取出文本内容,并识别为预定义的类别,例子如下:

原文:患者出现左侧胸背部持续疼痛,在中西医结合医院查胸部 CT 平扫。
结果:症状 --> 左侧胸背部持续疼痛  
复制代码

2.常用解码设计使用 BIO

3.实际项目中的难点主要有两个:

  • 实体重叠嵌套,指的是文本中多个实体之间共享片段,如“患者出现左侧胸背部持续疼痛”中“左侧胸背部”是部位实体,“持续疼痛”是症状实体,如果要识别完整的“左侧胸背部持续疼痛”可能存在困难
  • 实体不连续,指的是一个实体由多个不连续片段组成,如“前胸、背部包块”我们如果想识别出“前胸包块”和“背部包块”两个实体也存在困难,因为没法通过常规的 BIO 标注

关系抽取

1.定义:从文本中抽取出一对实体和预定义的关系类型,得到包含语义信息的实体关系三元组,默认情况下连接这对实体的关系是有方向的,称为头实体和尾实体。举例:

原文:右下肺少许炎症
结果:(右下肺,部位疾病,炎症)
复制代码

2.解决步骤通常是分为两个步骤,第一步就是基本的实体抽取,第二步就是使用一对实体和句子进行关系判断。第二步又叫关系分类,指的是给定一对实体和文本,判断实体之间的关系类型。通常分多步模型去抽取的模型方案叫做 Pipeline ,只用一个模型抽取的方案叫做 Joint ,本文介绍的是 Joint 。

3.解码方法常见的有 BIO 、Pointer 、TPLinker 等,后面的比前面的更加复杂,但是能力也会更强。

4.常见的难点有两个:

  • 关系重叠,指的是一个实体属于多个关系,如“右下肺少许炎症,见结节”,这里的“右下肺”既和“炎症”有关系,又和“结节”有关系。

  • 实体对组合,指的是实体对有多重组合方式,如“左肺和右肺,各见一小结节”和“左肺和右肺,各见一小结节和磨玻璃影”两句话中的实体对关系抽取方式不同,需要一个更加复杂的模型来 cover 各种不同方式的关系抽取。

5.衍生问题如下:

  • 远监督噪音,因为一般情况不会有很多训练数据,所以可以用来构造训练数据

  • 文档级抽取,文档中的实体很多,但是会发生指代歧义等问题,所以难度也很大

  • 开放域关系抽取,开放领域中的关系都不是预先定义的,需要模型自动识别主谓宾三元组,往往用于构建知识图谱过程中。

事件抽取

1.定义:从一段文本中抽取出预定义的事件触发词和事件要素,组合为响应的机构化信息
,除了事件,实际应用中信息抽取的结果可能更加复杂,但都可以拆成关系抽取。

2.常见的解决方法就是把事件变成关系抽取问题进行解决

总结

文中主要涉及到的知识点有:

实体抽取:重叠嵌套实体、不连续实体、BIO
关系抽取:重叠关系、实体对组合、BIO、Pointer、TPlinker
事件抽取:复杂结构抽取
复制代码

BIO 、Pointer、TPlinker 这三个模型是基本可以解决所有信息抽取的任务,因为现在这一领域是个大一统状态,一个复杂模型可以解决各种问题。

Python 项目推荐