使用我自己的 Tokeniser 创建一个 Spacy 管道?

Create a Spacy pipeline with my own Tokeniser?

令我困惑的是,spacy "pipeline" 是一系列处理步骤,但将原始数据转换为 spacy 文档的第一步是 "hidden"。我认为,与所有其他步骤不同,它不能从管道访问。 那么,如果我想用我自己的 Tokenizer 替换它、更改它或创建一个管道,那么正确的方法是什么?

分词器不属于常规管道的原因是因为它是 "special":实际上只能有一个,而所有其他管道组件都采用 Doc 和 return 它,分词器获取 文本字符串 并将其转换为 Doc

但是,nlp.tokenizer 是可写的,因此您可以创建自己的 Tokenizer class from scratch, or even replace it with an entirely custom function。这是一个展示这个想法的超级简单的例子:

from spacy.lang.en import English
from spacy.tokens import Doc

nlp = English()

def my_tokenizer(text): 
    tokens = text.split(" ")
    doc = Doc(nlp.vocab, words=tokens)
    return doc

nlp.tokenizer = my_tokenizer
doc = nlp("Hello world!")
print([token.text for token in doc])  # ['Hello', 'world!']