问题描述
我正在尝试训练 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”是什么意思。你能提供一个最小的可重现代码片段吗?这将有助于您进行调试。