首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >synset.hyperym_distances()中有任何副本吗?

synset.hyperym_distances()中有任何副本吗?
EN

Stack Overflow用户
提问于 2017-04-16 07:00:12
回答 1查看 136关注 0票数 0

我只是在环顾函数(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}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-19 02:21:20

当代码迟钝时,请将它们分解。

此外,尽量不要使用单列,他们通常没有计算速度,除了你能打字的速度。

知道你在重复什么

所以让我们打破这一局面。

在为列表迭代的每个元素创建字典的列表理解的复杂打印中,我们看到:

代码语言:javascript
复制
print([{i[0] : i[1]} for i in wn.synset('person.n.01').hypernym_distances()])

看起来循环本身是可以简化的。首先设置一个变量来保持同步集。(我假设您希望对几个同步集进行相同的操作,而不是只在person.n.01上使用它):

代码语言:javascript
复制
person = wn.synset('person.n.01')

现在让我们看看person.hypernym_distances()返回了什么:

代码语言:javascript
复制
>>> 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 / tuplesHow can I iterate through two lists in parallel?)

代码语言:javascript
复制
 >>> 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 comprehensiondictionary comprehension绊倒的时候。没有必要为person.hypernym_distances()中的每个元素创建一个新字典。相反,我认为字典的理解是你想要的,也就是说:

代码语言:javascript
复制
>>> {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}

将元组列表转换为字典

实际上,如果上面的字典是您想要的,给出一个每个元组具有两个项的可迭代元组,那么将可迭代转换为字典将自动将元组中的第一个项设置为键,而将第二个项设置为值:

代码语言:javascript
复制
>>> 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43434636

复制
相关文章

相似问题

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