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)
。你知道吗
我不知道如何比较两个元组列表字典。你知道吗
关于如何改进上面的代码来实现这个目标有什么想法吗?你知道吗
非常感谢您的帮助!你知道吗
一个简单的,
O(n^2)
解决方案是循环遍历随机生成数据的所有列表(字典值)中的所有元组,并检查这些元组是否匹配gold数据的任何列表中的任何元组。对于大型数据集,这将是低效的,因为在没有匹配项的更糟情况下,需要循环遍历随机元组中每个元组的所有gold数据元组。你知道吗一种更快的方法是使用允许平均大小写
O(1)
查找的数据结构(与列表中的O(n)
查找相反)。Python支持的类型有dictionary
和set
。你知道吗set
是项的集合,其中每个项通常包含一段数据。当有两个链接的数据块时,dictionary
更合适。在这里,您确实有两个链接/相关项,即名称和元组。你知道吗由于您将不断检查字典中是否存在元组,因此只有以以下格式存储元组才是有效的,因为您可以非常有效地查询任何元组。另外,当你找到一个元组并想知道它的名字时,你也可以直接找到它。你知道吗
要将
my_gold_mentions
词典转换为我建议的格式,您可以使用以下词典理解:它给出:
现在您已经创建了更好的数据结构(我们称之为
tup_gold_mentions
),您可以高效地完成任务:其中,
my_coref
为:给出正确的结果:
将
my_gold_mentions
和my_coref
更改为my_gold_mentions.items()
和my_coref.items()
这将允许您访问要比较的keys
和values
相关问题 更多 >
编程相关推荐