文字去重之MinHash演算法

2021-07-10 06:25:06 字數 2577 閱讀 7958

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 卓爾防線繼續傷筋動骨 隊長梅方出場再補漏說起來卓...