python - 使用 wordnet nltk 确定 Hypernym 或 Hyponym

标签 python sparql nltk rdflib

我想检查两个词之间的上位词/下位词关系(由用户提供) 这意味着它们中的任何一个都可以是其他的上位词,或者也可以是两者之间没有上位词关系的情况。我可以使用 path_similarity 吗?我正在尝试这样做。如果你能提出更好的方法为此。我还想知道从 sparql 查询中检查是否更好

 first=wn.synset('automobile.n.01')
 second=wn.synset('car.n.01')
 first.path_similarity(second) 

最佳答案

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

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

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

在这种情况下,'automobile' 和 'car' 可以指代相同的 Synset('car.n.01'),如果是这样,那么它们就没有下位/上位关系。

还有 引理 的概念,它只会使事情复杂化,所以我们暂时跳过它。

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

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

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

>>> 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]
>>>

下面,我们看到 apple 不在 fruit 的直接下义词中:

>>> 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 是否在其中之一:

>>> hypofruits = set([i for i in fruit.closure(lambda s:s.hyponyms())])
>>> apple in hypofruits
True

给你!为了完整起见:

>>> 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

关于python - 使用 wordnet nltk 确定 Hypernym 或 Hyponym,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26222484/

相关文章:

Python Pandas 数据框分配

python - 在 OSX 中调用 pydoc - 链接到底是如何工作的?

oop - SPARQL 主语及其所有父类(super class)的所有谓词-宾语对

machine-learning - 查找两个短句子或文章之间语义相似性的最新方法(在概念级别)

nlp - 如何使用斯坦福 NERTagger 从 python 列表中识别命名实体

c# - 将Argument数组传递给C#中的多参数函数

python 读取文件 next()

select - 在构造 sparql 查询中使用联合

rdf - 使用密码的 SPARQL INSERT

python - 规范化餐厅菜肴列表