Skip to content

跨度与结构化输出的一致性

为何 Cohen 和 Fleiss 的 kappa 在跨度、NER 和结构化标注中失效,以及应改用什么:作为一致性的 F1、完全匹配与部分匹配,以及 Krippendorff 的单元化 alpha。

像 Cohen 的 kappa 这类经机会校正的一致性,假设每位标注者都从同一固定的类别集合中,为同一固定的条目集合打标签。跨度标注打破了这一假设:标注者可能在跨度从哪里开始、到哪里结束、乃至它是否存在这些问题上产生分歧。对于跨度,标准的可靠性度量是成对 F1,而不是 kappa,而且你必须事先决定边界的部分重叠是否算作一致。 本指南解释常用指标为何在此失效,以及应改为报告什么。

为何 kappa 不适用于跨度

一个经机会校正的系数需要三样东西:一份固定的条目清单、一份固定的标签清单,以及计算标注者偶然达成一致的频率的能力。跨度任务无法干净地提供其中任何一样。没有一份预先确定的"条目"清单可供打标签:标注者在阅读时才生成跨度,因此两个人对同一份文档可能产生数量不同的跨度。而且不存在有意义的负类:"没人标记的条目"是所有可能的子串,一个大到天文数字且定义不清的集合。

最后这一点才是致命的。Hripcsak and Rothschild (2005) 表明,当负类非常大或未定义时(如信息检索和跨度抽取中的情形),两位标注者在同一个任意跨度上达成一致的概率实际上为零,因此机会校正几乎不改变任何东西,kappa 背后的假设也不再成立。他们的结论是一种更干净的替代方案的标准依据:F 值本身就是恰当的一致性统计量。把一位标注者的跨度当作参考、另一位的当作预测,计算 F1,并在所有标注者对上取平均。由于 F1 是对称的,这一对的顺序无关紧要。

完全匹配还是部分匹配:测量前先决定

你报告的数字完全取决于什么算命中,而且没有普适答案,所以请声明你的选择。

  • 完全匹配:只有当两个边界都相同时,两个跨度才算一致。严格,且在边界承载意义时(法律引证、化学名称)是正确的选择。
  • 部分/重叠匹配:只要有任何重叠,或超过某个阈值,两个跨度就算一致。更宽容,当实体的存在比其确切范围更重要时是合理的。
  • 边界还是标签:对于带类型的跨度(NER),把两个问题分开:标注者是否标出了相同的范围?以及他们是否赋予了相同的类型?把二者合在一起报告,会掩盖究竟是哪一个真正造成了你的分歧。

Artstein and Poesio (2008) 是计算语言学中关于一致性的标准综述,并详细讨论了这个"单元化"问题,即关于如何把文本切分成单元的分歧。当你需要为某个方法论选择辩护时,这是应引用的参考文献。

当你确实想要一个经机会校正的数字时

如果你能把任务归约为一个固定的单元集合,机会校正就重新成立。两种常见的归约方式:

  • 词元级标注:把跨度任务重新表述为每个词元一个标签(BIO 方案)。这样每个词元都是一个具有小标签集的固定条目,Fleiss 的 kappa 或 Krippendorff 的 alpha 可直接适用。麻烦在于词元级一致性看起来会被抬高:大多数词元属于简单的"外部"类,因此一个很高的数字可能掩盖真实的边界分歧。
  • 单元化 alphaKrippendorff (2004) 正是为标注者自行切分连续体这一情形开发了 alpha 的一个变体。当你想要一个针对切分的、经机会校正的单一可靠性数值时,这是有原则的选择,代价是需要更多准备工作。

一条务实的折中路径:把词元级 kappa 跨度级 F1 一起报告。前者告诉你标签的一致性,后者告诉你边界的一致性,而二者之间的差距则告诉你该修正哪个问题。

在 Potato 中的做法

Potato 会为分类方案自动计算 Krippendorff 的 alpha,但对于 span 方案,文档级的数字会掩盖边界分歧,所以请在你真正关心的层级上测量。可靠的做法是让标注者在一个共享子集上重叠,导出他们的跨度,并按你选定的匹配规则自行计算成对 F1。

yaml
annotation_schemes:
  - name: pii_spans
    annotation_type: span
    description: "Highlight every span that reveals personal information."
    labels:
      - name: person
      - name: location
      - name: org
 
# Overlap a subset so agreement is measurable
automatic_assignment:
  on: true
  instance_per_annotator: 100
  labels_per_instance: 3

导出会保留每位标注者的跨度及其字符偏移量和标签,这正是你离线计算完全匹配或重叠 F1、并把边界一致性与类型一致性区分开来所需的全部内容。如果你的跨度带类型,就把 F1 运行两次:一次忽略类型(边界一致性),一次要求类型匹配(完全一致性)。

延伸阅读