这是一个简单的代码,可以从教程文档中(或多或少)获取。使用以下训练代码训练NER模型后,便在for循环内使用nlp(sentence).ents
来获取命名实体。如您所见,我使用了一个空白模型spacy.blank('en')
,这是因为我要添加新实体。但是没有从测试集中检测到任何实体。
import spacy
import random
from spacy.util import compounding
from spacy.util import minibatch
def get_batches(train_data, model_type):
max_batch_sizes = {'tagger': 32, 'parser': 16, 'ner': 16, 'textcat': 64}
max_batch_size = max_batch_sizes[model_type]
if len(train_data) < 1000:
max_batch_size /= 2
if len(train_data) < 500:
max_batch_size /= 2
batch_size = compounding(1, max_batch_size, 1.001)
batches = minibatch(train_data, size=batch_size)
return batches
nlp = spacy.blank('en')
nlp.vocab.vectors.name = 'blank_vector'
optimizer = nlp.begin_training()
for i in range(20):
random.shuffle(TRAIN_DATA)
batches = get_batches(TRAIN_DATA, 'ner')
for batch in batches:
texts, annotations = zip(*batch)
nlp.update(texts, annotations, drop=0.5, sgd=optimizer)
# for text, annotations in TRAIN_DATA:
# nlp.update([text], [annotations], drop=0.5, sgd=optimizer)
nlp.to_disk('model')
如何分析以spacy创建的模型? 我确实尝试通过查看由{{1} model
。但不幸的是,我不知道如何添加所需的必要信息。
我的要求:考虑百分比,例如[20%,0.5%等]和美元金额,例如[$ 100、100美元等],这些发生的金额将作为 MONEY,PERCENT ,但我需要它们根据使用情况来检测实体,例如['HOME_LOAN_INTEREST_RATE','CAR_LOAN_INTEREST_RATE'等]。现在我的问题仍然可能是因为词汇表中没有所有美元。如果是这种情况,我该如何解决此问题。
在此方面的任何帮助将不胜感激。
答案 0 :(得分:0)
+-----------+-----------+
| result(1)| result(2)|
+-----------+-----------+
|20 ,22 | 51,53 |
+-----------+-----------+
函数具有一个update
参数,该参数可用于找出每次迭代中模型的损失。
此外,我的NER模型找不到我在数据集中的标签的原因是(可能)根本没有执行NER操作,因为我没有在创建的模型中找到ner文件夹。为了解决这个问题,我们必须创建一个叫做管道的东西。
losses
我确信其他人可以更好地解释分析模型性能的方法,但这就是我为解决问题所做的事情。
if "ner" not in nlp.pipe_names:
ner = nlp.create_pipe("ner")
nlp.add_pipe(ner, last=True)
# otherwise, get it so we can add labels
else:
ner = nlp.get_pipe("ner")
# add labels
for _, annotations in TRAIN_DATA:
for ent in annotations.get("entities"):
ner.add_label(ent[2])
# get names of other pipes to disable them during training
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != "ner"]
将继续阅读文档,以了解有关优化器和损失函数的信息。但是请随时添加其他答案/对其进行编辑以提供更好的解释。