2010-01-04 44 views
5

Tôi tính giá trị tf/idf của hai tài liệu. Sau đây là các tf/giá trị idf:Độ tương tự Cosine

1.txt 
0.0 
0.5 
2.txt 
0.0 
0.5 

Các tài liệu này như:

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

Làm thế nào tôi có thể sử dụng những giá trị này để tính toán sự tương đồng cosin?

Tôi biết rằng tôi nên tính toán sản phẩm chấm, sau đó tìm khoảng cách và chia dấu chấm sản phẩm theo nó. Làm thế nào tôi có thể tính toán điều này bằng cách sử dụng các giá trị của tôi?

Một câu hỏi khác: Điều quan trọng là cả hai tài liệu phải có cùng số từ?

+1

Đó không phải là thích hợp hơn cho http://mathoverflow.net /? –

+4

một nhiệm vụ truy xuất thông tin của nó, không phải là một cái gì đó một người toán học thuần túy sẽ quan tâm về –

+11

Hãy dừng đề xuất mathoverflow.net - đó là cho các câu hỏi toán học nghiêm trọng. –

Trả lời

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

a * b là dấu chấm sản phẩm

một số chi tiết:

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)) 

vâng. ở một mức độ nào đó, a và b phải có cùng độ dài. nhưng a và b thường có biểu diễn thưa thớt, bạn chỉ cần lưu trữ các mục nhập khác 0 và bạn có thể tính toán chỉ số và dấu chấm nhanh hơn.

+0

Cảm ơn, Nhưng tôi cũng bối rối về một điều nữa. Tôi thấy mọi người nói về điều này qua mạng. Tôi không thể hiểu được. Tôi có nên tính toán tương tự cosin trên giá trị tf/idf HOẶC không. Chỉ các giá trị idf hoặc chỉ các giá trị tf ????? Tôi biết php và bắt đầu học java. Nhưng tôi xin lỗi tôi không biết lang nào. mã bạn sử dụng ở đây?bạn có thể vui lòng cho tôi biết không, tôi sẽ xem lang đó. cú pháp cơ bản. Hoặc nếu bạn có thể sử dụng giá trị tf/idf của tôi để tính toán độ tương tự cosin, nó sẽ chỉ cho tôi cách viết một hàm cho điều đó ... cảm ơn một lần nữa để trả lời! – user238384

+0

@agazerboy mẫu được đưa ra trong python, mà nên được khá dễ đọc. cho i trong xrange (n) có nghĩa là (i = 0; i

+0

xin vui lòng đọc giải thích của tôi dưới đây! – user238384

8

đơn giản mã java thực hiện:

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

[Một chú thích người dùng ẩn danh] (http://stackoverflow.com/suggested-edits/237603) rằng đây phải là 'both.retainAll()' not ' removeAll' để nhận giao lộ – Rup

0

1) Tính TF-IDF (Nói chung tốt hơn so với tf một mình nhưng hoàn toàn phụ thuộc vào dữ liệu của bạn đặt ra và yêu cầu)

Từ wiki (liên quan đến IDF)

Hệ số tần suất tài liệu ngược được kết hợp làm giảm trọng số của các cụm từ xuất hiện rất thường xuyên trong bộ tài liệu và tăng trọng số của các cụm từ hiếm khi xảy ra.

2) Không, điều quan trọng là cả hai tài liệu đều có cùng số từ.

3) Bạn có thể tìm thấy tf-idf hoặc cosine-similarity bằng bất kỳ ngôn ngữ nào hiện nay bằng cách gọi một số chức năng thư viện học máy. Tôi thích python

đang

Python để tính toán tf-idfcosine-similarity (sử dụng scikit-learn 0.18.2)

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) Bạn có thể quan tâm truncated Singular Value Decomposition (SVD)

Các vấn đề liên quan