Spacy3.0 上的自定义 NER - ValueError

问题描述

我正在尝试训练 Spacy3.0 来识别新的命名实体。我完全按照本文中的说明进行操作:https://towardsdatascience.com/using-spacy-3-0-to-build-a-custom-ner-model-c9256bea098

for text,annot in tqdm(TRAIN_DATA): # data in prevIoUs format
    doc = nlp.make_doc(text) # create doc object from text
    ents = []
    
    for i in annot["entities"]:
        start = i[0]
        end = i[1]
        label = i[2]
 
        span = doc.char_span(start,end,label=label,alignment_mode="contract")
        ents.append(span)
    doc.ents = ents
    db.add(doc)
db.to_disk(r"train.spacy") # save the docbin object

一切正常,直到我在“ents”中添加几个 ner。

例如:-爸爸买苹果-工作正常。但是-爸爸买苹果和三星-不起作用。

出现错误: “中止并保存最终的最佳模型。遇到异常:ValueError()” 文件“spacy\pipeline_parser_internals\ner.pyx”,第 310 行,在 spacy.pipeline._parser_internals.ner.BiluoPushDown.set_costs 值错误

也许应该在 config.cfg 中更改某些内容,但我找不到。

解决方法

您提到了 config.cfg,但我没有看到您的代码中使用了它。您如何定义您的 nlp 模型和 TRAIN_DATA

从 spaCy v3 开始,建议使用 CLI 命令 spacy train 而不是实现自定义训练循环,这可能会更脆弱。这里有更详细的迁移指南:https://spacy.io/usage/v3#migrating

看看您得到的错误,似乎模型遇到了未在训练数据集中定义的命名实体类型?

不过我不确定,因为我无法确切了解正在发生的事情,而且我不知道您所说的“直到我在 'ents' 中添加几个 ner”是什么意思。你能提供一个最小的可重现代码片段吗?这将有助于您进行调试。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...