我計算了兩個文檔的tf/idf值。下面是TF/IDF值:餘弦相似度
1.txt
0.0
0.5
2.txt
0.0
0.5
的文件是這樣的:
1.txt = > dog cat
2.txt = > cat elephant
如何使用這些值來計算餘弦相似?
我知道我應該計算點積,然後找到距離併除以它的點積。我如何使用我的值來計算此值?
還有一個問題:重要的是兩個文件應該有相同數量的單詞嗎?
我計算了兩個文檔的tf/idf值。下面是TF/IDF值:餘弦相似度
1.txt
0.0
0.5
2.txt
0.0
0.5
的文件是這樣的:
1.txt = > dog cat
2.txt = > cat elephant
如何使用這些值來計算餘弦相似?
我知道我應該計算點積,然後找到距離併除以它的點積。我如何使用我的值來計算此值?
還有一個問題:重要的是兩個文件應該有相同數量的單詞嗎?
a * b
sim(a,b) =--------
|a|*|b|
A * B是積
一些細節:
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通常具有稀疏表示,您只需存儲非零條目,並且可以更快計算標準和點。
謝謝,但我還對另外一件事感到困惑。我看到有人在網上討論這個問題。我無法理解。我應該計算tf/idf值OR的餘弦相似度嗎?只有idf值或只有tf值????? 我知道PHP,並開始學習Java。但是我很抱歉,我不知道哪個郎。你在這裏使用的代碼?你能不能讓我知道,我會看看那個郎。基本語法。或者,如果你可以使用我的tf/idf值來計算餘弦相似度,它會告訴我如何編寫一個函數... 再次感謝您的回覆! – user238384 2010-01-04 07:00:10
@agazerboy這個示例在python中給出,它應該是非常可讀的。 for i in xrange(n)means for(i = 0; i
請在下面閱讀我的解釋! – user238384 2010-01-04 17:07:18
簡單的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);
}
[匿名用戶評論](http://stackoverflow.com/suggested-edits/237603),這應該是'both.retainAll()'不' removeAll'來獲得交集 – Rup 2012-04-10 12:11:35
1)計算TF-IDF(一般比TF獨好,但完全取決於您的數據集和要求)
從wiki(關於IDF)
結合反文檔頻率因子,可減少文檔集中頻繁出現的術語的權重和 增加了很少發生的條件的權重。
2)不,這兩個文件的單詞數量是不重要的。
3)現在您可以通過調用一些機器學習庫函數在任何語言中找到tf-idf
或cosine-similarity
。我更喜歡蟒蛇
Python代碼來計算tf-idf和cosine-similarity(使用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)
這是不是更適合http://mathoverflow.net /? – 2010-01-04 06:11:59
它的一個信息檢索任務,不是一個純粹的數學人會關心 – 2010-01-04 06:24:33
請停止推薦mathoverflow.net - 這是嚴重的數學問題。 – 2010-01-05 15:45:02