2013-03-11 3 views
7

У меня есть список всех существительных в wordnet, теперь я хочу оставить только слова, которые являются транспортными средствами, и удалить остальные. Как мне это сделать? Ниже псевдокод я хочу сделать, но я не знаю, как заставить его работатьКак получить все гипонимы слова/synset в python nltk и wordnet?

for word in wordlist: 
    if not "vehicle" in wn.synsets(word): 
    wordlist.remove(word) 

ответ

9
from nltk.corpus import wordnet as wn 
vehicle = wn.synset('vehicle.n.01') 
typesOfVehicles = list(set([w for s in vehicle.closure(lambda s:s.hyponyms()) for w in s.lemma_names])) 

Это даст вам все уникальные слова из каждого synset, который является hyponym существительного «транспортное средство »(1-й смысл).

+0

Но когда я пытаюсь сузить ее дальше, я получаю эту ошибку Traceback (самый последний вызов последний): Файл "D: ... \ test.py", строки 10, в если «car» в слове: TypeError: аргумент типа «Synset» не итерируется – watisit

+0

См. мой обновленный ответ - я думаю, это то, что вы хотите. – Jared

+0

@ Jared, очень элегантный ответ, но есть 'gotcha', когда' Synset.closure (lambda s: s.hyponyms() 'переходит в бесконечный цикл. Попробуйте' wn.synset ('restrain.v.01'). Закрытие (lambda s: s.hyponyms() ' – alvas

5
def get_hyponyms(synset): 
    hyponyms = set() 
    for hyponym in synset.hyponyms(): 
     hyponyms |= set(get_hyponyms(hyponym)) 
    return hyponyms | set(synset.hyponyms()) 
+1

Это отлично работает с NLTK 3.0.3, в отличие от ответа jared (объект TypeError: 'method is is iterable), спасибо! –

Смежные вопросы