我正在尝试使用NLTK的nltk.metrics.agreement
模块计算玩具示例上的注释器间协议。
具体而言,我正在尝试使用alpha
指标(Krippendorff)使用两个不同的距离指标(binary_distance
和interval_distance
)来计算协议。
以下玩具示例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
答案 0 :(得分:2)
由Klaus Krippendorff提供的答案
我不知道alpha的NLTK实现。你复制的内容似乎没有错。
为了阐明,α不是基于区间度量差异。区间度量差异函数只是众多版本中的一个。它响应有意义的代数差异,在名义范畴中不存在。
顺便提一下,当您拥有二进制数据时,所有度量标准差异都应该 产生相同的结果,因为只有两个值相同或不同。
让我集中讨论两个编码4个单元的编码器的两个数值例子。重合矩阵(表示单位内所有可能的有价值对的总和)在计算中总和为n = 8而不是10。他们看起来像:
是的,因为方差收敛到零,所以alpha也是如此。在你的第一个例子中几乎没有变化,唯一的偏差是一种分歧。无法依赖数据 计算相关性,测试统计假设,提供有关回答研究问题的现象的信息。如果注释没有任何变化,可靠性数据将无法向您保证编码器是否处于睡眠状态,决定对所有内容进行编码以达到100%的一致性,他们使用的仪器被打破。数据需要变化。
在第二个示例中,您的方差更大。无论您使用名义还是间隔度量计算alpha,可靠性都必须更高。
答案 1 :(得分:0)
手头似乎有两个问题:
1)使用metric=interval_distance
的Krippendorff alpha系数的NLTK实现使用与Krippendorff's paper中发布的公式不同的基础公式,或者代码中存在错误。
-0.125
(而非NLTK返回的0.0
):0.36
(而不是NLTK返回的0.93
)。 2)Krippendorff指标可以对输入数据进行假设,和/或不是为处理具有少量观察和观察到的协议/不一致单位的玩具示例而设计的。
对于玩具示例1,NTLK 0
返回的metric=binary_distance
的alpha系数值通过手动计算确认。
二进制alpha公式:
玩具示例1: