在spaCy中合并(重新标记)自定义名词块时如何平均向量?

How to average the vector when merging (with retokenize) custom noun chunks in spaCy?

我正在使用 spaCy 的统计模型(例如,基于词性标签和依赖项的名词块)和基于规则的匹配来生成名词块以捕获(用户提供的)上下文特定的名词块。

对于其他下游任务,我正在重新标记这些名词块 (spans),这在大多数情况下都可以正常工作。但是,令牌的向量表示 (token.vector) 被设置为全零。有没有办法保留矢量信息,例如通过对单个标记向量进行平均并将其分配给重新标记化的标记?

我用代码试过了...

def tokenise_noun_chunks(doc)
    if not doc.has_annotation("DEP"):
        return doc

    all_noun_chunks = list(doc.noun_chunks) + doc._.custom_noun_chunks

    with doc.retokenize() as retokenizer:
        for span in all_noun_chunks:
            # if I print(span.vector) here, I get the correctly averaged vector
            attrs = {"tag": span.root.tag, "dep": span.root.dep}
            retokenizer.merge(np, attrs=attrs)
        return doc

...但是当我检查名词块的返回向量时,我得到一个零数组。我已经在内置 merge_noun_chunks 组件(只是修改为包含我自己的自定义名词块)上对此(上面的代码)进行了建模,因此我可以确认内置组件给出了相同的结果。

有没有办法保留词向量信息?我需要将 term/average 矢量添加到矢量存储吗?

重新标记器应将 span.vector 设置为新合并标记的向量。 spacy==3.0.3en_core_web_md==3.0.0:

import spacy
nlp = spacy.load("en_core_web_md")
doc = nlp("This is a sentence.")
with doc.retokenize() as retokenizer:
    for chunk in doc.noun_chunks:
        retokenizer.merge(chunk)
for token in doc:
    print(token, token.vector[:5])

输出:

This [-0.087595  0.35502   0.063868  0.29292  -0.23635 ]
is [-0.084961   0.502      0.0023823 -0.16755    0.30721  ]
a sentence [-0.093156   0.1371495 -0.307255   0.2993     0.1383735]
. [ 0.012001  0.20751  -0.12578  -0.59325   0.12525 ]

tagdep 等属性也默认设置为 span.root 的属性,因此您只需在想要覆盖默认值时指定它们。