simhash的原理

轉自:https://blog.csdn.net/madujin/article/details/53152619
原理:

simhash是一種局部敏感hash。我們都知道什麼是hash。那什麼叫局部敏感呢,假定A、B具有一定的相似性,在hash之後,仍然能保持這種相似性,就稱之爲局部敏感hash。

在上文中,我們得到一個文檔的關鍵詞,取得一篇文章關鍵詞集合,又會降低對比效率,我們可以通過hash的方法,把上述得到的關鍵詞集合hash成一串二進制,這樣我們直接對比二進制數,看其相似性就可以得到兩篇文檔的相似性,在查看相似性的時候我們採用海明距離,即在對比二進制的時候,我們看其有多少位不同,就稱海明距離爲多少。在這裏,我是將文章simhash得到一串64位的二進制,一般取海明距離爲3作爲閾值,即在64位二進制中,只有三位不同,我們就認爲兩個文檔是相似的。當然了,這裏可以根據自己的需求來設置閾值。

就這樣,我們把一篇文檔用一個二進制代表了,也就是把一個文檔hash之後得到一串二進制數的算法,稱這個hash爲simhash。

具體simhash步驟如下:

(1)將文檔分詞,取一個文章的TF-IDF權重最高的前20個詞(feature)和權重(weight)。即一篇文檔得到一個長度爲20的(feature:weight)的集合。

(2)對其中的詞(feature),進行普通的哈希之後得到一個64爲的二進制,得到長度爲20的(hash : weight)的集合。

(3)根據(2)中得到一串二進制數(hash)中相應位置是1是0,對相應位置取正值weight和負值weight。例如一個詞進過(2)得到(010111:5)進過步驟(3)之後可以得到列表[-5,5,-5,5,5,5],即對一個文檔,我們可以得到20個長度爲64的列表[weight,-weight…weight]。

(4)對(3)中20個列表進行列向累加得到一個列表。如[-5,5,-5,5,5,5]、[-3,-3,-3,3,-3,3]、[1,-1,-1,1,1,1]進行列向累加得到[-7,1,-9,9,3,9],這樣,我們對一個文檔得到,一個長度爲64的列表。

(5)對(4)中得到的列表中每個值進行判斷,當爲負值的時候去0,正值取1。例如,[-7,1,-9,9,3,9]得到010111,這樣,我們就得到一個文檔的simhash值了。

(6)計算相似性。連個simhash取異或,看其中1的個數是否超過3。超過3則判定爲不相似,小於等於3則判定爲相似。
https://img-blog.csdn.net/20161114000908955

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章