如何使用spacy train向现有自定义NER模型添加实体?(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格式训练数据(旧格式)的代码。

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

from tqdm import tqdm
from spacy.tokens import DocBin
db = DocBin() # 创建一个DocBin对象
for text, annot in tqdm(train): # 使用之前的格式数据
    doc = nlp.make_doc(text) # 从文本创建doc对象
    ents = []
    for start, end, label in annot["entities"]: # 添加字符索引
        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 # 使用ents标记文本
    db.add(doc)
db.to_disk("./train.spacy")

回答:

我想使用spacy train(CLI)命令,将用户指定的关键词和实体添加到现有模型(自定义NER模型)中(而不是重新训练整个模型)。我在文档中找不到相关信息。

您描述的这种方法被称为“在线学习”,默认的spaCy模型不支持这种方式。大多数现代的神经NER方法,即使在spaCy之外,也没有支持这种功能的机制。

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

您的选择是使用基于规则的匹配,这样您只能匹配列表中明确列出的项目,或者在使用过程中重新训练模型。

基于规则的匹配设置起来应该很容易,但显然的问题是它无法学习列表中未明确列出的内容。

在使用过程中训练模型听起来可能需要很长时间,但您可以很快地训练一个小型模型。您可以做的是在用户互动工作时,以少量迭代训练一个小型模型,待用户确认模型基本正常工作后,再使用相同的数据训练一个更大、训练时间更长的模型。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注