重命名 spacy 的 pos tagger 标签

Rename spacy's pos tagger labels

我正在寻找具体的东西,但没有真正找到答案:我正在寻找重命名 spacy 的 pos 标签标签。 例如。如果我有这个代码:

def eng(textstr):    
    nlp = spacy.load("en_core_web_sm")
    doc = nlp(textstr)
    for token in doc:
    print("Word: "+token.text+ " "+"POS: "+token.pos_)

我希望 token.pos_ 给我 NIA 而不是 NOUN,BO 而不是 VERB,等等...如果可以的话,我不想重新训练任何东西。 pos 标注器给出的结果对我来说足够准确,我只想重命名每个标签(名词为 NIA,动词为 BO,等等)。因此,我不想使用名词,而是希望 token.pos_ 还给我 NIA。首先这是可能的,如果是的话,我该怎么做? 我首先想到的是简单地使用 if 语句:

if token.pos_ == "NOUN"
  print("Word: "+token.text+ " "+"POS: NIA")

但这无法完成,因为我必须更改大约 5000 个函数,这是不可能的。还有别的办法吗?非常感谢您的帮助!

这是不可能的。 .pos 属性专门只包含 Universal Dependency 标签,如果您尝试设置其他值,将会报错。如果需要,您可以在 .tag 属性中设置任何值,尽管它是为特定于语言的细粒度标签设计的,比 UD 标签具有更多细节。

我不太确定你为什么要这样做而不是习惯于真正的标签,我怀疑试图改变它会给你带来很多麻烦而收效甚微,比如重新定义关键字一种编程语言。

也就是说,最简单的方法可能是定义一个 custom token extension,将其命名为 my_pos,它将真正的标签转换为您的标签。看起来有点像这样:

POS_MAP = {"NOUN": "NIA", "VERB": "BO", ...}

def my_pos_getter(token):
    return POS_MAP[token.pos_]

Token.set_extension("my_pos", getter=my_pos_getter)

doc = nlp("I have a pen")
assert doc[3]._.my_pos == "NIA"