تشابه جيب التمام
-
22-09-2019 - |
سؤال
قمت بحساب قيم 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)