一文详解自然语言处理任务之共指消解

Posted 机器学习算法与自然语言处理

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文详解自然语言处理任务之共指消解相关的知识,希望对你有一定的参考价值。

公众号关注 “ ML_NLP
设为 “ 星标 ”,重磅干货,第一时间送达!


作者: 龚俊民(昵称: 除夕)
学校: 新南威尔士大学
单位:Vivo AI LAB 算法实习生
方向: 自然语言处理和可解释学习
知乎: https://www.zhihu.com/people/gong-jun-min-74


前言
在所有的 NLP 任务中,有一些任务比较例外。它的输出不属于一个序列,一个类别,或者是多个序列,多个类别,而可能是一个图、或是一棵树,一种数据结构。每个 NLP 任务都有属于自己的领域知识和求解框架。但这里我们主要来说一下共指解析的解决框架和深度学习的做法。

一文详解自然语言处理任务之共指消解

共指解析的目标是要找出文中指代相同的代指。图中的"它"指的是什么呢?它是指拳头,"他"的拳头是谁的拳头呢?指的是钟佳播的全头。如果是一个 QA 模型,它就只会从字面意思去回答问题。把会锤倒高墙的东西变成代词"它",而不是这个"它"实际指代的对象。

一文详解自然语言处理任务之共指消解
共指解析是一个非常重要的问题。有一个叫 winograd 的比赛,希望取代图灵测试。在图灵测试中,AI 可以有太多方法去狡猾地欺骗人类。有一些话术,可以让不聪明的机器伪装成聪明的机器。winograd 是一个 QA 问题。比如它会问,这个奖杯放不进行李箱中,因为它太大了。问:什么太大了?对机器来说,这不是一个容易的问题。再比如,它还会问,这个奖杯放不进行李箱中,因为它太小了。问:什么太小了?要回答这种问题,需要机器对世界知识有一定的理解,才有可能得到正确的答案。

一文详解自然语言处理任务之共指消解
共指解析真正在做的是,通过一些文字片段,去指涉场景中对应的实体。文中那些建立场景理念的词汇,就叫作 mention。我们把两个 mention 找到它们是同一个实体的过程,叫作共指 corefer。我们目标是找出哪些 mention 是共指,哪些 mention 不是共指。对于先出现在共指中的 mention,称之为先行词 antecedent,后出现的则叫作 anaphor,没有共指单独出现的 mention 叫作 singleton。

一文详解自然语言处理任务之共指消解
一个共指解析的任务要做几件事情。一是要把所有的 mention 都标注出来。有时 mention 的定义是比较模糊的。一般我们会有一个语料参照,要把哪些作为 mention,哪些忽略。这些 mention 与 mention 之间,有时候会有边界重叠包含关系。比如他的拳头整体是一个 mention,它又可以是另外一个 mention。这些 mention 要被分成不同的簇类。相同簇的 mention 指代的对象会是同一个。如果是复数要怎么办呢?一般我们会单独作为新的实体簇来划分。它与 NER 不同在。NER 找的实体几乎不存在交叉。

一文详解自然语言处理任务之共指消解
第一步,针对找出 mention 这个问题,我们需要有一个二分类器。它的输入是一串 tokens 序列,输出是这一串 tokens 是不是 mention。Mention Detection 与分割和填槽有一点点不同。这个二分类器,输入是要一整个 span,决定它是不是 mention。之所以要这么做,是因为在做 mention detection 的时候,mention 之间会有互相包含的关系。假如有一个长度为 N 的序列,我们需要找出 N(N-1)/2 的可能 span 组合输入给模型去分类。这是一个有监督学习。监督信息来自于人工标注的 mention 作为正例,和未标注到的 token 作为负例。

一文详解自然语言处理任务之共指消解
第二步,是思考哪些 mention 应该要放在同一个类别簇中。这也是用一个二分类器,输入是两个 mention,输出是这两个 mention 有无共指的关系。如果我们有 K 个 mentions,则两两组合有 K(K-1)/2 次分类。

一文详解自然语言处理任务之共指消解
一文详解自然语言处理任务之共指消解
我们可以把上面两个步骤联合起来,只用一个分类器来端对端地训练。输入分类器的是两个 span,若二者是mention 且共指,则分类器输出 1。反之两个 span 任意一个不是 mention,或不共指,则输出0。它的复杂度为 O(N^4)。当 N 稍微大一点时,算法性能就会受限。

一文详解自然语言处理任务之共指消解
这个模型实际是怎样的呢?输入序列会先丢给预训练语言模型,得到每个 token 的嵌入。接着,我们会通过一个特别的模块专门把 span 提取出来,聚合成一个向量。接下来,我们会有一个 mention detection 的模块,输入一个向量,输出判断它是不是 mention。与此同时,两个 mention 向量还会输入给一个 mention pair 的模块,判断它们是不是共指。最后我们把三个分数直接加起来,作为最终输出。
一文详解自然语言处理任务之共指消解
span extraction 一种常见的做法是,假如一个 span 中有四个 embedding,我们先会把它的开头和结尾取出来,再把四个向量取平均,或把它们两两做自注意力,来做加权平均,得到注意过后的向量。比如湖边小屋,真正决定它是 mention 的词在小屋上。模型通过自动学得在小屋这类词上做更多的关注。从而获得一定的泛化能力,学到海边小屋,街边小屋,森林小屋,都是 mention。

