比较元组列表的两个字典以计算Fs

2024-09-28 22:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

Python在这里。你知道吗

我有两个元组列表字典:my_gold_mentions,其中包括我的gold数据,和my_coref,其中包括自动生成的数据。你知道吗

两个词典都是这样的:

{'Anakin': [(6532, 6538),
            (6590, 6592),
            (6673, 6675)],
 'He': [(3600, 3602),
        (3609, 3612)],...}  #  etc.

我试图通过比较自动生成的字典的元组和gold数据来计算F分数

如果有一个元组匹配,那么我想检查这两个匹配的元组是否有相同的键,在本例中:一个共享字符的名称,例如'Anakin'。你知道吗

如果是:则在真阳性计数中加1。你知道吗

如果键不相似,但是自动生成的键在gold数据字典中通常作为键存在(在本例中:除了'Anakin'之外的另一个字符),那么我应该认为它是两个a假阴性假阳性。你知道吗

最后,如果这个键在gold数据字典中根本不存在,那么就认为它只是一个假阴性。你知道吗

到目前为止,我已经尝试过:

TP = 0
FP = 0
FN = 0
for gold_key, gold_value in my_gold_mentions:
    for auto_key, auto_value in my_coref:
        if auto_value == gold_value:
            if auto_key == gold_key:
                TP += 1
            elif auto_key != gold_key and auto_key in my_gold_mentions:
                FN += 1
                FP += 1
        else:
            FN += 1

这看起来不是很有效,因为我得到了一个ValueError: too many values to unpack (expected 2)。你知道吗

我不知道如何比较两个元组列表字典。你知道吗

关于如何改进上面的代码来实现这个目标有什么想法吗?你知道吗

非常感谢您的帮助!你知道吗


Tags: 数据keyin列表auto字典valuemy
2条回答

一个简单的,O(n^2)解决方案是循环遍历随机生成数据的所有列表(字典值)中的所有元组,并检查这些元组是否匹配gold数据的任何列表中的任何元组。对于大型数据集,这将是低效的,因为在没有匹配项的更糟情况下,需要循环遍历随机元组中每个元组的所有gold数据元组。你知道吗

一种更快的方法是使用允许平均大小写O(1)查找的数据结构(与列表中的O(n)查找相反)。Python支持的类型有dictionaryset。你知道吗

set是项的集合,其中每个项通常包含一段数据。当有两个链接的数据块时,dictionary更合适。在这里,您确实有两个链接/相关项,即名称和元组。你知道吗

由于您将不断检查字典中是否存在元组,因此只有以以下格式存储元组才是有效的,因为您可以非常有效地查询任何元组。另外,当你找到一个元组并想知道它的名字时,你也可以直接找到它。你知道吗

{(123,456):'some_name',
 (234,567):'another_name')}

要将my_gold_mentions词典转换为我建议的格式,您可以使用以下词典理解:

{tup:name for name, tups in my_gold_mentions.items() for tup in tups}

它给出:

{(6532, 6538): 'Anakin',
 (6590, 6592): 'Anakin',
 (6673, 6675): 'Anakin',
 (3600, 3602): 'He',
 (3609, 3612): 'He'}

现在您已经创建了更好的数据结构(我们称之为tup_gold_mentions),您可以高效地完成任务:

TP = FN = FP = 0
for name, tups in my_coref.items():
    for tup in tups:
        if tup in tup_gold_mentions:
            if name == tup_gold_mentions[tup]:
                TP += 1
            else:
                FN += 1
                FP += 1
        else:
            FN += 1

其中,my_coref为:

{'Anakin': [(6532, 6538),
            (123, 45)],
 'Bob': [(3600, 3602)],
 'Jim': [(12, 34)]}

给出正确的结果:

>>> TP
1
>>> FP
1
>>> FN
3

my_gold_mentionsmy_coref更改为my_gold_mentions.items()my_coref.items()这将允许您访问要比较的keysvalues

for gold_key, gold_value in my_gold_mentions.items():
    for auto_key, auto_value in my_coref.items():

相关问题 更多 >