2013-03-11 18 views
7

Tôi có một danh sách tất cả các danh từ trong wordnet bây giờ tôi muốn chỉ để lại những từ là phương tiện và loại bỏ phần còn lại. Tôi phải làm nó như thế nào? Dưới đây là pseudo-code tôi muốn làm nhưng tôi không biết làm thế nào để làm cho nó hoạtLàm thế nào để có được tất cả các từ trái của một từ/đồng bộ trong python nltk và wordnet?

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

Trả lời

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

này sẽ cung cấp cho bạn tất cả những lời độc đáo từ mọi synset đó là một hyponym của danh từ "xe "(1 ý nghĩa).

+0

Nhưng khi tôi cố gắng để thu hẹp nó hơn nữa, tôi nhận được lỗi này Traceback (cuộc gọi gần đây nhất cuối cùng): File "D: ... \ test.py", dòng 10, trong nếu "xe hơi" trong từ: LoạiError: đối số của loại 'Synset' không thể lặp lại – watisit

+0

Xem câu trả lời cập nhật của tôi - Tôi nghĩ đó là những gì bạn muốn. – Jared

+0

@ Jared, câu trả lời rất thanh lịch nhưng có một 'gotcha' khi' Synset.closure (lambda s: s.hyponyms() 'đi đến một vòng lặp vô hạn. Hãy thử' wn.synset ('restrain.v.01'). closure (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

Điều đó làm việc tuyệt vời với NLTK 3.0.3, không giống như câu trả lời jared (TypeError: 'phương pháp' đối tượng không thể lặp lại), cảm ơn! –

Các vấn đề liên quan