测量 NER 的 F1 分数

Measuring F1-score for NER

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

我的想法是:
真阳性:相同的标记和相同的标签,标签的真阳性
False-negative:相等的tokens和不相等的tags或者token没有出现在预测中,tag的false-negative
误报:token不存在但已分配给标签,示例:

Phrase: "This is a test"
Predicted: {token: This is, tag: WHO}
True pairs: {token: This, tag: WHO} {token: a test, tag: what}
In this case, {token: This is, tag: WHO} is considered as a false positive of 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);

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

这不是一个完整的答案。 看看here 我们可以看到有很多可能的方法来定义 NER 的 F1 分数。至少考虑6种可能的情况,TP、TN、FN、FP的一部分,因为一个tag可以对应多个token,所以我们可以考虑部分匹配。 如果您看一下,有多种定义 F1 分数的方法,例如,其中一些方法将 TP 定义为严格阳性和部分阳性的加权平均值。 CoNLL 是 NER 最著名的基准之一,看起来他们对召回率和精度使用了严格的定义,这足以定义 F1 分数:

precision is the percentage of named entities found by the learning system that are correct. Recall is the percentage of named entities present in the corpus that are found by the system. A named entity is correct only if it is an exact match of the corresponding entity in the data file.