我正在尝试评估一个人工智能模型的NER (命名实体识别)。
为了与其他基准进行比较,我需要计算模型的F1分数。但是,我不知道如何编写代码。
我的想法是:
True-positives:相等的标记和相等的标记,标记为真正
False-negative:相等的标记和不相等的标记或标记没有出现在预测中,标记为假阴性。
False-positive:令牌不存在,但已分配给标记,例如:
短语:“这是一个测试” 预测:{token:这是,tag: WHO} 真对:{令牌:这个,标记:谁}{令牌:测试,标记:什么} 在这种情况下,{token: is,tag: 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]]++;
}
}在此之后,计算F1:
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);不过,我相信我在某些概念上是错的。有人有意见吗?
发布于 2020-11-18 11:38:42
这不是一个完整的答案。看一看这里,我们可以看到有许多可能的方法来定义NER的F1分数。至少有6种可能的情况,TP、TN、FN和FP的一部分,因为标记可以对应多个令牌,因此我们可以考虑部分匹配。如果您看一看,有不同的方法来定义F1评分,例如,其中一些定义TP就像严格的正和部分正的加权平均值一样。CoNLL是NER最著名的基准之一,看起来它们使用了一个严格的召回和拆分定义,这足以定义F1评分:
精度是指学习系统发现的命名实体中正确的百分比。召回是指系统在语料库中发现的命名实体的百分比。只有在数据文件中的相应实体完全匹配时,命名实体才是正确的。
https://stackoverflow.com/questions/64738626
复制相似问题