Как оценить обученную модель spaCy версии 3?

avatar
Malte
1 июля 2021 в 15:44
1078
2
3

Я хочу оценить свою обученную модель spaCy с помощью встроенной функции Scorer с помощью этого кода:

def evaluate(ner_model, examples):
    scorer = Scorer()
    for input_, annot in examples:
        text = nlp.make_doc(input_)
        gold = Example.from_dict(text, annot)
        pred_value = ner_model(input_)
        scorer.score(gold)
    return scorer.scores

examples = [('Brief discussion about instument replcement and Product ...confirmation', {'entities': [(48, 55, 'PRODUCT')]})('Met with special chem lead. Did not yet move assays from immulite to produc. Follow up with PhD tomorrow.', {'entities': [(57, 68, 'PRODUCT'), (45, 51, 'DATE'), (97, 105, 'DATE')]}), ('Discuss new products for ...', {'entities': [(36, 51, 'PRODUCT')]})]

ner_model = spacy.load(r'D:\temp\model') # for spaCy's pretrained use 'en_core_web_sm'
results = evaluate(ner_model, examples)

При запуске функции я получаю следующее сообщение об ошибке:

TypeError: [E978] Метод Tokenizer.score принимает список объектов Example, но получил: <class 'spacy.training.example.Example'>

Я уже пытался вводить аннотации типа {"entities": annot} и некоторые другие их версии. Я проверил Google, но каждая статья, кажется, связана с версией 2.xx spaCy.

Что я делаю не так? Как я могу рассчитать полноту, точность и оценку F1 с помощью spacy Score()?

Источник

Ответы (2)

avatar
Malte
2 июля 2021 в 19:15
2

Метод scores по-прежнему поддерживается в spaCy 3.0 (https://spacy.io/api/scorer), и я, наконец, заставил его работать со следующим кодом:

nlp = spacy.load(path_to_model)
examples = []
scorer = Scorer()
for text, annotations in TEST_REVISION_DATA:
    doc = nlp.make_doc(text)
    example = Example.from_dict(doc, annotations)
    example.predicted = nlp(str(example.predicted))
    examples.append(example)
scorer.score(examples)

Я не нашел инструмент командной строки простым в применении (мне было трудно загрузить тестовые данные), и для моих нужд кодовая версия также намного удобнее. Таким образом, я могу легко преобразовать результаты в визуальные эффекты.

avatar
polm23
2 июля 2021 в 05:06
1

Вы должны использовать режим командной строки оценить.

spacy evaluate my-model/ test.spacy

Где test.spacy — ваши тестовые данные.

Кроме того, об этой ошибке:

TypeError: [E978] The Tokenizer.score method takes a list of Example objects, but got: <class 'spacy.training.example.Example'>

Как указывает эта ошибка, вы должны передать список примеров, но вы передали только один пример. Вы должны использовать scorer.score([gold]), в основном.