【发布时间】:2021-06-22 12:21:42
【问题描述】:
我目前正在实现一个自定义 NER 模型接口,用户可以在其中与前端应用程序交互以添加自定义实体来训练一个 spacy 模型。
我想使用 spacy train (CLI) 获取现有模型(自定义 NER 模型)并将用户指定的关键字和实体添加到该模型。 (而不是再次训练整个模型)。我在文档中的任何地方都找不到这个。
例如,假设我有一个模型已经针对 FOOD 的自定义实体进行了训练。 (比萨、意大利面、面包等……)。现在我想使用这个现有的模型,并使用可口可乐、百事可乐、果汁等关键字来训练一个名为 DRINKS 的新实体……使用 spacy train 命令进行 spacy v3.0。
我目前使用的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")
【问题讨论】:
标签: python machine-learning nlp spacy named-entity-recognition