1

在 Spacy 的最新文档中,以下链接给出了以下示例:

https://spacy.io/usage/embeddings-transformers

import spacy
from spacy.tokens import Doc
from spacy_transformers import TransformerData
from thinc.api import set_gpu_allocator, require_gpu


def custom_annotation_setter(docs, trf_data):
    doc_data = list(trf_data.doc_data)
    for doc, data in zip(docs, doc_data):
        doc._.custom_attr = data


nlp = spacy.load("en_core_web_trf")
nlp.get_pipe("transformer").set_extra_annotations = custom_annotation_setter
doc = nlp("This is a text")
assert isinstance(doc._.custom_attr, TransformerData)
print(doc._.custom_attr.tensors)

此代码在尝试处理测试数据时抛出异常:

AttributeError:[E047] 无法为未注册的扩展属性“custom_attr”赋值。你忘记调用set_extension方法了吗?

我使用以下方式设置扩展名:

Doc.set_extension('custom_attr', default=True)

我的问题是,Transform 类是否应该自己处理添加这个特殊扩展(如示例代码中所暗示的那样),或者这只是示例中的一个错误?

4

1 回答 1

1

如果我在你的函数定义之前设置扩展名,你的代码对我来说运行没有错误。

import spacy
from spacy.tokens import Doc
from spacy_transformers import TransformerData
from thinc.api import set_gpu_allocator, require_gpu

Doc.set_extension('custom_attr', default=True)

def custom_annotation_setter(docs, trf_data):
    doc_data = list(trf_data.doc_data)
    for doc, data in zip(docs, doc_data):
        doc._.custom_attr = data


nlp = spacy.load("en_core_web_trf")
nlp.get_pipe("transformer").set_extra_annotations = custom_annotation_setter
doc = nlp("This is a text")
assert isinstance(doc._.custom_attr, TransformerData)
print(doc._.custom_attr.tensors)

也许你set_extension打错地方了?

于 2021-08-07T05:46:42.690 回答