سؤال

قمت بحساب قيم TF/IDF لمستندتين. فيما يلي قيم TF/IDF:

1.txt
0.0
0.5
2.txt
0.0
0.5

الوثائق مثل:

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

كيف يمكنني استخدام هذه القيم لحساب تشابه جيب التمام؟

أعلم أنني يجب أن أحسب منتج DOT ، ثم أجد مسافة وقسم منتج DOT به. كيف يمكنني حساب هذا باستخدام قيمي؟

سؤال اخر: هل من المهم أن يكون لكل من الوثيقتين نفس عدد الكلمات؟

هل كانت مفيدة؟

المحلول

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

A*B هو منتج DOT

بعض التفاصيل:

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

نعم. إلى حد ما ، يجب أن يكون A و B نفس الطول. لكن A و B عادةً ما يكون لهما تمثيل متناثر ، فأنت بحاجة فقط إلى تخزين إدخالات غير صفرية ويمكنك حساب Norm و Dot بسرعة أكبر.

نصائح أخرى

تطبيق رمز Java البسيط:

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

1) حساب TF-IDF (أفضل بشكل عام من TF وحده ولكن يعتمد تمامًا على مجموعة البيانات ومتطلباتك)

من عند ويكي (بخصوص IDF)

يتم دمج عامل تردد المستند العكسي الذي يقلل من وزن المصطلحات التي تحدث بشكل متكرر في مجموعة المستندات وتزيد من وزن المصطلحات التي تحدث.

2) لا ، ليس من المهم أن يكون لكل من الوثيقتين نفس عدد الكلمات.

3) يمكنك أن تجد tf-idf أو cosine-similarity في أي لغة الآن أيام من خلال استدعاء بعض وظيفة مكتبة التعلم الآلي. أنا أفضل بيثون

رمز بيثون للحساب TF-IDF و جيب التمام العلوي ( استخدام 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) قد تكون مهتمًا تحلل القيمة المفرد المقطوعة (SVD)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top