首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用wordnet nltk确定上位词或下位词

使用wordnet nltk确定上位词或下位词
EN

Stack Overflow用户
提问于 2014-10-07 02:28:37
回答 1查看 14.6K关注 0票数 6

我想检查两个单词之间的上位词/下位词关系(由用户给出),这意味着它们中的任何一个都可以是其他单词的上位词,也可以是two.Can之间没有上位词关系的情况。我使用path_similarity进行同样的检查。我正在尝试像this.If一样,您可以为此建议更好的方法。我还想知道,从sparql查询中检查相同是否更好

代码语言:javascript
复制
 first=wn.synset('automobile.n.01')
 second=wn.synset('car.n.01')
 first.path_similarity(second) 
EN

回答 1

Stack Overflow用户

发布于 2014-10-07 10:03:44

首先,在wordnet中,wordsynset/concept是有区别的。

在这里,我们可以看到一个单词可以有多个含义(即指向多个概念的链接):

代码语言:javascript
复制
>>> from nltk.corpus import wordnet as wn
>>> car = 'car'
>>> auto = 'automobile'
>>> wn.synsets(auto)
[Synset('car.n.01'), Synset('automobile.v.01')]
>>> wn.synsets(car)
[Synset('car.n.01'), Synset('car.n.02'), Synset('car.n.03'), Synset('car.n.04'), Synset('cable_car.n.01')]

在这种情况下,“汽车”和“汽车”可以引用相同的Synset('car.n.01'),如果是这样的话,那么它们就没有上下位词关系了。

还有lemma的概念,它只会使事情变得复杂,所以我们现在跳过它。

假设您不是比较单词,而是比较同义词集,那么您可以简单地找到同义词集的所有下位词,并查看另一个同义词集是否在其中出现。

如果您正在比较普通单词,请参阅How to get all the hyponyms of a word/synset in python nltk and wordnet?

下面将展示如何比较同义词集。举个例子,我将使用“水果”和“苹果”,这比“汽车”和“汽车”更符合逻辑,因为“汽车”和“汽车”只有一个名词同义词集。

代码语言:javascript
复制
>>> from nltk.corpus import wordnet as wn
>>>
>>> fruit = 'fruit'
>>> wn.synsets(fruit)
[Synset('fruit.n.01'), Synset('yield.n.03'), Synset('fruit.n.03'), Synset('fruit.v.01'), Synset('fruit.v.02')]
>>> wn.synsets(fruit)[0].definition()
u'the ripened reproductive body of a seed plant'
>>> fruit = wn.synsets(fruit)[0]
>>> 
>>> apple = 'apple'
>>> wn.synsets(apple)
[Synset('apple.n.01'), Synset('apple.n.02')]
>>> wn.synsets(apple)[0].definition()
u'fruit with red or yellow or green skin and sweet to tart crisp whitish flesh'
>>> apple = wn.synsets(apple)[0]
>>>

下面,我们看到苹果不是水果的直接下位词:

代码语言:javascript
复制
>>> fruit.hyponyms()
[Synset('accessory_fruit.n.01'), Synset('achene.n.01'), Synset('acorn.n.01'), Synset('aggregate_fruit.n.01'), Synset('berry.n.02'), Synset('buckthorn_berry.n.01'), Synset('buffalo_nut.n.01'), Synset('chokecherry.n.01'), Synset('cubeb.n.01'), Synset('drupe.n.01'), Synset('ear.n.05'), Synset('edible_fruit.n.01'), Synset('fruitlet.n.01'), Synset('gourd.n.02'), Synset('hagberry.n.01'), Synset('hip.n.05'), Synset('juniper_berry.n.01'), Synset('marasca.n.01'), Synset('may_apple.n.01'), Synset('olive.n.01'), Synset('pod.n.02'), Synset('pome.n.01'), Synset('prairie_gourd.n.01'), Synset('pyxidium.n.01'), Synset('quandong.n.02'), Synset('rowanberry.n.01'), Synset('schizocarp.n.01'), Synset('seed.n.01'), Synset('wild_cherry.n.01')]
>>> 
>>> apple in fruit.hyponyms()
False

因此,我们必须迭代所有的下位词,看看apple是否在其中之一:

代码语言:javascript
复制
>>> hypofruits = set([i for i in fruit.closure(lambda s:s.hyponyms())])
>>> apple in hypofruits
True

这就对了!出于完整性的考虑:

代码语言:javascript
复制
>>> hyperapple = set([i for i in apple.closure(lambda s:s.hypernyms())])
>>> fruit in hyperapple
True
>>> hypoapple = set([i for i in apple.closure(lambda s:s.hyponyms())])
>>> fruit in hypoapple
False
>>> hyperfruit = set([i for i in fruit.closure(lambda s:s.hypernyms())])
>>> apple in hyperfruit
False
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26222484

复制
相关文章

相似问题

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