共指消解 首先简要地说说共指消解是什么,有什么用处。假设机器正在阅读一个这样的文本: 克劳德·莫奈是印象派代表人物和创始人之一。 他最重要的风格是改变了阴影和轮廓线的画法。 1 2 如果机器想要从这段话中了解到关于莫奈风格的知识,它首先必须知道,第二句话中的“他”指的就是莫奈。弄清代词的指代就是共指消解中的一个典型任务。 关于共指消解,更详细的概念可以参照: https://blog.youkuaiyun.com/qjc937044867/article/details/51694547 下面直接引出解决这个问题的一个开源工具——NeuralCoref。 NeuralCoref Github官网:https://github.com/huggingface/neuralcoref NeuralCoref是使用时下先进神经网络技术完成指代消解任务的一个工具。它不是一个独立的python库, 而是另一个高速强大的python自然语言处理库——spaCy的一个拓展包,因此,要使用这个工具首先要安装spaCy: pip install spacy 1 然后,再安装NeuralCoref支持的几个模型,下面的例子中,我会使用面向英语的小模型,安装方法如下: pip install https://github.com/huggingface/neuralcoref-models/releases/download/en_coref_sm-3.0.0/en_coref_sm-3.0.0.tar.gz 1 如果需要更大的词汇量和准确率,把链接中的sm改成md/lg就可以下载对应的中模型和大模型。 基本用法 下面用jupyter notebook展示其基本用法:
# coding: utf-8
# In[1]:
import warnings
warnings.filterwarnings("ignore")
import spacy
nlp = spacy.load('en_coref_sm') # 引用小的英语指代模型
# In[2]:
doc = nlp(u'My sister has a dog. She loves him.')
print(doc._.has_coref) # 是否有指代?
print(doc._.coref_clusters) # 共指链组成的列表
print(doc._.coref_resolved) # 将代词用指代簇中的主要描述代替后的文本
# 下面的例子中我们可以获得更多详细信息。
# In[3]:
doc = nlp(u'My sister has a dog. She loves him')
print(doc.text) # 重新获得文本内容,string对象
for clust in doc._.coref_clusters:
clust_id = clust.i # 该指代在本文档中所有指代中的序号
main_mention = clust.main # 主描述,共指链中的代表词语
print("appearance of cluster %d: %s" % (clust_id,main_mention))
for mention in clust.mentions:
print("\t%s at [%d,%d]" % (mention.text,mention.start_char,mention.end_char))
# 这个例子揭示了共指消解中的3层的结构,Doc[文档]-cluster[共指链,代表同一实体的所有对象]-mention[共指链中的描述,实体的一个描述]。其中我们得到了共指链的代表词和每个个别描述在原文中的位置,这些将有助于我们还原文本或干一些别的事情(尽管已经有了coref_resolved,有时候我们还是需要做出一些特别的修改,后面的一篇文章中我就会用到它们。)。
# 以上例子已经揭示了这个工具的主要功能。这里再提供一些细节,Document下面有3种结构,下面列出它们支持的方法。
# In[4]:
doc = nlp(u'My sister has a dog. She loves him')
clust1 = doc._.coref_clusters[1] # Cluster,一个共指链
print(clust1.i) # 该指代在本文档中所有指代中的序号
print(clust1.mentions) # 本共指链中的所有对象
print(clust1.main) # 主描述,共指链中的代表词语
print(clust1.mentions[-1]._.coref_cluster) # _.coref_cluster【该对象所处的共指链】
# In[5]:
token = doc[-1] # token,相当于一个词语
print(token._.in_coref) # 是否在至少一个共指链中
print(token._.coref_clusters) # 包括这个token的所有共指链
# 遍历所有token
for tok in doc:
print(tok,end = " ")
print()
# In[6]:
span = doc[-1:] # span,doc中的一个部分
print(span._.is_coref) # 是否至少包含了一个共指对象
print(span._.coref_cluster.main)
print(span._.coref_cluster.main._.coref_cluster)
下一篇文章里,我会再尝试共指消解的一个有趣应用: NeuralCoref: 用指代消解来做一个“能多轮对话的问答对话机器人” --------------------- 本文来自 blmoistawinde 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/blmoistawinde/article/details/81782971?utm_source=copy