如何使用 SpaCy 中的管道组件修改 spacy.tokens.doc.Doc 令牌

Pau*_*ann 3 python-3.x spacy

我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

在上面代码中的注释部分,我想从docparam 中删除一些标记,或者我想更改其标记文本内容。换句话说,我可以spacy.tokens.doc.Doc通过(1)完全删除标记或(2)更改标记内容来修改 的内容。

有没有一种方法来创建另一个spacy.tokens.doc.Doc与修改标记但保持Vocab距离npc = spacy.load("pt")

目前,我通过返回一个字符串来生成新内容,但是有没有办法返回修改后的 Doc?

Ine*_*ani 9

spaCy 的核心原则之一Doc是它应该始终代表原始输入

spaCy 的标记化是非破坏性的,因此它始终代表原始输入文本,从不添加或删除任何内容。这是Doc对象的一个核心原则:您应该始终能够重建和再现原始输入文本。

虽然您可以解决这个问题,但通常有更好的方法可以在不破坏输入文本的情况下实现相同的目标?Doc文本一致性。

我在此处的评论中概述了在不破坏原始输入的情况下排除令牌的一些方法。

或者,如果您真的想修改Doc,您的组件可以创建一个新Doc对象并返回它。该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
Run Code Online (Sandbox Code Playgroud)

请注意,您可能希望在其他组件运行之前将此组件添加到管道中。否则,您将丢失之前组件分配的任何语言特征(如词性标签、依赖项等)。