指代消解


摘要:本文介绍NLP领域指代消解的基本概念、分类以及相关的算法,并通过python代码在语料上的实现。

1、指代消解简介:用一个抽象的概念来描述“指代”,就是:篇章中的一个语言单位(通常是词或短语)与之前出现的语言单位存在特殊语义关联,其语义解释依赖于前者。举几个例子:

1. 李明怕高妈妈一人呆在家里寂寞,便将家里的电视搬了过来。

2. 人们都想创造美好的世界留给孩子,可以理解,但不完全正确。

上面例子中的加粗部分,很明显依赖于前文。
在语言学把用于指向的语言单位(上面例子中的粗体部分)称为照应语(或指代语Anaphor),被指向的语言单位(具体的实体)称为先行语(或先行词Antecedent)。
确定照应语所指的先行语的过程就是指代消解。

 

2、指代消解的分类:
根据语言学知识,从照应语的角度将指代消解分为三类:

按先行词与照应语出现的顺序分类
若照应语的位置在先行语之前则称为预指消解,当照应语位于先行语之后称为回指消解。

按照应语的抽象程度分类
根据指代的表现形式的抽象程度,指代消解分为名词消解、代词消解、零代词消解,具体有六种:

3、指代消解的方法:
指代消解发展至今,经历了四种不同的方法,分别是:

Rule-based、
Mention pair、
Mention Ranking。
3.1 Rule-based方法
1976年,Hobbs提出了基于规则的朴素算法,被后人称为Hobbs算法。该方法有9个步骤,包含了很多规则,非常繁琐。Hobbs算法虽然是基于规则的,但在当时取得了不错的效果,现在也常常作为该领域的baseline模型。但是因为该方法是基于规则的,有很多指代消解没法解决。

3.2 Mention pair方法
Mention pair方法把指代消解问题转化为一个二分类问题。从左到右遍历句子,每找到一个指代,就把它和前面找到的每个指代作为一个pair,问分类器这个pair是否指代同一个实体,如果是的话,就把它们连起来。二分类的损失就是交叉熵。很简单的一个模型。

3.3 Mention Ranking
每个指代同时和前面所有指代打分,用softmax归一化,找出概率最大的先行词,添加一条连边。注意需要添加一个NA节点,因为有的指代可能第一次出现,前面没有先行词,或者这个指代根本就不是一个真正的指代。

前面的内容都是假设我们计算好了任意两个指代是coreference的概率,那么,如何来计算这个概率呢?主要有三种方法,分别是Non-neural statistical classifier、Simple neural network和More advanced model using LSTMs, attention。

A. Non-neural statistical classifier。统计机器学习方法,抽取每个指代的各种特征,然后用机器学习分类器来计算两个指代是coreference的概率。这里面的特征包括人称、性别一致性,语义相容性等等。

B. Neural Coref Model。输入是候选先行词和当前指代词的词向量,还需要加入一些额外的特征(Additional Feature),也就是上面统计机器学习方法里用到的一些特征。中间是FFNN,即全连接网络,最后输出两个指代是coreference的概率。

C. End-to-end Model。end2end模型是目前指代消解的SOTA模型,它把指代识别和指代消解两个任务融合到一起,用一个模型来解决。

4、指代消解的论文历史:

https://icode.best/i/50904944108903

19年bert之后还出了Spanbert来做指代消解《SpanBERT: Improving Pre-training by Representing and Predicting Spans》

    • ??????????个人建议:本篇是目前state-of-the-art performance,请仔细看看,并理解
    • 是在bert的基础上做的改进(对两个子任务LML和NSP做了修改)

5、实现部分 

发现https://github.com/huggingface/neuralcoref 不支持中文,需要自己拿中文语料重新训练,相当于从头搞一个。

常见用于实现指代消解的工具包:NeuralCoref、Stanford coreNLP、AllenNLP等。

大部分工具包都是基于语义结构中的词和句的规则来实现指代消解,而且都是在英文的语言结构当中实现了不错的效果,NeuralCoref和AllenNLP不支持中文,而Stanford coreNLP 是具有多种语言模型,其中包括了中文模型,但Stanford coreNLP 的指代消解在中文的表现并不理想。目前而言,基于深度学习的端到端指代消解模型还达不到生产应用的要求。

因为NeuralCoref、AllenNLP不支持中文,只有Stanford coreNLP支持中文,所以下载该软件进行测试使用。需要下载两个东西,一个是models,一个是对应的文件夹,里面有很多java相关的程序,我这边用的是python语言。

#安装stanfordcorenlp
!pip install stanfordcorenlp


# Simple usage
from stanfordcorenlp import StanfordCoreNLP

#地址的配置,将model放在下面的目录里
nlp = StanfordCoreNLP(r'F:\stanford-corenlp-full-2018-10-05\stanford-corenlp-full-2018-10-05', lang='zh')

sentence = '清华大学位于北京。学校很漂亮。大家都喜欢在这里学习'
print( 'Tokenize:', nlp.word_tokenize(sentence))
print( 'Part of Speech:', nlp.pos_tag(sentence))
print('Named Entities:', nlp.ner(sentence))
print( 'Constituency Parsing:', nlp.parse(sentence))
print('Dependency Parsing:', nlp.dependency_parse(sentence))

print( 'Coref:', nlp.coref(sentence))
nlp.close() # Do not forget to close! The backend server will consume a lot memery.

在跑coref指代消解的时候,会报下面的错误,在网上找了报错信息的资料,目前看网上的资料无法解决该报错。

目前指代消解这个任务,在中文的数据集上做的开源的模型还有资料比较少。

参考资料:

1、https://zhuanlan.zhihu.com/p/248029247

2、https://blog.csdn.net/echoKangYL/article/details/104589180

3、https://blog.csdn.net/lt326030434/article/details/88060448

4、https://zhuanlan.zhihu.com/p/53550123

5、https://blog.csdn.net/u013250861/article/details/115455799

6、https://icode.best/i/50904944108903

7、https://junzx.github.io/2018/04/24/%E6%8C%87%E4%BB%A3%E6%B6%88%E8%A7%A3%E5%9F%BA%E7%A1%80/

8、https://github.com/kentonl/e2e-coref

9、https://icode.best/i/44933732257177

10、https://blog.csdn.net/weixin_46133588/article/details/108404675

11、https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/97575989

12、https://paperswithcode.com/sota/coreference-resolution-on-ontonotes

13、https://blog.csdn.net/weixin_44912159/article/details/105656866

14、https://jackfromeast.site/2022-04/evaluation-of-coreference-resolution.html

15、个人笔记_指代消解(coreference) - 知乎 (zhihu.com)

16、安装spaCy和neuralcoref的坑 - 知乎 (zhihu.com)

17、基于Bert-NER构建特定领域中文信息抽取框架_qq61726c6324c0f的技术博客_51CTO博客

18、指代消解基础 | Blog of YQ (junzx.github.io)

19、Stanford Core NLP用法简介 - 李理的博客 (fancyerii.github.io)

20、https://zhuanlan.zhihu.com/p/468351722

21、https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/104322630

22、基于python的stanfordnlp中回指消解 - 问答 - Python中文网 (cnpython.com)