如何修改spacy中具有管道组件的space y.tokens.doc.Doc令牌 [英] How to modify spacy.tokens.doc.Doc tokens with pipeline components in SpaCy

查看:16
本文介绍了如何修改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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