如何修改spacy中具有管道组件的space y.tokens.doc.Doc令牌 [英] How to modify spacy.tokens.doc.Doc tokens with pipeline components in SpaCy
本文介绍了如何修改spacy中具有管道组件的space y.tokens.doc.Doc令牌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用Spacy对一些数据进行预处理。然而,我被困在如何修改spacy.tokens.doc.Doc
类的内容上。
例如:
npc = spacy.load("pt")
def pre_process_text(doc) -> str:
new_content = ""
current_tkn = doc[0]
for idx, next_tkn in enumerate(doc[1:], start=0):
# Pre-process data
# new_content -> currently, it is the way I'm generating
# the new content, concatenating the modified tokens
return new_content
nlp.add_pipe(pre_process_text, last=True)
在上述代码内的注释部分中,有一些标记我希望从doc
参数中删除,或者我希望更改其标记文本内容。也就是说,我可以通过(1)完全删除令牌或(2)更改令牌内容来修改spacy.tokens.doc.Doc
的内容。
有没有办法在保留npc = spacy.load("pt")
中的Vocab
的情况下,使用这些修改后的令牌创建另一个spacy.tokens.doc.Doc
。
目前我是通过返回字符串来生成新内容,有没有办法返回修改后的单据?
推荐答案
SpacyDoc
的核心原则之一是should always represent the original input:
Spacy的标记化是非破坏性的,因此它始终表示原始输入文本,不会添加或删除任何内容。这是
Doc
对象的一种核心原则:您应该始终能够重新构造和再现原始输入文本。虽然您可以解决此问题,但通常有更好的方法可以在不破坏输入文本↔
Doc
文本一致性的情况下实现相同的效果。
我在my comment here中概述了在不破坏原始输入的情况下排除令牌的一些方法。
或者,如果您确实想修改Doc
,您的组件可以create a new Doc
object并返回它。Doc
对象接受一个单词(例如,原始文档的单词)、一个字符串列表words
和一个可选的spaces
列表,该列表是一个布尔值列表,用于指示该位置的标记后面是否跟有空格。
from spacy.tokens import Doc
def pre_process_text(doc):
# Generate a new list of tokens here
new_words = create_new_words_here(doc)
new_doc = Doc(doc.vocab, words=new_words)
return new_doc
请注意,您可能希望在运行其他组件之前先将此组件添加到管道中。否则,您将丢失以前组件分配的所有语言特征(如词性标记、依存关系等)。
这篇关于如何修改spacy中具有管道组件的space y.tokens.doc.Doc令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文