现在我要报告命名实体识别的结果。我发现有点令人困惑的一件事是,我对精确度和召回率的理解是简单地总结了所有类别的真阳性、真阴性、假阳性和假阴性。
但是现在这似乎不可信,因为我认为每个错误分类都会同时产生一个假阳性和一个假阴性(例如,一个应该被标记为“A”但被标记为“B”的标记对于“A”和“B”的误报)。因此,所有类别的误报和误报的数量将是相同的,这意味着精度(总是!)等于召回率。这根本不可能是真的,所以我的推理有误,我想知道它在哪里。这当然是一件非常明显和直接的事情,但它现在让我无法理解。
现在我要报告命名实体识别的结果。我发现有点令人困惑的一件事是,我对精确度和召回率的理解是简单地总结了所有类别的真阳性、真阴性、假阳性和假阴性。
但是现在这似乎不可信,因为我认为每个错误分类都会同时产生一个假阳性和一个假阴性(例如,一个应该被标记为“A”但被标记为“B”的标记对于“A”和“B”的误报)。因此,所有类别的误报和误报的数量将是相同的,这意味着精度(总是!)等于召回率。这根本不可能是真的,所以我的推理有误,我想知道它在哪里。这当然是一件非常明显和直接的事情,但它现在让我无法理解。
通常计算精度和召回率的方式(这是我在论文中使用的)是衡量实体之间的相互关系。假设基本事实具有以下内容(对于它们是什么类型的实体没有任何区别)
[Microsoft Corp.] CEO [Steve Ballmer] announced the release of [Windows 7] today
这有 3 个实体。
假设您的实际提取具有以下内容
[Microsoft Corp.] [CEO] [Steve] Ballmer announced the release of Windows 7 [today]
您有一个完全匹配的Microsoft Corp
,误报CEO
和today
,一个误报Windows 7
和一个子字符串匹配Steve
我们通过首先定义匹配标准来计算精度和召回率。例如,它们是否必须完全匹配?如果它们完全重叠,是否匹配?实体类型重要吗?通常,我们希望为其中几个标准提供精确度和召回率。
完全匹配: True Positives = 1 ( Microsoft Corp.
,唯一的完全匹配),False Positives =3 ( CEO
,today
和Steve
,不是完全匹配),False Negatives = 2 (Steve Ballmer
和Windows 7
)
Precision = True Positives / (True Positives + False Positives) = 1/(1+3) = 0.25
Recall = True Positives / (True Positives + False Negatives) = 1/(1+2) = 0.33
任何重叠都可以:真阳性 = 2 ( Microsoft Corp.
,Steve
其中重叠Steve Ballmer
),假阳性 =2 ( CEO
,和today
),假阴性 = 1 ( Windows 7
)
Precision = True Positives / (True Positives + False Positives) = 2/(2+2) = 0.55
Recall = True Positives / (True Positives + False Negatives) = 2/(2+1) = 0.66
然后让读者推断“真实性能”(当允许使用人类判断来决定哪些重叠差异显着,哪些不显着时,无偏见的人工检查器将给出的精度和召回率)介于两者之间。
报告F1度量通常也很有用,它是准确率和召回率的调和平均值,当您必须权衡准确率和召回率时,它给出了一些“性能”的概念。
在CoNLL-2003 NER 任务中,评估基于正确标记的实体,而不是标记,如论文“CoNLL-2003 共享任务简介:与语言无关的命名实体识别”中所述。如果系统在文档中识别出具有正确起点和终点的正确类型的实体,则该实体被正确标记。我更喜欢这种评估方法,因为它更接近实际任务的性能度量;NER 系统的用户关心实体,而不是单个令牌。
但是,您描述的问题仍然存在。如果您将 ORG 类型的实体标记为 LOC 类型,则会导致 LOC 误报和 ORG 误报。在这篇博文中有一个关于这个问题的有趣讨论。
如前所述,有不同的方法来衡量 NER 的性能。可以分别评估实体在文本中的位置以及它们的类别(人、位置、组织等)的检测精度。或者将这两个方面结合在一个度量中。
您会在以下论文中找到一篇不错的评论:D. Nadeau,Semi-Supervised Named Entity Recognition:Learning to Recognize 100 Entity Types with Little Supervision (2007)。请看第2.6 节。NER的评估。
这个问题没有简单的正确答案。有多种不同的方法来计算错误。MUC比赛使用了一个,其他人使用了其他。
但是,为了帮助您立即解决困惑:
你有一组标签,不是吗?诸如 NONE、PERSON、ANIMAL、VEGETABLE 之类的东西?
如果令牌应该是人,而您将其标记为 NONE,那么这对于 NONE 来说是误报,对于 PERSON 来说是误报。如果一个令牌应该是 NONE 并且您将其标记为 PERSON,则相反。
因此,您可以获得每种实体类型的分数。
您还可以汇总这些分数。
为了清楚起见,这些是定义:
精度 = TP/(TP+FP) = 你发现的那部分是基本事实?
召回率 = TP/(TP+FN) = 你恢复了哪一部分基本事实?
不一定总是相等的,因为假阴性的数量不一定等于假阳性的数量。
如果我正确理解您的问题,则您将每个令牌分配给两个以上可能的标签之一。为了使准确率和召回率有意义,您需要有一个二元分类器。因此,如果您将分类器表述为标记是否在“A”组中,则可以使用精度和召回率,然后对每个组重复。在这种情况下,错过的分类将被计算为一组的假阴性和另一组的假阳性。
如果您正在进行这样的分类,其中它不是二进制的(将每个标记分配给一个组),那么查看标记对可能会很有用。将您的问题表述为“标记 X 和 Y 在同一个分类组中吗?”。这使您可以计算所有节点对的精度和召回率。如果您的分类组被标记或具有相关含义,则这不合适。例如,如果您的分类组是“水果”和“蔬菜”,并且您将“苹果”和“橙子”都分类为“蔬菜”,那么即使分配了错误的组,该算法也会将其评分为真阳性。但是如果你的组没有标签,例如“A”和“B”,那么如果苹果和橙子都被归类为“A”,
如果您正在训练一个 spacy ner 模型,那么他们的 scorer.py API 可以为您提供精确度、召回率和召回率。
代码和输出将采用以下格式:-
17
对于那些在以下链接中有相同问题的人:
spaCy/scorer.py '''蟒蛇
import spacy
from spacy.gold import GoldParse
from spacy.scorer import Scorer
def evaluate(ner_model, examples):
scorer = Scorer()
for input_, annot in examples:
doc_gold_text = ner_model.make_doc(input_)
gold = GoldParse(doc_gold_text, entities=annot)
pred_value = ner_model(input_)
scorer.score(pred_value, gold)
return scorer.scores
examples = [
('Who is Shaka Khan?',
[(7, 17, 'PERSON')]),
('I like London and Berlin.',
[(7, 13, 'LOC'), (18, 24, 'LOC')])
]
ner_model = spacy.load(ner_model_path) # for spaCy's pretrained use 'en_core_web_sm'
results = evaluate(ner_model, examples)
'''
Output will be in format like:-
{'uas': 0.0, 'las': 0.0, **'ents_p'**: 43.75, **'ents_r'**: 35.59322033898305, **'ents_f'**: 39.252336448598136, 'tags_acc': 0.0, 'token_acc': 100.0}**strong text**