我正在使用nltk和wordnet链接属于某个关系组的单词。例如,“停车”和“建筑物”应具有某些父级链接。我使用上位词,但有些单词没有任何联系。
x = wordnet.synset('parking.n.01')
y = wordnet.synset('building.n.01')
print(x._shortest_hypernym_paths(y))
print(y._shortest_hypernym_paths(x))
{Synset('parking.n.01'):0,Synset('room.n.02'):1, 同义词集('position.n.07'):2,同义词集('relation.n.01'):3, 同义词集('abstraction.n.06'):4,同义词集('entity.n.01'):5, Synset(' ROOT '):6} {Synset('building.n.01'):0, 同义词集('structure.n.01'):1,同义词集('artifact.n.01'):2, 同义词集('whole.n.02'):3,同义词集('object.n.01'):4, 同义词集('physical_entity.n.01'):5,同义词集('entity.n.01'):6, 同义词集(' ROOT '):7}
在这里,连接通过“ entity.n.01”进行,这实际上是几乎所有物理名词的根源。我怎么能得到比这更好的东西?
我想得到类似“停车”->“结构”->“建筑物”的东西;它可以更长一些,但是“外来”字词不应该放在那儿,例如“ monkey”也可以压缩到实体上。
答案 0 :(得分:1)
找到了一些有用的方法来查看可能性:
def getShortestHypernymPath(word1, word2, nulls=False):
syns1 = wordnet.synsets(word1)
syns2 = wordnet.synsets(word2)
for s1 in syns1:
for s2 in syns2:
lch = s2.lowest_common_hypernyms(s1)
if len(lch) > 0 or nulls:
print(s1, '<-->', s2, '===', lch)
nlpf.getShortestHypernymPath('parking', 'building', nulls=False)
这将返回:
Synset('parking.n.01')<-> Synset('building.n.01')=== [Synset('entity.n.01')] Synset('parking.n.01')<-> 同义词集('construction.n.01')=== [同义词集('abstraction.n.06')] 同义词集('parking.n.01')<->同义词集('construction.n.07')=== [Synset('abstraction.n.06')] Synset('parking.n.01')<-> 同义词集('building.n.04')=== [同义词集('abstraction.n.06')] 同义词集('parking.n.02')<->同义词集('building.n.01')=== [Synset('entity.n.01')] Synset('parking.n.02')<-> 同义词集('construction.n.01')=== [同义词集('act.n.02')] 同义词集('parking.n.02')<->同义词集('construction.n.07')=== [Synset('act.n.02')] Synset('parking.n.02')<-> 同义词集('building.n.04')=== [同义词集('abstraction.n.06')] 同义词集('park.v.02')<->同义词集('build.v.05')=== [Synset('control.v.01')]
所以我至少可以对此进行调解。