2012-08-11 10 views
6

मुझे यह नहीं पता था कि पाइथन सेट फ़ंक्शन वास्तव में अलग-अलग वर्णों में स्ट्रिंग को अलग करता है। मैंने जैककार्ड के लिए पायथन फ़ंक्शन लिखा और पाइथन चौराहे विधि का उपयोग किया। मैंने इस विधि में दो सेट पारित किए और मेरे जैककार्ड फ़ंक्शन में दो सेट पास करने से पहले मैं सेटिंग पर सेट फ़ंक्शन का उपयोग करता हूं।पायथन: शब्द चौराहे का उपयोग करके जैककार्ड दूरी लेकिन चरित्र चौराहे नहीं

उदाहरण: मान लें कि मेरे पास स्ट्रिंग NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg है, मैं set(NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg) पर कॉल करूंगा जो स्ट्रिंग को वर्णों में अलग करेगा। इसलिए जब मैं इसे जैककार्ड फ़ंक्शन छेड़छाड़ पर भेजता हूं तो वास्तव में शब्द चौराहे के शब्द के बजाय चरित्र अंतरण दिखता है। मैं शब्द चौराहे के लिए शब्द कैसे कर सकता हूँ।

#implementing jaccard 
def jaccard(a, b): 
    c = a.intersection(b) 
    return float(len(c))/(len(a) + len(b) - len(c)) 

अगर मैं अपने स्ट्रिंग पर set समारोह कॉल नहीं करते NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg मैं निम्नलिखित त्रुटि मिलती है:

c = a.intersection(b) 
AttributeError: 'str' object has no attribute 'intersection' 

चरित्र चौराहे तक चरित्र के बजाय मैं शब्द चौराहे करने के लिए शब्द है और Jaccard प्राप्त करना चाहते हैं समानता।

उत्तर

9

कोशिश शब्दों में अपने स्ट्रिंग बंटवारे पहले:

word_set = set(your_string.split()) 

उदाहरण:

>>> word_set = set("NEW Fujifilm 16MP 5x".split()) 
>>> character_set = set("NEW Fujifilm 16MP 5x") 
>>> word_set 
set(['NEW', '16MP', '5x', 'Fujifilm']) 
>>> character_set 
set([' ', 'f', 'E', 'F', 'i', 'M', 'j', 'm', 'l', 'N', '1', 'P', 'u', 'x', 'W', '6', '5']) 
+0

असल में यह सटीक चीज है जिसे मैं खोज रहा था जब मैं चौराहे के दौरान ऐड फ़ंक्शन का उपयोग करता हूं, यह पूर्ण मिलान की तलाश में है। –

2

यह गुण सेट करने के लिए अद्वितीय नहीं है:

>>> list('NEW Fujifilm') 
['N', 'E', 'W', ' ', 'F', 'u', 'j', 'i', 'f', 'i', 'l', 'm'] 

यहाँ क्या हो रहा है कि स्ट्रिंग एक iterable अनुक्रम के रूप में इलाज चल रहा है और वर्ण दर वर्ण कार्रवाई की जा रही है।

यही बात आप सेट के साथ देख रहे हैं:

>>> set('string') 
set(['g', 'i', 'n', 's', 'r', 't']) 

, ठीक करने के लिए() एक मौजूदा सेट पर) का उपयोग .add, .add के बाद से (एक interable का उपयोग नहीं करता:

>>> se=set() 
>>> se.add('NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg') 
>>> se 
set(['NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg']) 

या, उपयोग विभाजन(), एक टपल, एक सूची, या तो स्ट्रिंग कुछ वैकल्पिक iterable एक iterable के रूप में व्यवहार नहीं कर रहा है:

>>> set('something'.split()) 
set(['something']) 
>>> set(('something',)) 
set(['something']) 
>>> set(['something']) 
set(['something']) 

अधिक तत्व जोड़ें एक शब्द-दर-शब्द आधार पर अपने स्ट्रिंग के आधार पर एस:

>>> se=set(('Something',)) | set('NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg'.split()) 

या, यदि आप कुछ तर्क के लिए एक समझ की जरूरत के रूप में आप सेट करने के लिए जोड़ें:

>>> se={w for w in 'NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg'.split() 
     if len(w)>3} 
>>> se 
set(['Shoot', 'CAMERA', 'Point', 'screen.jpg', 'Zoom', 'Fujifilm', '16MP', 'Optical']) 

और यह काम आप कैसे अब उम्मीद:

>>> 'Zoom' in se 
True 
>>> s1=set('NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg'.split()) 
>>> s2=set('Fujifilm Optical Zoom CAMERA NONE'.split()) 
>>> s1.intersection(s2) 
set(['Optical', 'CAMERA', 'Zoom', 'Fujifilm']) 
+1

मुझे लगता है कि ओपी वास्तव में 'सेट (a.split()) के बाद है। चौराहे (b.split()) '(मॉड्यूल केस और विराम चिह्न विवरण।) – DSM

+0

@ ड्रूक उदाहरण और महान स्पष्टीकरण के लिए धन्यवाद। प्रतिभाशाली!!! –

6

मेरे समारोह Jaccard दूरी की गणना करने के लिए:

def DistJaccard(str1, str2): 
    str1 = set(str1.split()) 
    str2 = set(str2.split()) 
    return float(len(str1 & str2))/len(str1 | str2) 

>>> DistJaccard("hola amigo", "chao amigo") 
0.333333333333 
2

यह एक मैं सेट कार्य के आधार पर लिखा है - "शब्द चौराहे तक शब्द" से

def jaccard(a,b): 
    a=a.split() 
    b=a.split() 
    union = list(set(a+b)) 
    intersection = list(set(a) - (set(a)-set(b))) 
    print "Union - %s" % union 
    print "Intersection - %s" % intersection 
    jaccard_coeff = float(len(intersection))/len(union) 
    print "Jaccard Coefficient is = %f " % jaccard_coeff 
संबंधित मुद्दे