nltk:如何搜索某些单词之间的联系?

时间:2019-02-11 18:30:51

标签: python nltk wordnet

我正在使用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”也可以压缩到实体上。

1 个答案:

答案 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')]

所以我至少可以对此进行调解。