Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nlp 命名实体识别中的计算精度和召回率_Nlp_Precision Recall - Fatal编程技术网

Nlp 命名实体识别中的计算精度和召回率

Nlp 命名实体识别中的计算精度和召回率,nlp,precision-recall,Nlp,Precision Recall,现在我将报告命名实体识别的结果。我发现有一点让人困惑的是,我对精确性和回忆性的理解是,一个人简单地总结了所有类别的真阳性、真阴性、假阳性和假阴性 但现在我认为这似乎是不可信的,因为每次错误分类都会同时产生一个假阳性和一个假阴性(例如,本应标记为“a”但标记为“B”的标记是“a”的假阴性和“B”的假阳性)。因此,所有类别的误报和漏报的数量都是相同的,这意味着精确度(总是!)等于召回率。这根本不可能是真的,所以我的推理有一个错误,我想知道它在哪里。这当然是非常明显和直截了当的事情,但我现在想不起来了

现在我将报告命名实体识别的结果。我发现有一点让人困惑的是,我对精确性和回忆性的理解是,一个人简单地总结了所有类别的真阳性、真阴性、假阳性和假阴性


但现在我认为这似乎是不可信的,因为每次错误分类都会同时产生一个假阳性和一个假阴性(例如,本应标记为“a”但标记为“B”的标记是“a”的假阴性和“B”的假阳性)。因此,所有类别的误报和漏报的数量都是相同的,这意味着精确度(总是!)等于召回率。这根本不可能是真的,所以我的推理有一个错误,我想知道它在哪里。这当然是非常明显和直截了当的事情,但我现在想不起来了。

这个问题没有简单正确的答案。计算错误的方法有很多种。MUC比赛使用了一个,其他人使用了其他人

但是,为了帮助您解决眼前的困惑:

你有一套标签,不是吗?什么都没有,人,动物,蔬菜

如果一个标记应该是person,并且您将其标记为NONE,那么NONE为假阳性,person为假阴性。如果一个令牌应该是NONE,而您将其标记为PERSON,则相反

因此,您可以获得每个实体类型的分数


您还可以汇总这些分数。

为了清楚起见,以下是定义:

精度=TP/(TP+FP)=你发现的部分是基本事实

回忆=TP/(TP+FN)=你恢复了哪部分基本真相

由于误报的数量不一定等于误报的数量,所以错误的数量不一定总是相等的

如果我正确理解您的问题,您将每个令牌分配给两个以上可能标签中的一个。为了让精确性和召回率有意义,你需要有一个。因此,如果将分类器表述为标记是否在组“a”中,然后对每个组重复,则可以使用精度和召回率。在这种情况下,漏诊分类将被视为一组假阴性和另一组假阳性的两倍

如果您正在进行这样一个非二进制的分类(将每个令牌分配给一个组),那么查看令牌对可能会很有用。将您的问题表述为“令牌X和Y是否在同一分类组中?”。这允许您计算所有节点对的精度和召回率。如果您的分类组已标记或具有关联的含义,则这并不合适。例如,如果您的分类组是“水果”和“蔬菜”,并且您将“苹果”和“橙子”都分类为“蔬菜”,那么即使分配了错误的组,该算法也会将其评分为真正。但是,如果你的组没有标记,例如“A”和“B”,那么如果苹果和橙子都被归类为“A”,那么你可以说“A”对应于“水果”

在中,评估基于正确标记的实体,而不是本文中描述的标记。如果系统在文档中标识具有正确起点和终点的正确类型的实体,则该实体被正确标记。我更喜欢这种评估方法,因为它更接近于衡量实际任务的绩效;NER系统的用户关心的是实体,而不是单个令牌


但是,您描述的问题仍然存在。如果您用LOC类型标记一个ORG类型的实体,则LOC为假阳性,ORG为假阴性。关于这个问题有一个有趣的讨论。

精确性和召回率的计算方法(这是我在论文中使用的方法)是测量实体之间的相互关系。假设基本事实具有以下特征(不区分它们是什么类型的实体)

[Microsoft Corp.]首席执行官史蒂夫·鲍尔默(Steve Ballmer)今天宣布发布[Windows 7]

这有3个实体

假设您的实际提取具有以下内容

[Microsoft Corp.][CEO][Steve]Ballmer[今天]宣布发布Windows 7

您与Microsoft Corp完全匹配,
CEO
和今天的
出现误报,
Windows 7
出现误报,
Steve的子字符串匹配

我们通过首先定义匹配标准来计算精度和召回率。例如,它们必须精确匹配吗?如果它们完全重叠,这是一场比赛吗?实体类型重要吗?通常,我们希望为其中几个标准提供精确性和召回率

精确匹配:真阳性=1(
Microsoft Corp.
,唯一的精确匹配),假阳性=3(
CEO
today
Steve
,这不是精确匹配),假阴性=2(
Steve Ballmer
Windows 7

任何重叠确定:真阳性=2(
Microsoft Corp.
,和与
Steve Ballmer
重叠的
Steve
),假阳性=2(
CEO
,和
today
),假阴性=1(
Windows 7

然后,让读者推断“真实性能”(当允许使用人类判断来决定哪些重叠差异显著,哪些不显著时,无偏见的人类检查人员将给出的精度和回忆)介于两者之间


报告F1度量值也很有用,它是精确性和召回率的调和平均值,当你不得不在精确性和召回率之间进行权衡时,它给出了一些“性能”的概念。

如前所述,有不同的方法来衡量NER性能。是阿宝
Precision = True Positives / (True Positives + False Positives) = 1/(1+3) = 0.25
Recall = True Positives / (True Positives + False Negatives) = 1/(1+2) = 0.33
Precision = True Positives / (True Positives + False Positives) = 2/(2+2) = 0.55
Recall = True Positives / (True Positives + False Negatives) = 2/(2+1) = 0.66
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