使用 Krippendorff Alpha 的 NLTK 注释者间协议
NLTK inter-annotator agreement using Krippendorff Alpha
我正在尝试使用 NLTK 的 nltk.metrics.agreement
模块计算玩具示例的注释者间协议。
具体来说,我正在尝试使用两个不同的距离度量(binary_distance
和 interval_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,可靠性都必须更高。
我正在尝试使用 NLTK 的 nltk.metrics.agreement
模块计算玩具示例的注释者间协议。
具体来说,我正在尝试使用两个不同的距离度量(binary_distance
和 interval_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,可靠性都必须更高。