如何使用 spaCy v3 打印 NER 模型的 PRF 值?
How to print PRF values for a NER model using spaCy v3?
上下文
我目前正在为罗马尼亚法律领域开发 NER 模型。我开始使用 spaCy v2 (v2.2.4) 创建一个自定义模型,为此我成功地实现了一个代码来查找 PRF 值。现在,在我过渡到 spaCy v3 (v3.0.6) 之后,我发现很难评估我的模型的性能。
问题
我尝试执行以下操作:
- 在 spaCy v3.0.6 中使用相同的代码。就像 spaCy v2.2.4 那样(问题:GoldParser 在 spaCy v3.0.6 中不存在)
- 使用spaCy v2.2.4训练v3.0.6模型(问题:我觉得不管是哪个版本,模型保存方式都不一样)
- 使用get_ner_prf()(问题:我不明白如何创建Example类型的参数,我也不知道如何调用函数)
资源
这是我目前拥有的所有资源的列表:
- v3.0.6 模型的配置文件(以及所有其他必要的文件)
- 以旧的 spaCy 格式训练和测试数据
- 保存了罗马尼亚语的 v3.0.6 自定义模型
请求
如果收到适用于 spaCy v3.0.6 并计算 PRF 值的代码,我将不胜感激 - 最好是每种实体类型的单独结果。此外,如果代码仅使用上述资源,那就太好了。如果需要任何其他信息,我很乐意发送。
我不再寻找答案,因为我想通了。
以下链接的讨论:
https://github.com/explosion/spaCy/discussions/8178
非常有用,我能够编写以下代码(以防阅读当前讨论的任何人仍然觉得难以进行转换):
# TRAIN_DATA format
TRAIN_DATA = [
("Who was Hamlet?", [(8,14,'PER')]),
("Have you ever met Rome?", [(18,22,'LOC')])
]
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
nlp = spacy.load("./output/model-best")
# evaluate function
def evaluate(ner_model, testing_data):
scorer = Scorer()
examples = []
for input_, annot in testing_data:
doc_gold_text = ner_model.make_doc(input_)
example = Example.from_dict(doc_gold_text, {"entities": annot})
example.predicted = ner_model(input_)
examples.append(example)
return scorer.score(examples)
# print the results
print(evaluate(nlp, TRAIN_DATA))
输出格式如下:
{'token_acc': 1.0, 'token_p': 1.0, 'token_r': 1.0, 'token_f': 1.0, 'sents_p': 1.0, 'sents_r': 1.0, 'sents_f': 1.0, 'tag_acc': None, 'pos_acc': None, 'morph_acc': None, 'morph_per_feat': None, 'dep_uas': None, 'dep_las': None, 'dep_las_per_type': None, 'ents_p': 0.9833333333333333, 'ents_r': 0.9365079365079365, 'ents_f': 0.9593495934959351, 'ents_per_type': {'LAW': {'p': 1.0, 'r': 1.0, 'f': 1.0}, 'LOC': {'p': 1.0, 'r': 0.6666666666666666, 'f': 0.8}, 'ORG': {'p': 0.9565217391304348, 'r': 0.9565217391304348, 'f': 0.9565217391304348}, 'TIME': {'p': 1.0, 'r': 1.0, 'f': 1.0}, 'PER': {'p': 1.0, 'r': 1.0, 'f': 1.0}}, 'cats_score': 0.0, 'cats_score_desc': 'macro F', 'cats_micro_p': 0.0, 'cats_micro_r': 0.0, 'cats_micro_f': 0.0, 'cats_macro_p': 0.0, 'cats_macro_r': 0.0, 'cats_macro_f': 0.0, 'cats_macro_auc': 0.0, 'cats_f_per_type': {}, 'cats_auc_per_type': {}}
如果有什么不对的地方,请随时指出。
上下文
我目前正在为罗马尼亚法律领域开发 NER 模型。我开始使用 spaCy v2 (v2.2.4) 创建一个自定义模型,为此我成功地实现了一个代码来查找 PRF 值。现在,在我过渡到 spaCy v3 (v3.0.6) 之后,我发现很难评估我的模型的性能。
问题
我尝试执行以下操作:
- 在 spaCy v3.0.6 中使用相同的代码。就像 spaCy v2.2.4 那样(问题:GoldParser 在 spaCy v3.0.6 中不存在)
- 使用spaCy v2.2.4训练v3.0.6模型(问题:我觉得不管是哪个版本,模型保存方式都不一样)
- 使用get_ner_prf()(问题:我不明白如何创建Example类型的参数,我也不知道如何调用函数)
资源
这是我目前拥有的所有资源的列表:
- v3.0.6 模型的配置文件(以及所有其他必要的文件)
- 以旧的 spaCy 格式训练和测试数据
- 保存了罗马尼亚语的 v3.0.6 自定义模型
请求
如果收到适用于 spaCy v3.0.6 并计算 PRF 值的代码,我将不胜感激 - 最好是每种实体类型的单独结果。此外,如果代码仅使用上述资源,那就太好了。如果需要任何其他信息,我很乐意发送。
我不再寻找答案,因为我想通了。
以下链接的讨论:
https://github.com/explosion/spaCy/discussions/8178
非常有用,我能够编写以下代码(以防阅读当前讨论的任何人仍然觉得难以进行转换):
# TRAIN_DATA format
TRAIN_DATA = [
("Who was Hamlet?", [(8,14,'PER')]),
("Have you ever met Rome?", [(18,22,'LOC')])
]
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
nlp = spacy.load("./output/model-best")
# evaluate function
def evaluate(ner_model, testing_data):
scorer = Scorer()
examples = []
for input_, annot in testing_data:
doc_gold_text = ner_model.make_doc(input_)
example = Example.from_dict(doc_gold_text, {"entities": annot})
example.predicted = ner_model(input_)
examples.append(example)
return scorer.score(examples)
# print the results
print(evaluate(nlp, TRAIN_DATA))
输出格式如下:
{'token_acc': 1.0, 'token_p': 1.0, 'token_r': 1.0, 'token_f': 1.0, 'sents_p': 1.0, 'sents_r': 1.0, 'sents_f': 1.0, 'tag_acc': None, 'pos_acc': None, 'morph_acc': None, 'morph_per_feat': None, 'dep_uas': None, 'dep_las': None, 'dep_las_per_type': None, 'ents_p': 0.9833333333333333, 'ents_r': 0.9365079365079365, 'ents_f': 0.9593495934959351, 'ents_per_type': {'LAW': {'p': 1.0, 'r': 1.0, 'f': 1.0}, 'LOC': {'p': 1.0, 'r': 0.6666666666666666, 'f': 0.8}, 'ORG': {'p': 0.9565217391304348, 'r': 0.9565217391304348, 'f': 0.9565217391304348}, 'TIME': {'p': 1.0, 'r': 1.0, 'f': 1.0}, 'PER': {'p': 1.0, 'r': 1.0, 'f': 1.0}}, 'cats_score': 0.0, 'cats_score_desc': 'macro F', 'cats_micro_p': 0.0, 'cats_micro_r': 0.0, 'cats_micro_f': 0.0, 'cats_macro_p': 0.0, 'cats_macro_r': 0.0, 'cats_macro_f': 0.0, 'cats_macro_auc': 0.0, 'cats_f_per_type': {}, 'cats_auc_per_type': {}}
如果有什么不对的地方,请随时指出。