测量NER的F1分数



我正在尝试评估NER(命名实体识别(的人工智能模型
为了与其他基准进行比较,我需要计算模型的F1分数。然而,我不确定如何对此进行编码。

我的想法是:
真阳性:相等的令牌和相等的标签,标签的真阳性
假阴性;相等的令牌、不相等的标签或令牌没有出现在预测中,标签的假阴性
假阳性:令牌不存在,但已分配给标签,例如:

短语:"这是一个测试">
预测:{token:这是,标签:世界卫生组织}
真对:{token:这,标签:世界卫生组织}{token:一个测试,标签:什么}
在这种情况下,{tokent:这就是,标签:世界卫生组织}被视为世界卫生组织的假阳性。

代码:

for val predicted tokens (pseudo-code) {   
// val = struct { tokens, tags } from a phrase
for (auto const &j : val.tags) {
if (j.first == current_tokens) {
if (j.second == tag) {
true_positives[tag_id]++;
} else {
false_negatives[tag_id]++;
}
current_token_exists = true;
}

}
if (!current_token_exists) {
false_positives[tag_id]++;
}
}
for (auto const &i : val.tags) {
bool find = 0;
for (auto const &j : listed_tokens) {
if (i.first == j) {find = 1; break;}
}
if (!find) {
false_negatives[str2tag_id[i.second]]++;
}
}

之后,计算F-1:

float precision_total, recall_total, f_1_total;
precision_total = total_true_positives / (total_true_positives + total_false_positives);
recall_total = total_true_positives / (total_true_positives + total_false_negatives);
f_1_total = (2 * precision_total * recall_total) / (precision_total + recall_total);

然而,我认为我在某些概念上是错误的。有人有意见吗?

这不是一个完整的答案。看看这里我们可以看到有许多可能的方法来定义NER的F1分数。至少有6种可能的情况,TP、TN、FN和FP的一部分,因为标签可以对应于多个令牌,因此我们可以考虑部分匹配。如果你看看有不同的方法来定义F1分数,其中一些方法定义TP,比如严格正和部分正的加权平均值。CoNLL是NER最著名的基准之一,看起来他们对召回和准确性使用了严格的定义,这足以定义F1分数:

精度是通过学习找到的命名实体的百分比正确的系统。Recall是命名实体的百分比存在于系统所找到的语料库中。命名实体是只有当它与中的相应实体完全匹配时才正确数据文件。

最新更新