Python 使用Krippendorff Alpha的NLTK注释者间协议
我试图使用NLTK的Python 使用Krippendorff Alpha的NLTK注释者间协议,python,nltk,metrics,Python,Nltk,Metrics,我试图使用NLTK的NLTK.metrics.agreement模块计算玩具示例上的注释者间一致性 具体地说,我试图使用两个不同的距离度量(binary\u distance和interval\u distance)使用alpha度量()计算一致性 下面玩具示例1的预期结果几乎完全一致(只有一对不一致),其值接近1。但是,在这两种情况下,res都是0.0。为什么? 我知道Krippendorff的alpha是为间隔而设计的,而不是像两个类别标签那样的二进制。但是,我不希望模块返回零协议值。作为背
NLTK.metrics.agreement
模块计算玩具示例上的注释者间一致性
具体地说,我试图使用两个不同的距离度量(binary\u distance
和interval\u distance
)使用alpha
度量()计算一致性
下面玩具示例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
替换第一对玩具)
目前似乎有两个问题: 1) Krippendorff alpha系数的NLTK实现具有
metric=interval\u distance
使用了与中发布的不同的基础公式,或者代码中存在错误
- 对于玩具示例1,标称alpha值应为
(而不是NLTK返回的-0.125
):0.0
- 类似地,对于玩具示例2,alpha值应为
(而不是NLTK返回的0.36
)李>0.93
metric=binary_distance
返回的0
的α系数值通过手动计算得到确认
二元阿尔法公式:
玩具示例1:
克劳斯·克里彭多夫提供的答案 我不知道alpha的NLTK实现。从你复制的内容来看,这似乎没有错 为了澄清,α不是基于区间度量差。区间度量差函数只是众多版本中的一个。它对有意义的代数差异作出反应,而在名词性类别中则没有 顺便说一句,当您有二进制数据时,所有度量差异都应该 产生相同的结果,因为只有两个值相同或不同 让我重点关注您给出的两个数字示例,其中两个编码器编码4个单元。在您的计算中,重合矩阵(列出单位内所有可能的值对之和)的总和为n=8而不是10。它们看起来像: 是的,随着方差收敛到零,α也收敛到零。在您的第一个示例中,实际上没有差异,唯一与一致性的偏差是不一致。这些数据不可能用于任何目的 计算相关性,检验统计假设,提供有关感兴趣现象的信息以回答研究问题。等等。如果注释没有任何变化,可靠性数据将无法确保编码人员是否睡着,决定对所有内容进行相同编码,以获得100%的一致性,那么他们使用的工具就坏了。数据需要变化 在第二个例子中,你有一个更大的方差。无论您是使用标称度量还是间隔度量计算alpha,可靠性都必须更高
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