2013-03-25 3 views
0

두 단어 사이의 의미 론적 관계를 이해하려면 NLTK와 wordnet을 사용하고 싶습니다. 마치 "직원"과 "웨이터"라고 입력하면 직원이 웨이터보다 더 일반적임을 나타내는 결과를 반환합니다. 또는 "직원"과 "작업자"에 대해서는 동등한 값을 반환합니다. 누구든지 그 일을하는 방법을 알고 있습니까?NLTK를 사용하여 의미 계층 구조/관계를 결정하는 방법은 무엇입니까?

+2

그리고 무엇을 시도 했습니까? – Anthon

답변

6

먼저 단어를 보조 용어로 가져온 다음 Synsets으로 가져와야합니다. 즉 단어에서 synset을 어떻게 식별 할 수 있습니까?

word => lemma => lemma.pos.sense => synset  
Waiters => waiter => 'waiter.n.01' => wn.Synset('waiter.n.01') 

그럼 당신은 이미 위의 문제를 해결하고 waiter의 오른쪽 대부분의 표현에 도착했습니다 가정 해 봅시다, 당신은 synset을 비교 계속할 수 있습니다. 단어가 많은 synset을 가질 수 있음을 유의하십시오.

from nltk.corpus import wordnet as wn 
waiter = wn.Synset('waiter.n.01') 
employee = wn.Synset('employee.n.01') 

all_hyponyms_of_waiter = list(set([w.replace("_"," ") for s in waiter.closure(lambda s:s.hyponyms()) for w in s.lemma_names])) 
all_hyponyms_of_employee = list(set([w.replace("_"," ") for s in employee.closure(lambda s:s.hyponyms()) for w in s.lemma_names])) 

if 'waiter' in all_hyponyms_of_employee: 
    print 'employee more general than waiter' 
elif 'employee' in all_hyponyms_of_waiter: 
    print 'waiter more general than employee' 
else: 
    print "The SUMO ontology used in wordnet just doesn't have employee or waiter under the same tree"