如何使用 spacy train 将实体添加到现有的自定义 NER 模型? (空间 v3.0)

How to use spacy train to add entities to an existing custom NER model? (Spacy v3.0)

我目前正在实现自定义 NER 模型界面,用户可以在其中与前端应用程序交互以添加自定义实体来训练 spacy 模型。

我想使用 spacy train (CLI) 获取现有模型(自定义 NER 模型)并将用户指定的关键字和实体添加到该模型。 (而不是再次训练整个模型)。我在文档中的任何地方都找不到这个。

例如,假设我有一个已经针对 FOOD 自定义实体进行训练的模型。 (披萨、意大利面、面包等)。现在我想使用这个现有的模型,并为一个名为 DRINKS 的新实体训练它,使用可口可乐、百事可乐、果汁等关键字……使用 spacy v3.0 的 spacy train 命令。

我目前使用的spacy train命令如下:

> python -m spacy train config.cfg --output ./output --paths.train ./train.spacy --paths.dev ./train.spacy

我加载预测模型使用:

> nlp1 = spacy.load(R".\output\model-best")

截至目前,我正在手动为新实体训练模型。下面是在我的训练数据中查找关键字并为训练数据输出 JSON 格式(旧格式)的代码。

import re

keyword = ["outages","updates","negative star","worst"]
entity = ["PROBLEM","PROBLEM","COMPLAINT","COMPLAINT"]

train = []

for text in df.text:

    for n in range(0,len(keyword)):
    
        start_index = []
        end_index = []

        start_index = [m.start() for m in re.finditer(keyword[n], str(text))]

        if(start_index):

            end_index = [m+len(keyword[n]) for m in start_index]

            for i in range(0,len(start_index)):

                train.append((text,{"entities": [(start_index[i],end_index[i],entity[n])]}))

train

在此之后,我使用以下代码将 json 格式转换为 .spacy 格式。

from tqdm import tqdm
from spacy.tokens import DocBin

db = DocBin() # create a DocBin object

for text, annot in tqdm(train): # data in previous format
    doc = nlp.make_doc(text) # create doc object from text
    ents = []
    for start, end, label in annot["entities"]: # add character indexes
        span = doc.char_span(start, end, label=label, alignment_mode="contract")
        if span is None:
            print("Skipping entity")
        else:
            ents.append(span)
    doc.ents = ents # label the text with the ents
    db.add(doc)

db.to_disk("./train.spacy")

I want to use spacy train (CLI) to take an existing model (custom NER model) and add the keyword and entity specified by the user, to that model. (Instead of training the whole model again). I can't find this anywhere in the documentation.

您所描述的称为“在线学习”,默认的 spaCy 模型不支持它。大多数现代神经 NER 方法,甚至在 spaCy 之外,根本不支持它。

您无法通过使用自定义训练循环来解决此问题。

您的选择是使用基于规则的匹配,这样您就只能在列表中明确匹配事物,或者即时重新训练模型。

基于规则的匹配应该很容易设置,但有一个明显的问题,即它无法学习列表中未明确显示的内容。

动态训练听起来可能会花费太长时间,但您可以很快地训练一个小模型。您可以做的是在用户交互工作时训练一个小模型进行少量迭代,并且在他们确认模型或多或少正常工作后,您可以将相同的训练数据用于训练时间更长的更大模型.