NeuralCoref是Spacy 2.1+的管道扩展,它使用神经网络来注释和解决核心群集。 NeuralCoref已经准备好生产,并集成在Spacy的NLP管道中,并可以扩展到新的培训数据集。
有关Coreference解决方案和NeuralCoref的简要介绍,请参阅我们的博客文章。 NeuralCoref用Python/Cython编写,仅针对英语提供了预先训练的统计模型。
NeuralCoref伴随着可视化客户端NeuralCoref-viz,这是一个由REST服务器供电的Web接口,可以在线尝试。 NeuralCoref根据MIT许可发布。
现在4.0版!在PIP上可用,与Spacy 2.1+兼容。
这是安装NeuralCoref的最简单方法。
pip install neuralcorefspacy.strings.StringStore size changed错误如果您提到spacy.strings.StringStore size changed, may indicate binary incompatibility在将神经核心与import neuralcoref NeuralCoref加载时二进制不相容性,这意味着您必须从分发源中安装NeuralCoref,而不是从发行源中安装NeuralCoref,而不是从车轮中安装神经核心才能使您的系统构建为spacy of Spacy的最新版本。
在这种情况下,只需重新安装NeuralCoref如下:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcoref为了能够使用NeuralCoref,您还需要拥有一个英语模型来进行spacy。
您可以使用任何英语模型在应用程序中都可以使用的任何功能,但是请注意,神经科的性能很大程度上取决于Spacy模型的性能,尤其是Spacy Model的Tagger,Parser和NER组件的性能。因此,更大的Spacy英语模型也将提高核心分辨率的质量(请参阅下面的内部和模型部分中的一些详细信息)。
这是您如何安装Spacy和(小)英语模型的一个示例,可以在Spacy网站上找到更多信息:
pip install -U spacy
python -m spacy download en您也可以从来源安装NeururCoref。您将需要首先安装依赖项,其中包括Cython和Spacy。
这是过程:
venv .env
source .env/bin/activate
git clone https://github.com/huggingface/neuralcoref.git
cd neuralcoref
pip install -r requirements.txt
pip install -e . NeuralCoref由两个子模块组成:
您第一次在Python中导入NeuralCoref时,它将在缓存文件夹中下载神经网络模型的权重。
默认情况下,缓存文件夹将设置为~/.neuralcoref_cache (请参阅File_utils.py),但是可以通过设置环境变量NEURALCOREF_CACHE来指向另一个位置,可以过度过度。
可以随时安全地删除缓存文件夹,下次加载模型将再次下载该模型。
您可以通过在加载NeuralCoref之前激活Python的logging模块,以获取有关内部模型的位置,下载和缓存过程的更多信息:
import logging ;
logging . basicConfig ( level = logging . INFO )
import neuralcoref
> >> INFO : neuralcoref : Getting model from https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz or cache
> >> INFO : neuralcoref . file_utils : https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz not found in cache , downloading to / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
100 % | █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 40155833 / 40155833 [ 00 : 06 < 00 : 00 , 6679263.76 B / s ]
> >> INFO : neuralcoref . file_utils : copying / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m to cache at / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
> >> INFO : neuralcoref . file_utils : creating metadata file for / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
>> > INFO : neuralcoref . file_utils : removing temp file / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
>> > INFO : neuralcoref : extracting archive file / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633 to dir / Users / thomaswolf / . neuralcoref_cache / neuralcoref 这是实例化NeuralCoref并将其添加到Spacy注释管道中的推荐方法:
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# Add neural coref to SpaCy's pipe
import neuralcoref
neuralcoref . add_to_pipe ( nlp )
# You're done. You can now use NeuralCoref as you usually manipulate a SpaCy document annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clusters将NeuralCoref添加到Spacy模型管道中的一种等效方法是首先实例化神经科类,然后手动将其添加到Spacy语言模型的管道中。
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# load NeuralCoref and add it to the pipe of SpaCy's model
import neuralcoref
coref = neuralcoref . NeuralCoref ( nlp . vocab )
nlp . add_pipe ( coref , name = 'neuralcoref' )
# You're done. You can now use NeuralCoref the same way you usually manipulate a SpaCy document and it's annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clusters NeuralCoref将解决核心发挥,并将其注释为._下的Spacy Doc , Span和Token对象中的扩展属性._.字典。
这是注释的列表:
| 属性 | 类型 | 描述 |
|---|---|---|
doc._.has_coref | 布尔 | 是否有任何核心已在文档中得到解决 |
doc._.coref_clusters | Cluster列表 | 所有核心方面的群集都提到了文档 |
doc._.coref_resolved | Unicode | DOC的Unicode表示,其中每个核心提及被关联集群中的主要提及代替。 |
doc._.coref_scores | dict | 提及之间的核心分辨率分数。 |
span._.is_coref | 布尔 | 跨度是否至少有一个核心提及 |
span._.coref_cluster | Cluster | 群集提到了与跨度的核心 |
span._.coref_scores | dict | 与其他提及(如果适用)的核心分辨率分辨率分数。 |
token._.in_coref | 布尔 | 令牌是否在内部至少一个核心提及 |
token._.coref_clusters | Cluster列表 | 所有核心提及的群集包含令牌 |
Cluster是一大批核心提及,它具有3个属性和一些简化集群中导航的方法:
| 属性或方法 | 类型 /返回类型 | 描述 |
|---|---|---|
i | int | DOC中集群的索引 |
main | Span | 集群中最具代表性的跨度 |
mentions | Span列表 | 集群中所有提及的列表 |
__getitem__ | 返回Span | 在集群中访问 |
__iter__ | 产量Span | 迭代集群中提到 |
__len__ | 返回int | 集群中的提及数 |
您还可以轻松地浏览Coreference群集链,并显示簇和提及。
这里有一些示例,请尝试自己测试。
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'My sister has a dog. She loves him' )
doc . _ . coref_clusters
doc . _ . coref_clusters [ 1 ]. mentions
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]. _ . coref_cluster . main
token = doc [ - 1 ]
token . _ . in_coref
token . _ . coref_clusters
span = doc [ - 1 :]
span . _ . is_coref
span . _ . coref_cluster . main
span . _ . coref_cluster . main . _ . coref_cluster重要的是:NeuralCoref提及是Spacy Spen对象,这意味着您可以访问所有常规跨度属性,例如span.start (文档中第一个跨度的索引的索引), span.end (文档中第一个令牌的索引)等...
例如: doc._.coref_clusters[1].mentions[-1].start将为您提供文档中第二个核心群集的最后一个标记的索引。
您可以将几个其他参数传递到neuralcoref.add_to_pipe或NeuralCoref()以控制NeuralCoref的行为。
这是这些参数及其描述的完整列表:
| 范围 | 类型 | 描述 |
|---|---|---|
greedyness | 漂浮 | 0到1之间的数字确定模型对做出核心决策的贪婪程度(更贪婪意味着更多的核心链接)。默认值为0.5。 |
max_dist | int | 在考虑当前提及的可能的先例时,有多少人提到。降低值会导致系统运行速度更快,但准确程度较差。默认值为50。 |
max_dist_match | int | 如果系统共享名词或专有名词,则该系统将考虑将当前提及与前面的提及max_dist 。在这种情况下,它看起来是max_dist_match and。默认值为500。 |
blacklist | 布尔 | 系统是否应该解决以下列表中代词的核心发挥: ["i", "me", "my", "you", "your"] 。默认值为真(COREFERY已解决)。 |
store_scores | 布尔 | 该系统是否应该在注释中存储分数的分数。默认值是正确的。 |
conv_dict | dict(str,列表(str)) | 您可以使用的转换字典将稀有单词(键)的嵌入到平均值(值)列表的平均值。例如: conv_dict={"Angela": ["woman", "girl"]}将通过使用更常见的woman和girl的嵌入而不是Angela的嵌入来帮助解决Angela的核心发挥。目前,这仅适用于单个单词(不适合单词组)。 |
import spacy
import neuralcoref
# Let's load a SpaCy model
nlp = spacy . load ( 'en' )
# First way we can control a parameter
neuralcoref . add_to_pipe ( nlp , greedyness = 0.75 )
# Another way we can control a parameter
nlp . remove_pipe ( "neuralcoref" ) # This remove the current neuralcoref instance from SpaCy pipe
coref = neuralcoref . NeuralCoref ( nlp . vocab , greedyness = 0.75 )
nlp . add_pipe ( coref , name = 'neuralcoref' )这是一个示例,说明我们如何使用参数conv_dict来帮助解决一个罕见词的核心发作,例如名称:
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
# Let's try before using the conversion dictionary:
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
doc . _ . coref_resolved
# >>> [Deepika: [Deepika, She, him, The movie star]]
# >>> 'Deepika has a dog. Deepika loves Deepika. Deepika has always been fond of animals'
# >>> Not very good...
# Here are three ways we can add the conversion dictionary
nlp . remove_pipe ( "neuralcoref" )
neuralcoref . add_to_pipe ( nlp , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
# or
nlp . remove_pipe ( "neuralcoref" )
coref = neuralcoref . NeuralCoref ( nlp . vocab , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
nlp . add_pipe ( coref , name = 'neuralcoref' )
# or after NeuralCoref is already in SpaCy's pipe, by modifying NeuralCoref in the pipeline
nlp . get_pipe ( 'neuralcoref' ). set_conv_dict ({ 'Deepika' : [ 'woman' , 'actress' ]})
# Let's try agin with the conversion dictionary:
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
# >>> [Deepika: [Deepika, She, The movie star], a dog: [a dog, him]]
# >>> 'Deepika has a dog. Deepika loves a dog. Deepika has always been fond of animals'
# >>> A lot better! examples/server.py中提供了用于在REST API中集成NeuralCoreF的服务器脚本的简单示例。
要使用它,您需要先安装猎鹰:
pip install falcon然后,您可以按以下方式启动服务器:
cd examples
python ./server.py并查询这样的服务器:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000您还有许多其他方法可以管理和部署NeuralCoref。在Spacy Universe中可以找到一些示例。
如果您想重新训练该模型或使用其他语言进行训练,请参阅我们的培训说明以及我们的博客文章