You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:07:50