1.概述
跟simhash一樣,minhash也是lsh的一種,可以用來快速估算兩個集合的相似度。minhash由andrei broder提出,最初用於在搜尋引擎中檢測重複網頁。它也可以應用於大規模聚類問題。
2.jaccard index
在介紹minhash之前,我們先介紹下jaccard index。
jaccard index是用來計算相似性,也就是距離的一種度量標準。假如有集合a、b,那麼,
也就是說,集合a,b的jaccard係數等於a,b中共同擁有的元素數與a,b總共擁有的元素數的比例。很顯然,jaccard系數值區間為[0,1]。
3.minhash
先定義幾個符號術語:
h(x): 把x對映成乙個整數的雜湊函式。
hmin(
s):集合s中的元素經過h(x)雜湊後,具有最小雜湊值的元素。
那麼對集合a、b,
hmin(a
) =
hmin(b
)成立的條件是
a ∪ b
中具有最小雜湊值的元素也在
∩ b中。
這裡有乙個
假設,h(x)是乙個
良好的雜湊
函式,它具有很好的均勻性,能夠把不同元素對映成不同的整數。
所以有,pr[
hmin(a
) =
hmin(b
)] = j(
a,b),即集合a和b的相似度為集合a、b經
過hash後最小哈
希值相
等的概率。
有了上面的結論,我們便可以根據minhash來計算兩個集合的相似度了。一般有兩種方法:
第一種:使用多個hash函式
為了計算集合a、b具有最小雜湊值的概率,我們可以選擇一定數量的hash函式,比如k個。然後用這k個hash函式分別對集合a、b求雜湊值,對
每個集合都得到k個最小值。比如min(a)k=,
min(b)k=。
那麼,集合a、b的相似度為|
min(a)k
∩ min(b)k
| / |
min(a)k
∪ min(b)k
|,及min(a)k和
min(b)k中相同元素個數與總的元素個數的比例。
第二種:使用單個hash函式
第一種方法有乙個很明顯的缺陷,那就是計算複雜度高。使用單個hash函式是怎麼解決這個問題的呢?請看:
前面我們定義過 h
min(s)為集合s中具有最小雜湊值的乙個元素,那麼我們也可以定義h
mink(s)為集合
s中具有最小雜湊值的k
個元素。這樣一來,
我們就只需要對每個集合求一次雜湊,然後取最小的k個元素。計算兩個集合a、b的相似度,
就是集合a中最小的k個元素與集合b中最小的k個元素
的交集個數與並集個數的比例。
看完上面的,你應該大概清楚minhash是怎麼回事了。但是,minhash的好處到底在**呢?計算兩篇文件的相似度,就直接統計相同的詞數和總的
次數,然後就jaccard index不就可以了嗎?
對,如果僅僅對兩篇文件計算相似度而言,minhash沒有什麼優勢,反而把問題複雜化了。但是如果有海量的文件需要求相似度,比如在推薦系統
中計算物品的相似度,如果兩兩計算相似度,計算量過於龐大。下面我們看看minhash是怎麼解決問題的。
比如元素集合,其中s1=,s2=,s3=,s4=
那麼這四個集合的矩陣表示為:
如果要對某乙個集合做minhash,則可以從上面矩陣的任意乙個行排列中選取乙個,然後minhash值是排列中第乙個1的行號。
例如,對上述矩陣,我們選取排列
beadc,那麼對應的矩陣為
那麼,
h(s1) = a,同樣可以得到h(s2) = c, h(s3) = b, h(s4) = a。
如果只對其中乙個行排列做minhash,不用說,計算相似度當然是不可靠的。因此,我們要選擇多個行排列來計算minhash,最後根據jaccard index公式
來計算相似度。但是求排列本身的複雜度比較高,特別是針對很大的矩陣來說。因此,我們可以設計乙個隨機雜湊函式去模擬排列,能夠把行號0~n隨機對映到0~n上。比如
h(0)=100,h(1)=3...。當然,衝突是不可避免的,衝突後可以二次雜湊。並且如果選取的隨機雜湊函式夠均勻,並且當n較大時,衝突發生的概率還是比較低的。關於隨機排列演算法可以參考這篇文章:隨機排列生成演算法的一些隨想
說到這裡,只是討論了用minhash對海量文件求相似度的具體過程,但是它到底是怎麼減少複雜度的呢?
比如有n個文件,每個文件的維度為m,我們可以選取其中k個排列求minhash,由於每個對每個排列而言,minhash把一篇文件對映成乙個整數,所以對k個排列計算minhash就得到k個整數。那麼所求的minhash矩陣為n*k維,而原矩陣為n*m維。n>>m時,計算量就降了下來。
文字去重之SimHash演算法
說到文字相似性計算,大家首先想到的應該是使用向量空間模型vsm vector space model 使用vsm計算相似度,先對文字進行分詞,然後建立文字向量,把相似度的計算轉換成某種特徵向量距離的計算,比如余弦角 歐式距離 jaccard相似係數等。這種方法存在很大乙個問題 需要對文字兩兩進行相似...
文字去重之SimHash演算法
說到文字相似性計算,大家首先想到的應該是使用向量空間模型vsm vector space model 使用vsm計算相似度,先對文字進行分詞,然後建立文字向量,把相似度的計算轉換成某種特徵向量距離的計算,比如余弦角 歐式距離 jaccard相似係數等。這種方法存在很大乙個問題 需要對文字兩兩進行相似...
finger print 文字去重
任何一段資訊文字,都可以對應乙個不太長的隨機數,作為區別它和其它資訊的指紋 fingerprint 只要演算法設計的好,任何兩段資訊的指紋都很難重複,就如同人類的指紋一樣。資訊指紋在加密 資訊壓縮和處理中有著廣泛的應用。string content2 卓爾防線繼續傷筋動骨 隊長梅方出場再補漏說起來卓...