Spacy官方文档Transformers示例代码AttributeError报错问题咨询
问题原因与结论
这属于spaCy官方示例代码的疏漏,Transformer组件不会自动注册你自定义的扩展属性。
spaCy的自定义属性机制要求,所有要通过._.访问的Doc/Token/Span级扩展属性,必须提前通过对应的set_extension方法显式注册,没有针对transformer组件的特殊自动注册规则。官方示例省略了属性注册的前置步骤,才会运行抛出E047错误。
你补充Doc.set_extension('custom_attr', default=True)的解决方法是完全正确的,为了避免多次运行代码时出现重复注册的报错,建议补充属性存在性判断,完整可运行代码如下:
import spacy from spacy.tokens import Doc from spacy_transformers import TransformerData from thinc.api import set_gpu_allocator, require_gpu # 新增属性注册逻辑 if not Doc.has_extension("custom_attr"): Doc.set_extension("custom_attr", default=None) 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)
内容的提问来源于stack exchange,提问作者Michael Wade
相关产品推荐
相关产品推荐

