2015-06-14 7 views
5

साथ मैं एक दो सूचियों है और मैं दो सूची में प्रत्येक शब्द के बीच समानता की जाँच करें और पता लगाने के अधिकतम similarity.Here मेरी कोड है करना चाहते हैं,NLTK साथ दो शब्दों के बीच समानता की जाँच करें अजगर

from nltk.corpus import wordnet 

list1 = ['Compare', 'require'] 
list2 = ['choose', 'copy', 'define', 'duplicate', 'find', 'how', 'identify', 'label', 'list', 'listen', 'locate', 'match', 'memorise', 'name', 'observe', 'omit', 'quote', 'read', 'recall', 'recite', 'recognise', 'record', 'relate', 'remember', 'repeat', 'reproduce', 'retell', 'select', 'show', 'spell', 'state', 'tell', 'trace', 'write'] 
list = [] 

for word1 in list1: 
    for word2 in list2: 
     wordFromList1 = wordnet.synsets(word1)[0] 
     wordFromList2 = wordnet.synsets(word2)[0] 
     s = wordFromList1.wup_similarity(wordFromList2) 
     list.append(s) 

print(max(list)) 

लेकिन यह एक त्रुटि परिणाम होगा:

wordFromList2 = wordnet.synsets(word2)[0] 
     IndexError: list index out of range 

कृपया मेरी मदद करो इसे ठीक करने के।
आपको धन्यवाद

+0

FWIW यहाँ '.synsets' के लिए दस्तावेज़ का एक लिंक दिया गया है: http://www.nltk.org/api/nltk.corpus.reader.html#nltk.corpus.reader.wordnet.WordNetCorpusReader.synsets – abathur

+0

https://github.com/alvations/pywsd/blob/master/pywsd/similarity.py#L76 – alvas

उत्तर

6

देखना हो इन सूचियों खाली हैं इससे पहले कि आप उसका उपयोग का प्रयास करें:

from nltk.corpus import wordnet 

list1 = ['Compare', 'require'] 
list2 = ['choose', 'copy', 'define', 'duplicate', 'find', 'how', 'identify', 'label', 'list', 'listen', 'locate', 'match', 'memorise', 'name', 'observe', 'omit', 'quote', 'read', 'recall', 'recite', 'recognise', 'record', 'relate', 'remember', 'repeat', 'reproduce', 'retell', 'select', 'show', 'spell', 'state', 'tell', 'trace', 'write'] 
list = [] 

for word1 in list1: 
    for word2 in list2: 
     wordFromList1 = wordnet.synsets(word1) 
     wordFromList2 = wordnet.synsets(word2) 
     if wordFromList1 and wordFromList2: #Thanks to @alexis' note 
      s = wordFromList1[0].wup_similarity(wordFromList2[0]) 
      list.append(s) 

print(max(list)) 
+0

@Punuth पर एक नज़र डालें क्या यह इस तरह से काम करता है? – omerbp

+0

बहुत यकीन है कि 'अगर लेन ...' लाइन एक वाक्यविन्यास त्रुटि होगी। 'लेन (blah1) और लेन (blah2) का परीक्षण भी कर सकते हैं:' क्योंकि उन्हें सिर्फ यह पता होना चाहिए कि वे खाली नहीं हैं। यदि .synsets से खाली वापसी दुर्लभ है, तो अन्य शायद इंडेक्स एरर को पकड़ने का सुझाव देंगे। – abathur

+0

@abathur धन्यवाद, मैंने इसे सही किया। पकड़ ब्लॉक के संबंध में - मैं सहमत हूं, लेकिन मुझे लगता है कि एक शब्द 'ब्लाह' में दूसरी सूची के भीतर समानार्थी नहीं हैं, इसलिए मैंने – omerbp

9

आपको एक त्रुटि प्राप्त हो रहे हैं एक synset सूची खाली है, और आप कम से तत्व (गैर प्राप्त करने की कोशिश -विशिष्ट) सूचकांक शून्य। लेकिन केवल शून्य के तत्व की जांच क्यों करें? यदि आप सब कुछ जांचना चाहते हैं, तो लौटा सिंकसेट में तत्वों के सभी जोड़े को आज़माएं। आप अपने आप को दो के लिए-छोरों को बचाने के लिए itertools.product() उपयोग कर सकते हैं:

from itertools import product 
sims = [] 

for word1, word2 in product(list1, list2): 
    syns1 = wordnet.synsets(word1) 
    syns2 = wordnet.synsets(word2) 
    for sense1, sense2 in product(syns1, syns2): 
     d = wordnet.wup_similarity(sense1, sense2) 
     sims.append((d, syns1, syns2)) 

यह अक्षम है, क्योंकि एक ही synsets बार-बार देखा जाता है, लेकिन यह आपके कोड के तर्क के सबसे करीब है। यदि आपके पास गति को गति देने के लिए पर्याप्त डेटा है, तो आप list1 और list2में पर सभी शब्दों के लिए synsets एकत्र करके और synsets के उत्पाद को ले कर इसे गति दे सकते हैं।

>>> allsyns1 = set(ss for word in list1 for ss in wordnet.synsets(word)) 
>>> allsyns2 = set(ss for word in list2 for ss in wordnet.synsets(word)) 
>>> best = max((wordnet.wup_similarity(s1, s2) or 0, s1, s2) for s1, s2 in 
     product(allsyns1, allsyns2)) 
>>> print(best) 
(0.9411764705882353, Synset('command.v.02'), Synset('order.v.01')) 
+0

कोड का दूसरा टुकड़ा कमाल है! क्या आप कृपया मुझे बता सकते हैं कि दूसरी सूची के समान शब्दों के साथ सिंकसेट के बिना पहली सूची के सिन्ससेट की तुलना कैसे करें? मैंने allsyns2 को संशोधित करने की कोशिश की लेकिन मुझे लगा, मैं पाइथन के लिए बिल्कुल नया हूं और खेद है कि दो लूप के साथ कोड की एक पंक्ति मेरे लिए भ्रमित है! – Hussein

+1

मुझे डर है कि मैं यह नहीं बता सकता कि आपका क्या मतलब है। उदाहरण के इनपुट और वांछित आउटपुट (और किसी भी कोड जिसे आप प्रबंधित कर सकते हैं) सहित, इसे उचित प्रश्न में विस्तृत करें। – alexis

+0

मेरा मतलब था कि दो सूचियों में से एक तय और ज्ञात है, इस तरह: list1 = ['word.n.01', 'word2.v.01']। मैं अटक गया क्योंकि मुझे नहीं पता था कि दो कार्य हैं: 'wordnet.synsets (word)' और 'wordnet.synset (word)'। मैंने इस तरह से हटा दिया: सूची में शब्द के लिए सेट (wordnet.synset (शब्द) 1) और अंततः – Hussein

संबंधित मुद्दे