一文详解自然语言处理任务之共指消解
如果我们要用这种端对端的方式训练,怎样把它的运算量变得更小呢?推断的时候,我们可以先做 mention detection,跑 N(N-1)/2 次,找出 K 个 mention。再去用 K 个 mention 两两分类看是不是共指。由于 K << N,后面的分类计算量大大减小了。另一个技巧是限制 span 的长度,比如最多不超过 10 个 tokens。这样复杂度就成了固定的数值。

一文详解自然语言处理任务之共指消解
各式各样抽取词嵌入的方法包括了 GLoVe + LSTM,ELMo 和 BERT。图中,小括号代表一个 mention。颜色越深代表注意的权重越大。模型是能够判断在一段 span 的 tokens 中,最重要的是哪些 token。像 fire 和 blaze 指的是同一个东西。factory 和 building 也指的是同一个东西。不过模型也有些 case 把握的不是很好,比如会把 region 和 area 看成是同一个指代。其中有一些比较难的case,需要模型理解一些常识才能去解。这就不是单纯读这篇文章就可以解决的问题。

一文详解自然语言处理任务之共指消解
共指解析可以怎么应用呢?有一种 Seq2seq 的方法,可以用来考虑聊天机器人容易忽略对话历史的问题。因为对话中很容易出现各种指代。Seq2Seq 的共指解析模型就会把上下文中的代指,解析成其实际指代。就能够让模型更好地考虑上下文历史。

一文详解自然语言处理任务之共指消解
在共指解析中,我们不是真的做聚类,而是把指代相同的放在同一个簇中。但对于全局信息,比如 Lee 指代 Mr. Lee,she 指代 Lee。它们在两两共指的时候是合理的。但三个放在一起就存在矛盾了。因此我们需要考虑簇类的层级关系。目前大部分的共指解析都是有监督的。EMNLP 19 里,有人想出了一种无监督的方法。通过 MASK 代词"他"的方式,让模型去预测这个"他"是什么词汇,从而找出共指的 mention。当然,单纯这样做会有一些问题,比如 he 只是一个 token。把他丢到 BERT 中,它也只会补一个 token。这算是一个未解的问题。



该笔记来自于李宏毅视频, 视频地址为: https:/ /link.zhi hu.com/?target=htt ps% 3A//www.youtube.com/watch%3Fv%3D2BemmceHKOU%26feature%3Dyoutu.be

Reference
  • 李宏毅 《人类语言处理 2020》Deep Learning for Coreference Resolution

  • [Lee, et al., EMNLP’17] Kenton Lee, Luheng He, Mike Lewis, Luke Zettlemoyer, End-to-end Neural Coreference Resolution, EMNLP, 2017

  • [Su, et al., ACL’19] Hui Su, Xiaoyu Shen, Rongzhi Zhang, Fei Sun, Pengwei Hu, Cheng Niu, Jie Zhou, Improving Multi-turn Dialogue Modelling with Utterance ReWriter, ACL, 2019

  • [Wu, et al., ACL’20] Wei Wu, Fei Wang, Arianna Yuan, Fei Wu, Jiwei Li, Coreference Resolution as Query-based Span Prediction, ACL, 2020

  • [Lee, et al., NAACL’18] Kenton Lee, Luheng He, and Luke Zettlemoyer, Higher- order coreference resolution with coarse-to-fine inference, NAACL, 2018

  • [Joshi, et al., EMNLP’19] Mandar Joshi, Omer Levy, Luke Zettlemoyer, Daniel Weld, BERT for Coreference Resolution: Baselines and Analysis, EMNLP, 2019

  • [Kantor, et al., ACL’19] Ben Kantor, Amir Globerson, Coreference Resolution with Entity Equalization, ACL, 2019

  • [Kocijan, et al., EMNLP’19] Vid Kocijan, Oana-Maria Camburu, Ana-Maria Cretu, Yordan Yordanov, Phil Blunsom, Thomas Lukasiewicz, WikiCREM: A Large Unsupervised Corpus for Coreference Resolution, EMNLP, 2019



重磅!忆臻自然语言处理-Pytorch交流群已成立

我们为大家整理了Pytorch中文版官方教程

添加小助手领取,还可以进入官方交流群

注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]

例如 —— 哈工大+张三+对话系统。

号主,微商请自觉绕道。谢谢!

一文详解自然语言处理任务之共指消解


推荐阅读:




以上是关于一文详解自然语言处理任务之共指消解的主要内容,如果未能解决你的问题,请参考以下文章

一文详解常见医学自然语言理解任务和算法

库教程论文实现,这是一份超全的PyTorch资源列表(Github 2.2K星)

NLP第十篇-语义分析

一份超全的PyTorch资源列表(Github 2.2K星)

库教程论文实现,这是一份超全的PyTorch资源列表(Github 2.2K星)

一文详解深度学习在命名实体识别(NER)中的应用