使用自定义数据集训练 SpaCy NER

Posted

技术标签:

【中文标题】使用自定义数据集训练 SpaCy NER【英文标题】:Training SpaCy NER with a custom dataset 【发布时间】:2020-10-16 11:57:48 【问题描述】:

我已按照 this SpaCy 教程训练自定义数据集。我的数据集是一个地名词典。因此,我将我的训练数据制作如下。

TRAIN_DATA = [
("Where is Abbess","entities":[(9, 15,"GPE")]),
("Where is Abbey Pass","entities":[(9, 19,"LOC")]),
("Where is Abbot","entities":[(9, 14,"GPE")]),
("Where is Abners Head","entities":[(9, 29,"LOC")]),
("Where is Acheron Flat","entities":[(9, 21,"LOC")]),
("Where is Acheron River","entities":[(9, 22,"LOC")])
]

我使用'en_core_web_sm' 进行训练,而不是空白模型。

model = 'en_core_web_sm'
output_dir=Path(path)
n_iter=20

在训练了 20 个 epoc 之后,我尝试使用训练后的模型进行预测。以下是我得到的输出。

test_text = "Seven people, including teenagers, have been taken to hospital after their car crashed in the mid-Canterbury town of Rakaia."

Seven people, including teenagers 0 33 GPE
the mid-Canterbury town of Rakaia.. 90 125 GPE

我使用'en_core_web_sm' 对相同的 test_text 进行了预测。输出如下。

Seven 0 5 CARDINAL
mid-Canterbury 94 108 DATE
Rakaia 117 123 GPE

有人可以指导我在训练 SpaCy 时犯的错误吗?

【问题讨论】:

【参考方案1】:

结果不佳的原因是由于一个名为catastrophic forgetting 的概念。您可以here获取更多信息。

tl;dr

当您使用新实体训练您的 en_core_web_sm 模型时,它会忘记之前学习的内容。

为了确保不忘记旧的学习,您还需要在再训练期间提供其他类型实体的模型示例。通过这样做,您将确保模型不会自我调整和扭曲自身以预测所有内容作为正在训练的新实体。

您可以阅读有关可以实施的可能解决方案here

【讨论】:

以上是关于使用自定义数据集训练 SpaCy NER的主要内容,如果未能解决你的问题,请参考以下文章

为 SpaCy NER 格式化训练数据集

spaCy 2.0:保存并加载自定义NER模型

使用大于 RAM 的数据集训练 Spacy 模型

为什么spacy遗忘了旧的训练数据以及如何解决

每次迭代后保存spacy的NER模型

将自定义 NER 模型添加到 spaCy 管道