我目前正在实现一个自定义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之外,也没有支持这种功能的机制。
您无法通过使用自定义训练循环来解决这个问题。
您的选择是使用基于规则的匹配,这样您只能匹配列表中明确列出的项目,或者在使用过程中重新训练模型。
基于规则的匹配设置起来应该很容易,但显然的问题是它无法学习列表中未明确列出的内容。
在使用过程中训练模型听起来可能需要很长时间,但您可以很快地训练一个小型模型。您可以做的是在用户互动工作时,以少量迭代训练一个小型模型,待用户确认模型基本正常工作后,再使用相同的数据训练一个更大、训练时间更长的模型。