在spaCy中合并自定义名词块(使用retokenize)时,如何平均向量?

2024-05-20 02:31:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

对于其他下游任务,我正在重新整理这些名词块(span),这在大多数情况下都很好。但是,令牌的向量表示(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_Non_chunks组件(刚刚修改为包含我自己的自定义名词块)上对此进行了建模(上面的代码),因此我可以确认内置组件给出了相同的结果

有没有办法保存单词矢量信息?我是否需要将术语/平均向量添加到向量存储中


Tags: 信息docreturniftagrootall向量
1条回答
网友
1楼 · 发布于 2024-05-20 02:31:53

retokenizer应该将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的属性,因此如果要覆盖默认值,只需指定它们

相关问题 更多 >