如何分析使用Spacy训练的NER?

时间:2019-01-28 04:05:06

标签: nlp spacy named-entity-recognition ner

这是一个简单的代码,可以从教程文档中(或多或少)获取。使用以下训练代码训练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'等]。现在我的问题仍然可能是因为词汇表中没有所有美元。如果是这种情况,我该如何解决此问题。

在此方面的任何帮助将不胜感激。

1 个答案:

答案 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"]

将继续阅读文档,以了解有关优化器和损失函数的信息。但是请随时添加其他答案/对其进行编辑以提供更好的解释。