我正在尝试在spaCy中编写一个自定义句子分段符,它将整个文档作为单个句子返回。
我使用here中的代码编写了一个自定义管道组件。
我无法让它工作,因为它不是改变句子边界而是将整个文档作为单个句子,而是抛出两个不同的错误。
如果我创建一个空白语言实例并且只将我的自定义组件添加到管道中,则会出现此错误:
ValueError: Sentence boundary detection requires the dependency parse, which requires a statistical model to be installed and loaded.
如果我将解析器组件添加到管道
nlp = spacy.blank('es')
parser = nlp.create_pipe('parser')
nlp.add_pipe(parser, last=True)
def custom_sbd(doc):
print("EXECUTING SBD!!!!!!!!!!!!!!!!!!!!")
doc[0].sent_start = True
for i in range(1, len(doc)):
doc[i].sent_start = False
return doc
nlp.begin_training()
nlp.add_pipe(custom_sbd, first=True)
我得到了同样的错误。
如果我更改它先解析的顺序然后更改句子边界,则错误会更改为
Refusing to write to token.sent_start if its document is parsed, because this may cause inconsistent state.
因此,如果它不存在需要依赖解析的错误,或者它在自定义句边界检测之后执行,并且在首先执行依赖解析时出现不同的错误,那么它是否应该执行它的错误是什么?
谢谢!
答案 0 :(得分:4)
来自spaCy的Ines回答了我的问题here
感谢您提出这一点 - 抱歉这有点令人困惑。 我很确定你描述的第一个问题已经解决了 主。 spaCy应该尊重自定义句子边界, 甚至在没有依赖解析器的管道中。
如果你想在没有解析器的情况下使用你的自定义SBD组件,那就非常了 简单的解决方案是在自定义中设置doc.is_parsed = True 零件。因此,当Doc.sents检查依赖关系解析时,它会显示 在is_parsed并且不会抱怨。
如果要将组件与解析器一起使用,请确保添加它 在解析器之前。解析器应始终尊重已设置 来自先前处理步骤的句子边界。