NeuralCoref: python的共指消解工具,向代词指代的问题进军!

共指消解        首先简要地说说共指消解是什么,有什么用处。假设机器正在阅读一个这样的文本: 克劳德·莫奈是印象派代表人物和创始人之一。 他最重要的风格是改变了阴影和轮廓线的画法。 1 2         如果机器想要从这段话中了解到关于莫奈风格的知识,它首先必须知道,第二句话中的“他”指的就是莫奈。弄清代词的指代就是共指消解中的一个典型任务。         关于共指消解,更详细的概念可以参照: https://blog.csdn.net/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 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/blmoistawinde/article/details/81782971?utm_source=copy

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值