初學hadoop之一 相似度計算(余弦距離)

2021-07-12 03:48:53 字數 1716 閱讀 3618

~(一)問題

老師給我們留的作業就是求乙個或多個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 ...