शायद collections.Counter()
का उपयोग करें; उन बहु सेट, या बैग, डेटाप्रकार की भाषा में कर रहे हैं:
from collections import Counter
counterA = Counter(listA)
counterB = Counter(listB)
अब आप प्रविष्टियों या आवृत्तियों से इन तुलना कर सकते हैं:
import math
def counter_cosine_similarity(c1, c2):
terms = set(c1).union(c2)
dotprod = sum(c1.get(k, 0) * c2.get(k, 0) for k in terms)
magA = math.sqrt(sum(c1.get(k, 0)**2 for k in terms))
magB = math.sqrt(sum(c2.get(k, 0)**2 for k in terms))
return dotprod/(magA * magB)
:
>>> counterA
Counter({'apple': 3, 'orange': 2, 'banana': 1})
>>> counterB
Counter({'apple': 2, 'orange': 1, 'grapefruit': 1})
>>> counterA - counterB
Counter({'orange': 1, 'apple': 1, 'banana': 1})
>>> counterB - counterA
Counter({'grapefruit': 1})
आप का उपयोग कर अपने कोज्या समानता गणना कर सकते हैं
जो देता है:
>>> counter_cosine_similarity(counterA, counterB)
0.8728715609439696
1 मान के करीब, दो सूचियों की तरह ही अधिक हैं।
कोसाइन समानता एक स्कोर है जिसे आप गणना कर सकते हैं। यदि आप सूची की लंबाई की परवाह करते हैं, तो आप दूसरे की गणना कर सकते हैं; यदि आप उस स्कोर को 0.0 और 1.0 के बीच रखते हैं तो आप -1.0 और 1.0 के बीच अंतिम स्कोर के लिए दो मानों को गुणा कर सकते हैं।
उदाहरण के लिए, लेने के लिए खाते में रिश्तेदार लंबाई आप इस्तेमाल कर सकते हैं:
def length_similarity(c1, c2):
lenc1 = sum(c1.itervalues())
lenc2 = sum(c2.itervalues())
return min(lenc1, lenc2)/float(max(lenc1, lenc2))
और फिर एक समारोह है कि इनपुट के रूप में सूचियों लेता में गठबंधन:
def similarity_score(l1, l2):
c1, c2 = Counter(l1), Counter(l2)
return length_similarity(c1, c2) * counter_cosine_similarity(c1, c2)
अपने दो उदाहरण सूचियों के लिए, जिसके परिणामस्वरूप:
>>> similarity_score(['apple', 'orange', 'apple', 'apple', 'banana', 'orange'], ['apple', 'orange', 'grapefruit', 'apple'])
0.5819143739626463
>>> similarity_score(['apple', 'apple', 'orange', 'orange'], ['apple', 'orange'])
0.4999999999999999
आप आवश्यकतानुसार अन्य मीट्रिक में मिश्रण कर सकते हैं।
उन सूचियों, नहीं सेट कर रहे हैं। –
'समानता' से क्या आप एक तीसरी सूची बनाने का मतलब रखते हैं जिसमें तत्वों और सूची बी दोनों में दिखाई देने वाले तत्व शामिल हैं? ताकि आपके मामले में नतीजा '['सेब', 'नारंगी'] 'होगा? समानता से –
मेरा मतलब है कि वे कितने समान हैं। इसलिए 2 समान सेट (या सूची) की तुलना करने से आपको 1 का स्कोर मिलेगा, और 2 पूरी तरह से अलग-अलग सेट आपको शून्य देंगे। हालांकि, ये सेट आकार में भिन्न हैं, और इसमें दोहराए गए तत्व – kmace