【问题标题】:Is it possible to use 'pipe' for batches of tokenized documents in Spacy?是否可以在 Spacy 中对批量标记化文档使用“管道”?
【发布时间】:2020-10-17 17:30:39
【问题描述】:

基于此链接: Is it possible to use spacy with already tokenized input?

我可以让 Spacy 将标记化的文档作为输入并进一步处理该文档。代码如下:

def nlp_process(self, token_tuple):
   # token_tuple = ("This is a test", ['This','is','a','test'])
    doc = Doc(self.nlp.vocab, words=token_tuple[1])
    for name, proc in self.nlp.pipeline:
      doc = proc(doc)

   return doc
 

这适用于单输入。如果我想使用 nlp.pipe() 函数以批处理模式处理文档怎么办?比如:

   nlp_docs = self.nlp.pipe(texts)

管道采用原始文本列表。这种情况该如何处理?

【问题讨论】:

    标签: spacy


    【解决方案1】:

    没有办法在 spacy 中设置无标记器的管道。一种选择是在创建文档后单独调用每个管道组件:

    for pipe_name in nlp.pipe_names:
        docs = nlp.get_pipe(pipe_name).pipe(docs)
    

    或其他等价物:

    for pipe_name, pipe in nlp.pipeline:
        docs = pipe.pipe(docs)
    

    如果您不启用多处理,这将与使用 nlp.pipe() 一样有效,因为这或多或少也是 nlp.pipe() 在下面所做的。

    另一种选择是创建您自己的替换标记器,它接受List[str]Doc 输入,并用此自定义标记器替换nlp.tokenizer。然后你可以像往常一样拨打nlp.pipe()。使用List[str] 输入的最简单版本如下所示:

    from spacy.tokens import Doc
    
    class CustomTokenizer(DummyTokenizer):
        def __init__(self, vocab):
            self.vocab = vocab
    
        def __call__(self, words):
            return Doc(self.vocab, words=words)
    
    nlp.tokenizer = CustomTokenizer(nlp.vocab)
    doc = nlp(["This", "is", "a", "sentence", "."])
    

    这个例子和一些相关的例子和讨论在这里:https://github.com/explosion/spaCy/issues/5399

    【讨论】:

    • 第一个选项也遇到了问题。神经网络的预测报告“doc.doc”中的“无文档属性”错误。
    • 关于'那么你可以像往常一样调用nlp.pipe()':如果我使用'CustomTokenizer'选项,当我使用nlp.pipe()时,管道的输入是否是一个列表令牌列表?输入 = [['This', 'is', 'test'], ['This', 'was', 'test']]?这是行不通的,因为 CustomToeknizer 的输入是单词列表,而不是单词列表。
    • docs 的参数 pipe.pipe()List[Doc]。如果您将nlp.pipe() 与自定义标记器一起使用,则提供List[List[str]],如果您使用nlp(),则提供List[str],如上例所示。
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多