使用我自己的 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!']
令我困惑的是,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!']