共指消解任务CoNLL的官方评测库是Perl语言完成的,但是近些年基于Python语言为主的深度学习在共指消解任务上的应用越来越普遍,所以同时也非常需要一个基于Python的便捷评测库。
- 安装
pip install metric4coref
- 使用
from metric4coref import muc, ceaf, b_cubed, conll_coref_f1
# "a", "b" 等代表mention id
# predict_clusters、gold_clusters分别代表模型生成mention簇和标注mention簇
predict_clusters = [["a", "b", "c"], ["d", "e", "f", "g"], ["h", "i", "j"], ["k"]]
gold_clusters = [["a", "b", "d"], ["c", "e", "f", "g"], ["h", "i", "j", "k"]]
print(muc(predict_clusters, gold_clusters))
# -> 准确率、召回率、f1:(0.5833333333333334, 0.4666666666666667, 0.5185185185185186)
print(b_cubed(predict_clusters, gold_clusters))
# -> 准确率、召回率、f1:(0.7424242424242423, 0.606060606060606, 0.6673476336397685)
print(ceaf(predict_clusters, gold_clusters))
# -> 准确率、召回率、f1:(0.7272727272727273, 0.7272727272727273, 0.7272727272727273)
print(conll_coref_f1(predict_clusters, gold_clusters))
# -> 以上三个f1平均值: 0.6377129598103382
- the link based MUC
- 论文
- 1995
- B cubed metric
- 论文
- 1998
- the entity based CEAF metric
- 论文
- 2005
- BLANC
- Link-Based Entity-Aware metric (LEA).
- 任务主页 CoNLL 2012 Co-reference task
- 官方metric
- Average F1 of MUC, B-cubed, and CEAF
- the link based MUC
- 解释:基于簇中两两mention连接的边作为评测依据
- precision:
- 分子:所有系统预测边与所有标注边的交集的个数
- 分母:所有预测边的个数
- recall:
- 分子:所有系统预测边与所有标注边的交集的个数
- 分母:所有标注边的个数
- f1: precision * recall * 2 / (precision + recall)
- precision:
- 例子:
- 预测边: ab、bc、ac、de、df、dg、ef、eg、fg、hi、ij、hj共12个
- 标注边: ab、ad、bd、ce、cf、cg、ef、eg、fg、hi、hj、hk、ij、ik、jk共15个
- 预测边和标注边的交集: ab、ef、eg、fg、hi、hj、ij共7个
- precision: 7/12=0.5833333
- recall: 7/15=0.4666667
- f1: 0.5833333 * 0.4666667 * 2 / (0.5833333 + 0.4666667)=0.5185185
- 特点:
- 不考虑单个mention的簇,因为没有边
- 倾向于生成很多mention的簇,容易得高分
- 解释:基于簇中两两mention连接的边作为评测依据
- B cubed metric
- 解释:以mention为单位,每个mention计算一个precision和recall,在加权平均所有mention的precision和recall
- 每个mention的计算方法:
- precision:
- 分子:系统预测的包含mention的簇与人工标注的包含mention的簇的mention交集个数
- 分母:系统生成的包含mention的簇的个数
- recall:
- 分子:系统预测的包含mention的簇与人工标注的包含mention的簇的mention交集个数
- 分母:人工标注的包含mention的簇的个数
- f1: precision * recall * 2 / (precision + recall)
- precision:
- 每个mention的计算方法:
- 例子:
- mention a:
- 所在预测簇: ["a", "b", "c"]
- 所在标注簇: ["a", "b", "d"]
- precision:
- 分子: a、b共2个
- 分母: a、b、c共3个
- =2/3=0.666
- recall:
- 分子: a、b共2个
- 分母: a、b、d共3个
- =2/3=0.666
- mention b:
- 所在预测簇: ["a", "b", "c"]
- 所在标注簇: ["a", "b", "d"]
- precision:
- 分子: a、b共2个
- 分母: a、b、c共3个
- =2/3=0.666
- recall:
- 分子: a、b共2个
- 分母: a、b、d共3个
- =2/3=0.666
- mention c
- 所在预测簇: ["a", "b", "c"]
- 所在标注簇: ["c", "e", "f", "g"]
- precision:
- 分子: c共1个
- 分母: a、b、c共3个
- =1/3=0.333
- recall:
- 分子: c共1个
- 分母: c、e、f、g共4个
- =1/4=0.25 ...
- 对所有mention的precision、recall求平均值
- mention a:
- 特点:
- 对每个mention等权重看待
- 解释:以mention为单位,每个mention计算一个precision和recall,在加权平均所有mention的precision和recall
- the entity based CEAF metric
- 解释:
- 标注的实体簇为R、系统生成的实体簇为S,R中每个mention为r、S中每个mention为s
- R的个数与S的个数的少者为m
- 建立从R到S的一一映射map,每个映射对应从R中的r到S中的s,映射的个数为m
- 计算每个映射中,r和s中相同mention个数
- 计算整个map映射中,所有相同mention的个数
- 遍历所有可能的map,取所有相同mention的个数的最大的映射map,相同mention个数为n
- precision = n/S的mention个数
- recall = n/R的mention个数
- 例子:
- 预测的实体簇个数为4
- 标注的实体簇个数为3 那么m=3
- 遍历可知,映射关系为 标注实体簇1 --> 预测实体簇1 标注实体簇2 --> 预测实体簇2 标注实体簇3 --> 预测实体簇3
- 计数: 正确的mention有: a、b、e、f、g、h、i、j共8个 预测的mention个数共11个 标注的mention个数共11个
- 指标: precision=8/11=0.7272727 recall=8/11=0.7272727
- 解释: