synset.hyperym_distances()中是否有重复项?

时间:2017-04-16 07:00:13

标签: python nlp wordnet

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

1 个答案:

答案 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类型。

在循环中解包迭代的元组/ iterables

在迭代元组时,您可以轻松地解开"解包"它(见Unpacking a list / tuple of pairs into two lists / tuplesHow 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

列表与Dict理解

您似乎正在尝试将person.hypernym_distances()中的元组放入字典中,其中键是synset,值是计数。

我想当你在list comprehensiondictionary 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