我想单独使用自定义知识库来运行实体链接作业,而不是使用需要训练数据集/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 智能。
这里发生的是这条线
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
希望能为您解决问题!