Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Krippendorff Alpha的NLTK注释者间协议_Python_Nltk_Metrics - Fatal编程技术网

Python 使用Krippendorff Alpha的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的
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值应为
    -0.125
    (而不是NLTK返回的
    0.0
    ):

  • 类似地,对于玩具示例2,alpha值应为
    0.36
    (而不是NLTK返回的
    0.93

2) Krippendorff度量可以对输入数据进行假设,和/或不用于处理具有少量观察值和观察到的一致/不一致单位的玩具示例

实际上,对于玩具示例1,NTLK
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