如何使用add_pipe将YIELD生成器添加到spaCy中的PIPELINE



我正在学习Udemy课程,并处理一个问题,即如何使用add_pipe在spaCy中添加生成器我想教练使用spaCy 2.0有两个原因。首先,add_pipe函数需要spaCy 3.0中的一个字符串。其次,在中,从spaCy.pipeline导入的PenceSegmenter不再可用这是讲师使用的代码(注意:我注意到我为适应spaCy 3.0而更改了什么。(:

nlp = spacy.load("en_core_web_lg")
@Language.component("split_on_newlines")    # I added this line for spaCy 3.0
def split_on_newlines(doc):
start = 0
seen_newline = False
for word in doc:
if seen_newline:
yield doc[start:word.i]
start = word.i
seen_newline = False
elif word.text.startswith("n"):
seen_newline = True
yield doc[start:]
nlp.add_pipe("split_on_newlines",before="parser")
doc_doc = nlp(u"This is a sentence. This is another.nnThis is a nthird sentence.")

错误为:

Traceback (most recent call last):
File "C:Usersbinhdanaconda3envsnlplibsite-packagesIPythoncoreinteractiveshell.py", line 3369, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-15-4ccdfd3ee841>", line 15, in <cell line: 15>
doc_doc = nlp(u"This is a sentence. This is another.nnThis is a nthird sentence.")
File "C:Usersbinhdanaconda3envsnlplibsite-packagesspacylanguage.py", line 1022, in __call__
error_handler(name, proc, [doc], e)
File "C:Usersbinhdanaconda3envsnlplibsite-packagesspacyutil.py", line 1617, in raise_error
raise e
File "C:Usersbinhdanaconda3envsnlplibsite-packagesspacylanguage.py", line 1017, in __call__
doc = proc(doc, **component_cfg.get(name, {}))  # type: ignore[call-arg]
TypeError: Argument 'doc' has incorrect type (expected spacy.tokens.doc.Doc, got generator)

我意识到问题是管道不想将生成器添加到管道中,因为错误说它需要spacy.tokens.doc.doc。我需要帮助找到一种方法,将yield之类的生成器添加到nlp.pipeline中,同时保持split_on_newlines不变,因为我知道如何使用return而不是yield。我尝试了从spacy.pipeline导入Pensionizer、PensioneRecognizer中的,但它不起作用。我还看了问答;A当然可以,但并没有什么帮助。

在spaCy中,作为单个函数添加的简单组件必须是接受并返回Doc的函数。不能使用yield语句。

看起来你正试图使用一个组件将一个文档拆分为多个文档,但你不能这样做——一个组件必须提供相同数量的文档。

如果要在换行符上添加句子边界,可以标记is_sent_start属性。文档中有一个组件的例子。

相关内容

  • 没有找到相关文章

最新更新