为NER测量F1分数

问题描述

我正在尝试评估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);

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

解决方法

因为我是新来的,所以我给出一个答案,我只能发表评论。这不是一个完整的答案。 在这里看看: http://www.davidsbatista.net/blog/2018/05/09/Named_Entity_Evaluation/ 我们可以看到,有很多可能的方法可以为NER定义F1分数。至少考虑6种可能的情况,即TP,TN,FN和FP的一部分,因为标签可以对应多个令牌,因此我们可以考虑部分匹配。 如果您看一下,可以使用不同的方法来定义F1得分,例如,其中一些方法可以定义TP,例如严格正值和部分正值的加权平均值。 CoNLL是NER最着名的基准之一,看起来他们对召回和命中使用严格的定义,足以定义F1分数:

“ precision是由学习系统找到的正确的命名实体的百分比。召回率是系统找到的语料库中存在的命名实体的百分比。只有在完全匹配的情况下,命名实体才是正确的文件中相应实体的名称。”