Определение Hypernym или Hyponym с помощью wordnet nltk

Я хочу проверить наличие гипернимых / гипонимных отношений между двумя словами (заданными пользователем), что означает, что любое из них может быть гиперным другого или также может быть случай, когда между этими двумя не существует гиперного отношения. Могу ли я использовать path_simility для того же. Я пытаюсь сделать так. Если вы можете предложить какой-либо лучший способ для этого. Я также хочу знать, если это лучше проверить то же самое из запроса sparql

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

1 ответ

Во-первых, есть разница между word а также synset/concept в Wordnet.

Здесь мы видим, что одно слово может иметь несколько значений (то есть ссылки на несколько понятий):

>>> 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 что только усложнит ситуацию, поэтому мы пока пропустим это.

Допустим, вы сравниваете не слова, а наборы, тогда вы можете просто найти все гипонимы набора и посмотреть, встречается ли другой набор внутри него.

Если вы сравниваете простые слова, см. Как получить все гипонимы слова / синтаксиса в python nltk и 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]
>>>

Ниже мы видим, что яблоко не входит в прямые названия фрукта:

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

Таким образом, мы должны перебрать все гипонимы и посмотреть, есть ли в одном из них яблоко:

>>> 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
Другие вопросы по тегам