<p>一个简单的,<code>O(n^2)</code>解决方案是循环遍历随机生成数据的所有列表(字典值)中的所有元组,并检查这些元组是否匹配gold数据的任何列表中的任何元组。对于大型数据集,这将是低效的,因为在没有匹配项的更糟情况下,需要循环遍历随机元组中每个</em>元组的所有gold数据元组<em>。你知道吗</p>
<p>一种更快的方法是使用允许平均大小写<code>O(1)</code>查找的数据结构(与列表中的<code>O(n)</code>查找相反)。Python支持的类型有<code>dictionary</code>和<code>set</code>。你知道吗</p>
<p><code>set</code>是项的集合,其中每个项通常包含一段数据。当有两个链接的数据块时,<code>dictionary</code>更合适。在这里,您确实有两个链接/相关项,即名称和元组。你知道吗</p>
<p>由于您将不断检查字典中是否存在元组,因此只有以以下格式存储元组才是有效的,因为您可以非常有效地查询任何元组。另外,当你找到一个元组并想知道它的名字时,你也可以直接找到它。你知道吗</p>
<pre><code>{(123,456):'some_name',
(234,567):'another_name')}
</code></pre>
<hr/>
<p>要将<code>my_gold_mentions</code>词典转换为我建议的格式,您可以使用以下词典理解:</p>
<pre><code>{tup:name for name, tups in my_gold_mentions.items() for tup in tups}
</code></pre>
<p>它给出:</p>
<pre><code>{(6532, 6538): 'Anakin',
(6590, 6592): 'Anakin',
(6673, 6675): 'Anakin',
(3600, 3602): 'He',
(3609, 3612): 'He'}
</code></pre>
<hr/>
<p>现在您已经创建了更好的数据结构(我们称之为<code>tup_gold_mentions</code>),您可以高效地完成任务:</p>
<pre><code>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
</code></pre>
<hr/>
<p>其中,<code>my_coref</code>为:</p>
<pre><code>{'Anakin': [(6532, 6538),
(123, 45)],
'Bob': [(3600, 3602)],
'Jim': [(12, 34)]}
</code></pre>
<p>给出正确的结果:</p>
<pre><code>>>> TP
1
>>> FP
1
>>> FN
3
</code></pre>