spacy 3 NER Scorer() 抛出 TypeError: score() 需要 2 个位置参数,但给出了 3 个

问题描述

尝试使用 scorer

在我的测试集上获取分数时遇到以下错误

TypeError: score() 需要 2 个位置参数,但给出了 3 个

import spacy 
from spacy.tokens import Span
from spacy import displacy
from spacy.training import *
from spacy.scorer import scorer
from spacy.util import minibatch,compounding

def evaluate(ner_model,testing_data):
    scorer = scorer()

    for input_,annot in testing_data:
        doc_gold_text = ner_model.make_doc(input_)
        example = Example.from_dict(doc_gold_text,{"entities": annot})
        pred_value = ner_model(input_)
        
    return scorer.score(pred_value,example)

print(evaluate(nlp_updated,testing_tagged))

其中 testing_tagged:

testing_tagged = [
    ("Who was Hamlet?",[(8,14,'PERSON')]),("Have you ever met Rome?",[(18,22,'LOC')])
]

预期输出prf 不为 0:

{'uas': 0.0,'las': 0.0,'las_per_type': {'': {'p': 0.0,'r': 0.0,'f': 0.0}},'ents_p': 0.0,'ents_r': 0.0,'ents_f': 0.0,'ents_per_type': {'PERSON': {'p': 0.0,'f': 0.0},'LOC': {'p': 0.0,'tags_acc': 0.0,'token_acc': 100.0,'textcat_score': 0.0,'textcats_per_cat': {}}

我最初使用 GoldParse 函数而不是 Example.from_dict 进行此操作 - 但我升级到了 Spacy 3.0.5,我不明白为什么会发生此错误

解决方法

从 spaCy v3 开始,scorer.score 只需要一个示例列表。每个 Example 对象包含两个 Doc 对象:

  • 一个带有黄金标准注释的 reference 文档,为 来自给定 annot 字典的示例
  • 一个带有预测的 predicted 文档。然后记分员将比较两者。

所以你想要这样的东西:

from spacy.training import Example
examples = []
for ...:
    example = Example.from_dict(text,{"entities": annot})
    example.predicted = ner_model(example.predicted)
    examples.append(example)
scorer.score(examples)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...