首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为多标签注解计算Krippendorff Alpha

为多标签注解计算Krippendorff Alpha
EN

Stack Overflow用户
提问于 2021-07-13 22:24:03
回答 1查看 420关注 0票数 0

如何为多标签注释计算Krippendorff Alpha?在多类注释的情况下(假设3个编码器已经用3个标签注释了4个文本: a,b,c),我首先构造可靠性数据矩阵,然后构造重合,并根据重合计算Alpha:

问题是,在像下面这样的多标签分类问题中,我如何准备重合和计算alpha?

如果使用Python实现,甚至是excel,我们将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-07-15 02:41:59

在寻找类似信息时遇到了你的问题。我们使用下面的代码,使用nltk.agreement作为指标,使用pandas_ods_reader从LibreOffice电子表格中读取数据。我们的数据有两个注释器,对于某些项目,可以有两个标签(例如,一个编码器只注释一个标签,而另一个编码器只注释两个标签)。

下面的电子表格截图显示了输入数据的结构。注释项的列称为annotItems,注释列称为coder1coder2。当有多个标签时,分隔符是竖线,这与示例中的逗号不同。

代码的灵感来自于这篇文章:Low alpha for NLTK agreement using MASI distance

[Spreadsheet screencap]

代码语言:javascript
运行
复制
from nltk import agreement
from nltk.metrics.distance import masi_distance
from nltk.metrics.distance import jaccard_distance

import pandas_ods_reader as pdreader

annotfile = "test-iaa-so.ods"

df = pdreader.read_ods(annotfile, "Sheet1")

annots = []


def create_annot(an):
    """
    Create frozensets with the unique label
    or with both labels splitting on pipe.
    Unique label has to go in a list so that
    frozenset does not split it into characters.
    """
    if "|" in str(an):
        an = frozenset(an.split("|"))
    else:
        # single label has to go in a list
        # need to cast or not depends on your data
        an = frozenset([str(int(an))])
    return an


for idx, row in df.iterrows():
    annot_id = row.annotItem + str.zfill(str(idx), 3)
    annot_coder1 = ['coder1', annot_id, create_annot(row.coder1)]
    annot_coder2 = ['coder2', annot_id, create_annot(row.coder2)]
    annots.append(annot_coder1)
    annots.append(annot_coder2)

# based on https://stackoverflow.com/questions/45741934/
jaccard_task = agreement.AnnotationTask(distance=jaccard_distance)
masi_task = agreement.AnnotationTask(distance=masi_distance)
tasks = [jaccard_task, masi_task]
for task in tasks:
    task.load_array(annots)
    print("Statistics for dataset using {}".format(task.distance))
    print("C: {}\nI: {}\nK: {}".format(task.C, task.I, task.K))
    print("Pi: {}".format(task.pi()))
    print("Kappa: {}".format(task.kappa()))
    print("Multi-Kappa: {}".format(task.multi_kappa()))
    print("Alpha: {}".format(task.alpha()))

对于此答案链接的录屏中的数据,将打印以下内容:

代码语言:javascript
运行
复制
Statistics for dataset using <function jaccard_distance at 0x7fa1464b6050>
C: {'coder1', 'coder2'}
I: {'item3002', 'item1000', 'item6005', 'item5004', 'item2001', 'item4003'}
K: {frozenset({'1'}), frozenset({'0'}), frozenset({'0', '1'})}
Pi: 0.1818181818181818
Kappa: 0.35714285714285715
Multi-Kappa: 0.35714285714285715
Alpha: 0.02941176470588236

Statistics for dataset using <function masi_distance at 0x7fa1464b60e0>
C: {'coder1', 'coder2'}
I: {'item3002', 'item1000', 'item6005', 'item5004', 'item2001', 'item4003'}
K: {frozenset({'1'}), frozenset({'0'}), frozenset({'0', '1'})}
Pi: 0.09181818181818181
Kappa: 0.2864285714285714
Multi-Kappa: 0.2864285714285714
Alpha: 0.017962466487935425
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68364284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档