spaCy中nlp对象工作机制:为何实例可接收参数并调用?
spaCy中nlp实例可调用的实现原理
问题描述
我了解到spaCy中的nlp对象是Language类的实例,可处理文本并执行多种操作,示例代码如下:
import spacy nlp = spacy.blank("en") # Process the text doc = nlp( "In 1990, more than 60% of people in East Asia were in extreme poverty. " "Now less than 4% are." ) print(doc[0]) # prints "In"
但我有个疑问:为何该对象能像函数一样接收字符串参数并被调用?我编写了测试代码:
class ABC: def __init__(self,a=1): self.a = a def printa(self): print(self.a) abc = ABC() abc(2) abc.printa()
运行后报错:TypeError: 'ABC' object is not callable,而spaCy却能正常实现,请问其实现流程是什么?
实现原理
Python里默认的类实例没法像函数那样直接调用,这就是你的ABC实例报错的原因——它没实现__call__这个特殊方法。
spaCy的Language类正是靠实现__call__方法,让nlp实例具备了可调用能力。当你执行nlp(text)时,本质是在调用这个实例的__call__方法,内部会完成这些流程:
- 对输入文本做基础分词
- 运行流水线里的各个处理组件(空白模型只有分词环节,带预训练的模型会有词性标注、实体识别等)
- 最终返回封装好结果的
Doc对象
你可以给自己的测试类加上__call__方法来模拟这个效果:
class ABC: def __init__(self,a=1): self.a = a def printa(self): print(self.a) def __call__(self, new_a): self.a = new_a abc = ABC() abc(2) abc.printa() # 现在会输出2,不再报错
这样修改后,abc实例就能像函数一样被调用,逻辑和spaCy的nlp对象完全一致。
内容的提问来源于stack exchange,提问作者Esa Anjum
相关产品推荐
相关产品推荐

