spaCy添加自定义组件时nlp.add_pipe报[E966]错误如何解决?
报错原因
这个ValueError: [E966]报错是spaCy 3.0及以上版本的API调整导致的:3.0之前的版本允许直接将自定义组件的可调用对象传入nlp.add_pipe,3.0之后该接口只接收已经注册的组件工厂的字符串名称,不再支持直接传函数对象。
修复方法
有两种常用修复方案:
方式一:官方推荐的组件注册法(适配所有场景)
- 先导入
Language类,用@Language.component装饰器给你的自定义组件注册唯一的名称 - 调用
nlp.add_pipe时传入你注册的组件名称字符串即可
修复后的完整代码如下:
import spacy from spacy.language import Language # 注册自定义组件,指定组件的唯一标识名称 @Language.component("custom_length_printer") def custom_component(doc): # Imprime la longitud del doc en pantalla print("longitud del Doc:", len(doc)) # Devuelve el objeto doc return doc # Crea el objeto nlp nlp = spacy.load("es_core_news_sm") # 传入注册的组件名称字符串,而非函数本身 nlp.add_pipe("custom_length_printer", first=True) # Imprime los nombres de los componentes del pipeline print("Pipeline:", nlp.pipe_names)
方式二:临时插入法(适合快速测试小脚本)
如果只是临时测试不想做注册操作,可以直接手动往管道列表里插入组件,写法如下:
# 省略前面定义custom_component和加载nlp的代码 nlp.pipeline.insert(0, ("custom_component", custom_component))
该方式不推荐用于正式项目,注册法的兼容性和可维护性更好。
内容的提问来源于stack exchange,提问作者Mercedes Medaly
相关产品推荐
相关产品推荐

