将自定义 KB 附加到 Spacy“entity_linker”管道会使 NER 调用非常糟糕

问题描述 投票:0回答:1

我想单独使用自定义知识库来运行实体链接作业,而不是使用需要训练数据集/Spacy 语料库的第二步 ML 重新排序器。我希望 NEL 管道仅根据知识库驱动的 get_candidates() 并使用我的 KB 对象中的prior_probability 分配 kb_ids。然而,我注意到,一旦我附加了自定义 KB,

doc.ents
调用就超级愚蠢,就像它被
entity_linker
管道切除了一样。
entity_linker
管道是否会修改该管道(位于它之前)调用的跨度?

这是我使用预训练的“en_core_web_lg”模型时的 doc.ents 调用:

nlp = spacy.load("en_core_web_lg")
doc = nlp("The NY Times is my favorite newspaper.")
doc.ents
(The NY Times,)

当我通过 nlp 对象运行相同的示例并将我的自定义 KB 附加到下游 NEL 管道时,我得到以下结果:

entity_linker = nlp.add_pipe("entity_linker")
def create_kb(vocab):
    kb = DefaultKB(vocab=vocab, entity_vector_length=300)
    kb.from_disk(f"assets/en/kb")
    return kb

entity_linker.set_kb(create_kb)
nlp.initialize()
doc = nlp("The NY Times is my favorite newspaper.")
print([(ent.text, ent.label_) for ent in doc.ents])  # Output of the NER
print([(ent.text, ent.kb_id_) for ent in doc.ents if ent.kb_id_])  # Output of the entity linker

[('The', 'ORG'), ('Times', 'ORG'), ('is', 'ORG'), ('my', 'ORG'), ('favorite', 'ORG'), ('newspaper', 'ORG'), ('.', 'ORG')]
[('The', 'Q3048768'), ('Times', 'Q11259'), ('is', 'NIL'), ('my', 'NIL'), ('favorite', 'NIL'), ('newspaper', 'NIL'), ('.', 'NIL')]

因此,在我附加自定义知识库对象后,NER 管道肯定会调用不同的 NER 跨度。请指导我了解这个管道,以及我是否可以立即将我的 KB 对象附加到智能,而不会弄乱预训练模型的 NER 智能。

spacy named-entity-recognition entity-linking knowledge-base-population
1个回答
0
投票

这里发生的是这条线

nlp.initialize()

实际上重新初始化管道中所有训练过的组件:它将所有权重设置回随机初始化,正如您从NER结果中看到的那样,有效地产生垃圾。

但是,您确实需要初始化新的

entity_linker
组件。您可以直接在组件上调用它:

entity_linker.initialize(...)

后者需要额外的

get_examples
参数(https://spacy.io/api/entitylinker#initialize),这可能会有点麻烦。或者,您可以在调用
nlp
对象时禁用应在上下文管理器中保留原样的管道:

with nlp.select_pipes(disable="ner"):
    nlp.initialize()

您可以在使用文档中阅读有关此机制的更多信息:https://spacy.io/usage/training#initialization。在 API 文档中:https://spacy.io/api/language#initialize

顺便说一句 - 当您使用 spaCy v3 中的配置系统并正确设置“冻结”组件时,所有这一切都应该“自动”发生,参见。 https://spacy.io/usage/training#section-config-custom

你会得到这样的东西:

[nlp]
lang = "en"
pipeline = ["ner","entity_linker"]

[components.ner]
source = "en_core_web_lg"
component = "ner"

[components.entity_linker]
factory = "entity_linker"

[training]
frozen_components = ["ner"]
...

对于配置路线,您可以从这个示例项目中获取灵感:https://github.com/explosion/projects/tree/v3/benchmarks/nel

希望能为您解决问题!

© www.soinside.com 2019 - 2024. All rights reserved.