我正在尝试评估NER(命名实体识别)的人工智能模型。
为了与其他基准进行比较,我需要计算模型的F1得分。但是,我不确定如何编写代码。
我的想法是:
正值:相等的令牌和相等的标记,标记为正值
假阴性:相等的标记和不相等的标记或标记未出现在预测中,标记的假阴性
假阳性:令牌不存在,但已分配给标签,例如:
短语:“这是一个测试”
预计:{token:这是标签:WHO}
真实对:{token:这个,标记:WHO}} {token:一个测试,标记:什么} 在这种情况下,{token:这是标签:WHO}被认为是WHO的假阳性。
代码:
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);
但是,我认为我在某些概念上是错误的。有人有意见吗?
答案 0 :(得分:0)
因为我是新来的,所以我给出一个答案,我只能发表评论。这不是一个完整的答案。 在这里看看: http://www.davidsbatista.net/blog/2018/05/09/Named_Entity_Evaluation/ 我们可以看到,有很多可能的方法可以为NER定义F1分数。至少考虑6种可能的情况,即TP,TN,FN和FP的一部分,因为标签可以对应多个令牌,因此我们可以考虑部分匹配。 如果您看一下,可以使用不同的方法来定义F1得分,例如,其中一些方法可以定义TP,例如严格正值和部分正值的加权平均值。 CoNLL是NER最着名的基准之一,看起来他们对召回和命中使用严格的定义,足以定义F1分数:
“ precision是由学习系统找到的正确的命名实体的百分比。召回率是系统找到的语料库中存在的命名实体的百分比。只有在完全匹配的情况下,命名实体才是正确的文件中相应实体的名称。”