~(一)問題
老師給我們留的作業就是求乙個或多個txt檔案中任意兩行的距離(余弦、jacard、歐式距離都行),txt檔案中每一行是中文英文還是數字都不限。
下面**的我做測試用的資料格式是這樣的:1,前面的1為行號,後面「」裡的內容為真正要計算距離的某一行至,每個值之間用空格隔開。
(二)余弦距離
網上關於余弦距離的計算的也有很多講解的例子,我同學就舉了這樣乙個例子,比如有這樣兩行a和b;a為「他喜歡你」,b為「我喜歡你」。要計算a,b的相似度,需先進行中文分詞,分次後,a變成了「他」 「喜歡」 「你」,b為「我」 「喜歡」 「你」,先求a,b的並集,為,再將a,b轉化為向量來表示,如下圖所示:他喜歡
你我a1
110b
0111
那麼,a對應的向量為(1,1,1,0),b為(0,1,1,1),再根據cosab=(a,b)/|a||b|求得余弦值。
下面的計算a和b的余弦值的函式cosab是沒有考慮任何的優化直接寫的,大家就隨便看看吧:
//計算string1和string2的余弦值
public static double calculate(string s1,string s2)
1,2
2,1
2,2
input中「1」「2」代表行號。
public void map(longwritable ikey, text ivalue, context context) throws ioexception, interruptedexception
} }
3.3 reducer函式
public static class calreducer extends reducer"),
就會報index out of range:-1的錯誤,不是很理解
*/system.out.println("第"+k[i]+"行的資料為:"+data[i]);
if(i==0)
else
i++;
} double dis=calculate(data[0],data[1]);
system.out.println(k[0]+"與"+k[1]+"的相似度為:"+dis);
string t="the similarity of "+k[0]+","+k[1]+"is:";
system.out.println(t+":"+dis);
context.write(new text(t), new text(string.valueof(dis+"\r\n")));
system.out.println("------------------------");
}}
(四)疑問
假如有以下三句話:a;b;c。按照上面的余弦演算法,ab和bc的余弦值是一樣的,但是直觀上感受明顯是a比c離b更近,這種情形會怎麼處理?
---------感謝將這篇部落格看完啦,這是一條結束的分割線:)---------
BM25相似度與余弦相似度的對比
在進一步討論相關度和評分之前,我們會以乙個更高階的話題結束本章節的內容 可插拔的相似度演算法 pluggable similarity algorithms elasticsearch 將 實用評分演算法 作為預設相似度演算法,它也能夠支援其他的一些演算法,這些演算法可以參考 相似度模組 文件。能與...
(資料探勘 入門 2)相似度衡量的方法
主要內容 1 距離度量 2 皮爾遜關係係數 3 cosine相似度 4 方法的選擇 距離度量是最簡單的衡量相似度的方法,公式如下 當r 1時,為曼哈頓距離 manhattan distance 當r 2時,為歐幾里得距離 euclidean distance 優點 簡單 缺點 當資料某些屬性或特徵缺...
48 相似度為 K 的字串
題目描述 如果可以通過將 a 中的兩個小寫字母精確地交換位置 k 次得到與 b 相等的字串,我們稱字串 a 和 b 的相似度為 k k 為非負整數 給定兩個字母異位詞 a 和 b 返回 a 和 b 的相似度 k 的最小值。示例 1 輸入 a ab b ba 輸出 1 示例 2 輸入 a abc b ...