如何在spaCy v3中正确使用自定义NER的transformer模型?

2024-05-12 16:28:58 发布

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

我正在尝试使用spaCy版本3为自定义标记训练命名实体识别(NER)模型。我浏览了他们网站上的所有文档,但我不明白创建管道模型的正确方法是什么。显然,如果我尝试使用en_core_web_trf,我无法添加自己的标记,因为最终的输出分数都是零。但是它对en_core_web_sm是正确的

但是,如果我尝试做一些临时的方法,创建一个英文的空白模型,然后从en_core_web_trf手动添加transformer模型,并从en_core_web_sm分别添加ner模型,那么它是有效的

我的问题是-除了这个临时方法之外,还有更好的方法来初始化我的模型和管道方法吗?我不关心像位置等预先训练过的实体。我只想根据我在数据集中定义的自定义实体训练我的模型(使用基于转换器的方法)

def load_spacy():
    spacy.require_gpu()

    # 1) 'Makeshift' method
    source_nlp = spacy.load("en_core_web_sm")
    source_nlp_trf = spacy.load("en_core_web_trf")
    nlp = spacy.blank("en")
    nlp.add_pipe("transformer", source=source_nlp_trf)
    nlp.add_pipe("ner", source=source_nlp)
    
    # 2) trf only method
    nlp = spacy.load("en_core_web_trf")
    
    # Getting the pipeline component
    ner = nlp.get_pipe("ner")
    return ner, nlp

编辑:我使用的确切培训方法已在定义类NerModelfit()函数中的thispython脚本中描述

脚本(第16行)中的load_spacy()使用了小模型,但我正在试验transformer模型,并使用了我在本问题开始时定义的load_spacy()的定义

PS:为了将GPU用于transformer,我一直在Google Colab(又名笔记本)上进行实验,但是源代码和方法几乎是一样的


Tags: 方法core模型实体websourcenlp定义