2010-01-04 24 views
5

मैंने दो दस्तावेजों के टीएफ/आईडीएफ मूल्यों की गणना की।कोसाइन समानता

1.txt 
0.0 
0.5 
2.txt 
0.0 
0.5 

दस्तावेजों की तरह हैं:

1.txt = > dog cat 
2.txt = > cat elephant 

मैं इन मूल्यों का उपयोग कैसे कोज्या समानता की गणना कर सकते हैं निम्नलिखित tf/आईडीएफ मान रहे हैं?

मुझे पता है कि मुझे डॉट उत्पाद की गणना करनी चाहिए, फिर दूरी ढूंढें और इसके द्वारा डॉट उत्पाद को विभाजित करें। मैं अपने मूल्यों का उपयोग करके इसकी गणना कैसे कर सकता हूं?

एक और प्रश्न: क्या यह महत्वपूर्ण है कि दोनों दस्तावेज़ों में समान संख्या में शब्द हो?

def dot(a,b): 
    n = length(a) 
    sum = 0 
    for i in xrange(n): 
    sum += a[i] * b[i]; 
    return sum 

def norm(a): 
    n = length(a) 
    for i in xrange(n): 
    sum += a[i] * a[i] 
    return math.sqrt(sum) 

def cossim(a,b): 
    return dot(a,b)/(norm(a) * norm(b)) 

हाँ:

+1

में रुचि हो सकती इस अधिक http://mathoverflow.net के लिए उपयुक्त नहीं है /? –

+4

इसकी एक सूचना पुनर्प्राप्ति कार्य है, कुछ शुद्ध गणित व्यक्ति –

+11

पर ध्यान नहीं देगा कृपया mathoverflow.net की सिफारिश करना बंद करें - यह गंभीर गणितीय प्रश्नों के लिए है। –

उत्तर

13
  a * b 
sim(a,b) =-------- 
      |a|*|b| 

एक * ख डॉट उत्पाद

कुछ जानकारी है। कुछ हद तक, ए और बी में एक ही लंबाई होनी चाहिए। लेकिन ए और बी में आमतौर पर स्पैस प्रतिनिधित्व होता है, आपको केवल गैर-शून्य प्रविष्टियों को स्टोर करने की आवश्यकता होती है और आप मानक की गणना कर सकते हैं और अधिक तेजी से डॉट कर सकते हैं।

+0

धन्यवाद, लेकिन मैं एक और चीज़ के बारे में भी उलझन में हूं। मैंने लोगों को नेट पर इस बारे में बात करते देखा। मैं समझ नहीं सका। क्या मुझे टीएफ/आईडीएफ मानों पर कोसाइन समानता की गणना करनी चाहिए या। केवल आईडीएफ मान या केवल टीएफ मान ????? मुझे php पता है और जावा सीखना शुरू करें। लेकिन मुझे खेद है कि मुझे नहीं पता कि कौन सा लैंग है। कोड आप यहाँ इस्तेमाल किया?क्या आप कृपया मुझे बता सकते हैं, मैं उस लंग को देख लूंगा। मूल वाक्यविन्यास। या यदि आप कोसाइन समानता की गणना करने के लिए मेरे टीएफ/आईडीएफ मानों का उपयोग कर सकते हैं, तो यह मुझे दिखाएगा कि इसके लिए एक फ़ंक्शन कैसे लिखना है ... उत्तर के लिए धन्यवाद! – user238384

+0

@agazerboy नमूना पायथन में दिया गया है, जो काफी पठनीय होना चाहिए। क्योंकि मैं xrange (n) में मतलब है (i = 0; i

+0

कृपया नीचे मेरी व्याख्या पढ़ें! – user238384

8

सरल जावा कोड कार्यान्वयन:

static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) { 
      Set<String> both = Sets.newHashSet(v1.keySet()); 
      both.retainAll(v2.keySet()); 
      double sclar = 0, norm1 = 0, norm2 = 0; 
      for (String k : both) sclar += v1.get(k) * v2.get(k); 
      for (String k : v1.keySet()) norm1 += v1.get(k) * v1.get(k); 
      for (String k : v2.keySet()) norm2 += v2.get(k) * v2.get(k); 
      return sclar/Math.sqrt(norm1 * norm2); 
    } 
+2

[अज्ञात उपयोगकर्ता टिप्पणियां] (http://stackoverflow.com/suggested-edits/237603) है कि यह 'दोनों .retainAll()' ' चौराहे पाने के लिए हटाएं – Rup

0

1) की गणना tf-आईडीएफ (आम तौर पर अकेले tf की तुलना में बेहतर है, लेकिन पूरी तरह से अपना डेटा सेट और आवश्यकता)

पर निर्भर करता है wiki (के बारे में आईडीएफ से)

एक व्यस्त दस्तावेज़ आवृत्ति कारक शामिल किया गया है जो को कम करता है जो दस्तावेज़ सेट में अक्सर होता है और शायद ही कभी होने वाली शर्तों का वजन बढ़ाता है।

2) नहीं, यह महत्वपूर्ण नहीं है कि दोनों दस्तावेज़ों में समान संख्या में शब्द हों।

3) आप किसी भी भाषा में tf-idf या cosine-similarity पा सकते हैं आजकल कुछ मशीन लर्निंग लाइब्रेरी फ़ंक्शन का आह्वान करते हुए। मैं अजगर

अजगर कोड पसंद करते हैं

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_similarity 
# example dataset 
from sklearn.datasets import fetch_20newsgroups 

# replace with your method to get data 
example_data = fetch_20newsgroups(subset='all').data 

max_features_for_tfidf = 10000 
is_idf = True 

vectorizer = TfidfVectorizer(max_df=0.5, max_features=max_features_for_tf_idf, 
          min_df=2, stop_words='english', 
          use_idf=is_idf) 


X_Mat = vectorizer.fit_transform(example_data) 

# calculate cosine similarity between samples in X with samples in Y 
cosine_sim = cosine_similarity(X=X_Mat, Y=X_Mat) 

4 की गणना करने के tf-idf और cosine-similarity (scikit-learn 0.18.2 का उपयोग)) आप truncated Singular Value Decomposition (SVD)