我只是环顾这个函数(hypernym_distances()),当我看到所有可能的上位词的结果时,有两个不同距离的“entity.n.01”元素,它的原因是什么?有人可以解释一下吗?
在Python中:
print([{i[0] : i[1]} for i in wn.synset('person.n.01').hypernym_distances()])
以上代码将显示导致最终术语“实体”的所有上位词。
输出结果为:
[{Synset('entity.n.01'):3},{Synset('object.n.01'):4},{Synset('physical_entity.n.01'):5},{ Synset('organism.n.01'):1},{Synset('person.n.01'):0},{Synset('entity.n.01'):6},{Synset('living_thing。 n.01'):2},{Synset('physical_entity.n.01'):2},{Synset('causal_agent.n.01'):1},{Synset('whole.n.02') :3}]
这是一个包含synset的名称 - 值对,它是指定单词的上位词之一。
有人可以解释在输出中两次出现'entity.n.01'的原因是什么。
{Synset('entity.n.01'):6}
{Synset('entity.n.01'):3}
答案 0 :(得分:0)
如果代码是钝的,请将其分解。
另外,尽量不要使用单线程,除了输入速度之外,它们通常没有计算速度。
让我们打破局面。
在为列表迭代的每个元素创建字典的列表理解的复杂打印中,我们看到:
print([{i[0] : i[1]} for i in wn.synset('person.n.01').hypernym_distances()])
看起来循环本身可以简化。首先设置一个变量来保留synset。 (我假设您希望在多个同义词集上执行相同的操作,而不是仅在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()
的数据结构已经是一组元组,其中第一个元素是上位元素,第二个元素是距离。而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}
实际上,如果上面的字典是你想要的,每个元组有2个项目的元组的迭代,将迭代器转换成字典会自动将元组中的第一个项目设置为键,第二个项目作为值:< / p>
>>> 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