我只是在环顾函数(hypernym_distances()),当我看到所有可能的hypernym的结果时,有两个具有不同距离的“what y.n.01”元素,原因是什么?有人能解释一下这件事吗?
在Python中:
print([{i[0] : i[1]} for i in wn.synset('person.n.01').hypernym_distances()])
上面的代码将显示导致最终术语“实体”的所有超限。
产出如下:
{Synset(‘objecy.n.01’):3},{Synset('object.n.01'):4},{Synset('physical_entity.n.01'):5},{Synset(‘Organm.n.01’):1},{Synset('person.n.01'):0},{Synset(‘objecy.n.01’):6},{Synset('living_thing.n.01'):2},{Synset('physical_entity.n.01'):2},{Synset('causal_agent.n.01'):1},{Synset(‘Synset e.n.02’):3}
这是一个包含同步集的名称-值对,它是指定单词的超限之一。
谁能解释为什么在输出中出现两次“实体”n.01?
{Synset(‘Synset y.n.01’):6}
{Synset(‘Synset y.n.01’):3}
发布于 2017-04-19 02:21:20
当代码迟钝时,请将它们分解。
此外,尽量不要使用单列,他们通常没有计算速度,除了你能打字的速度。
知道你在重复什么
所以让我们打破这一局面。
在为列表迭代的每个元素创建字典的列表理解的复杂打印中,我们看到:
print([{i[0] : i[1]} for i in wn.synset('person.n.01').hypernym_distances()])看起来循环本身是可以简化的。首先设置一个变量来保持同步集。(我假设您希望对几个同步集进行相同的操作,而不是只在person.n.01上使用它):
person = wn.synset('person.n.01')现在让我们看看person.hypernym_distances()返回了什么:
>>> person.hypernym_distances()
{(Synset('person.n.01'), 0), (Synset('organism.n.01'), 1), (Synset('whole.n.02'), 3), (Synset('physical_entity.n.01'), 5), (Synset('causal_agent.n.01'), 1), (Synset('entity.n.01'), 3), (Synset('living_thing.n.01'), 2), (Synset('physical_entity.n.01'), 2), (Synset('entity.n.01'), 6), (Synset('object.n.01'), 4)}person.hypernym_distances()的数据结构已经是一组元组,其中第一个元素是hypernym,第二个元素是距离。Synset('entity.n.01')应该只在person.hypernym_distances()中出现一次,因为它是set类型。
循环中元组/可迭代性的可解压缩
当迭代一个元组时,您可以轻松地“解压”它(请参阅Unpacking a list / tuple of pairs into two lists / tuples和How can I iterate through two lists in parallel?)
>>> from nltk.corpus import wordnet as wn
>>> wn.synset('person.n.01')
Synset('person.n.01')
>>> person = wn.synset('person.n.01')
>>> person.hypernym_distances()
{(Synset('person.n.01'), 0), (Synset('organism.n.01'), 1), (Synset('whole.n.02'), 3), (Synset('physical_entity.n.01'), 5), (Synset('causal_agent.n.01'), 1), (Synset('entity.n.01'), 3), (Synset('living_thing.n.01'), 2), (Synset('physical_entity.n.01'), 2), (Synset('entity.n.01'), 6), (Synset('object.n.01'), 4)}
>>> for ss, count in person.hypernym_distances():
... print (ss,'\t', count)
...
Synset('person.n.01') 0
Synset('organism.n.01') 1
Synset('whole.n.02') 3
Synset('physical_entity.n.01') 5
Synset('causal_agent.n.01') 1
Synset('entity.n.01') 3
Synset('living_thing.n.01') 2
Synset('physical_entity.n.01') 2
Synset('entity.n.01') 6
Synset('object.n.01') 4通过以上述方式迭代元组列表,可以避免丑陋的(i[0], i[1]) for i in iterable_of_tuples语法。相反,请执行(a,b) for a,b in iterable_of_tuples。
清单与理解力
似乎您正在尝试将person.hypernym_distances()中的元组放入字典中,其中键是synset,值是计数。
我想这个错误是当你被list comprehension和dictionary comprehension绊倒的时候。没有必要为person.hypernym_distances()中的每个元素创建一个新字典。相反,我认为字典的理解是你想要的,也就是说:
>>> {ss:count for ss, count in person.hypernym_distances()}
{Synset('object.n.01'): 4, Synset('whole.n.02'): 3, Synset('living_thing.n.01'): 2, Synset('organism.n.01'): 1, Synset('entity.n.01'): 6, Synset('person.n.01'): 0, Synset('causal_agent.n.01'): 1, Synset('physical_entity.n.01'): 2}将元组列表转换为字典
实际上,如果上面的字典是您想要的,给出一个每个元组具有两个项的可迭代元组,那么将可迭代转换为字典将自动将元组中的第一个项设置为键,而将第二个项设置为值:
>>> dict(person.hypernym_distances())
{Synset('object.n.01'): 4, Synset('whole.n.02'): 3, Synset('living_thing.n.01'): 2, Synset('organism.n.01'): 1, Synset('entity.n.01'): 6, Synset('person.n.01'): 0, Synset('causal_agent.n.01'): 1, Synset('physical_entity.n.01'): 2}另请参阅
在本机python中有高性能的容器数据结构可以处理这些,它们也具有出色的功能。请参阅https://docs.python.org/3/library/collections.html
https://stackoverflow.com/questions/43434636
复制相似问题