使用 Krippendorff Alpha 的 NLTK 注释者间协议

NLTK inter-annotator agreement using Krippendorff Alpha

我正在尝试使用 NLTK 的 nltk.metrics.agreement 模块计算玩具示例的注释者间协议。

具体来说,我正在尝试使用两个不同的距离度量(binary_distanceinterval_distance)使用 alpha 度量(Krippendorff)来计算一致性。

下面玩具示例 1 的预期结果几乎完全一致(只有一对不同意),其值接近 1。然而,在这两种情况下,res 都是 0.0。为什么?

我知道 Krippendorff 的 alpha 是为间隔而不是类似二进制的二分类标签设计的。但是,我不希望模块返回零协议值。对于背景,玩具示例只是包含 [1,4] 范围内注释分数的较大数据集的特定子集。该子集属于该数据集中的特定人群。

在玩具示例 2 中,区间 alpha 的情况开始变得更好。鉴于数据中现在有三个标签,二进制 alpha 可能会引发异常。

玩具示例 1

from nltk.metrics.agreement import AnnotationTask
from nltk.metrics import interval_distance, binary_distance 

 annotation_triples = [('coder_1', '1', 4), 
                       ('coder_2', '1', 4), 
                       ('coder_1', '2', 4),
                       ('coder_2', '2', 4), 
                       ('coder_1', '3', 4), 
                       ('coder_2', '3', 4),
                       ('coder_1', '4', 4), 
                       ('coder_2', '4', 3)]

 t = AnnotationTask(annotation_triples, distance=binary_distance)
 result = t.alpha()

 t = AnnotationTask(annotation_triples, distance=interval_distance)
 result = t.alpha()

result binary: 0.0
result interval: 0.0

玩具示例 2(使用 1 而不是 4 替换了第一对)

annotation_triples = [('coder_1', '1', 1), 
                      ('coder_2', '1', 1),  
                      ('coder_1', '2', 4),
                      ('coder_2', '2', 4), 
                      ('coder_1', '3', 4), 
                      ('coder_2', '3', 4),
                      ('coder_1', '4', 4), 
                      ('coder_2', '4', 3)]

result binary: 0.59
result interval: 0.93

手头似乎有两个问题:

1) metric=interval_distance 的 Krippendorff alpha 系数的 NLTK 实现使用了与 Krippendorff's paper 中发布的不同的基础公式,或者代码中存在错误。

  • 对于玩具示例 1,标称 alpha 值应为 -0.125(而不是 NLTK 返回的 0.0):

  • 同样,对于玩具示例 2,alpha 值应为 0.36(而不是 NLTK 返回的 0.93)。

2) Krippendorff 度量可能做出假设 w.r.t 输入数据 and/or 并非设计用于处理具有少量观察值和观察值 agreement/disagreement [=45] 的玩具示例=]单位。

实际上,对于玩具示例 1,NTLK metric=binary_distance 返回的 alpha 系数值 0 已通过手动计算确认。

二进制 alpha 公式:

玩具示例 1:

答案由 Klaus Krippendorff 提供

我不知道 alpha 的 NLTK 实现。从你转载的来看好像没有错。

澄清一下,α 不是基于区间度量差异。区间度量差异函数只是众多版本中的一个。它对名义类别中不存在的有意义的代数差异作出反应。

顺便说一句,当你有二进制数据时,所有度量差异都应该 产生相同的结果,因为只有两个值相同或不同。

让我重点关注您给出的两个数值示例,其中 2 个编码器编码 4 个单元。在您的计算中,巧合矩阵(列出单位内所有可能成对值的总和)总和为 n=8 而不是 10。它们看起来像:

是的,随着方差收敛到零,alpha 也收敛到零。在您的第一个示例中,几乎没有差异,唯一与一致性的偏差是分歧。数据不可能被依赖于 计算相关性,检验统计假设,提供有关感兴趣现象的信息以回答研究问题。等等 如果注释没有任何变化,可靠性数据将无法向您保证编码人员是否睡着了,决定对所有内容进行相同的编码以达到 100% 的一致性,他们使用的仪器是否损坏。数据需要变化。

在第二个例子中你确实有更大的方差。无论是用名义指标还是区间指标计算alpha,可靠性都必须更高。