simhash&hamming distince
simhash 是一種長文字的查重演算法
SimHash本身屬於一種區域性敏感hash,其主要思想是降維,將高維的特徵向量轉化(加權)成低位的hash,透過算出兩個海明距離來確定兩篇文章的相似度,海明距離越小,相似度越低,一般海明距離為3就代表兩篇文章相同。
simhash的演算法具體分為5個步驟:分詞、hash、加權、合併、降維
simhash長文字查重演算法原理與實戰-CSDN部落格
在實際使用過程中,我們可以使用simhash 分塊來操作,假設對64位的SimHash,查詢海明距離在3以內的所有簽名。可以把64位的二進位制簽名均分成4塊,每塊16位。根據鴿巢原理(也稱抽屜原理,見組合數學),如果兩個簽名的海明距離在3以內,它們必有一塊完全相同。
侷限
對海明距離敏感度較低:
SimHash主要依賴於海明距離來衡量相似度,但對於一些文件的微小變化,海明距離可能無法充分反映實際的相似度變化。例如,一些文件內容變化較小,但其SimHash值的海明距離可能較大,導致無法識別為相似文件。
對區域性性敏感度較低:
SimHash是一種全域性雜湊演算法,它對文件中的區域性變化(例如插入或刪除某段文字)不敏感。也就是說,如果文件的區域性變化較大,SimHash可能會產生較大的雜湊值變化,影響相似度判斷。
維度限制:
SimHash通常將文件對映到固定長度的二進位制向量(如64位或128位)。這種固定長度限制了演算法的表達能力,可能無法捕捉到非常細微的文件差異。
碰撞問題:
儘管SimHash在設計上減少了雜湊碰撞的可能性,但對於非常大的文件集合,仍然可能出現不同文件對映到相同SimHash值的情況,導致誤判。
權重忽略:
在生成SimHash值時,通常會對文件中的特徵詞賦予一定的權重。但這種權重的設定是全域性的,無法針對特定文件進行細緻的調整,可能導致某些關鍵特徵被忽略。
適用範圍有限:
SimHash主要適用於文字相似度計算,對於影像、音訊等其他型別的資料,其效果可能不如專門設計的雜湊演算法(如影像雜湊、音訊指紋)好。
SimHash處理短文字內容準確率往往不能得到保證。由於simhash是區域性敏感的hash,其可能不適合做這種短標題的重複度判斷,會存在一定的誤差,當文字內容較長時,使用SimHash準確率很高(即文字越長判斷的準確率越高)。在處理小於500字的短文字時,simhash的表現並不是很好,所以在使用simhash前一定要注意這個細節。
SimHash在大規模文字去重和相似文件檢測方面仍然是一種高效且實用的演算法
場景
- 文字去重
- 內容推薦
- 版本控制、變更檢測
- 網頁去重
- ……
例項 重複推薦
設計方案:
系統架構
- 資料預處理模組:
- 文字清洗:對文章進行預處理,包括去除HTML標籤、標點符號、停用詞等。
- 特徵提取:提取文章的關鍵詞或特徵詞,並計算詞頻。
- SimHash生成模組:
- SimHash計算:基於特徵詞生成每篇文章的SimHash值。
- 雜湊儲存和索引模組:
- 分塊儲存:將生成的SimHash值分塊儲存,以便快速查詢和比對(例如將64位SimHash分成4個16位的塊)。
- 倒排索引:構建倒排索引,將SimHash塊與文章ID關聯起來,方便快速查詢相似文章。
- 相似度檢測模組:
- 海明距離計算:在推薦新文章時,計算新文章的SimHash值,並透過雜湊索引查詢海明距離在閾值範圍內的文章。
- 去重策略:根據海明距離和設定的相似度閾值,過濾掉相似度過高的文章,避免推薦重複內容。
- 推薦引擎模組:
- 個性化推薦:結合使用者的興趣和歷史瀏覽記錄,推薦與使用者興趣相似但不重複的文章。
- 實時更新:定期更新SimHash值和索引,以確保新發布的文章能夠及時參與推薦。
具體流程
-
文章入庫:
-
每當有新文章釋出時,進行資料預處理和特徵詞提取,並根據特徵詞和其權重生成生成該文章的SimHash值。
-
將SimHash值分塊並儲存到雜湊表中,同時更新倒排索引。(可以藉助redis :使用Redis的雜湊(Hash)結構儲存文章ID和SimHash對映;使用Redis的集合(Set)結構儲存每個SimHash塊對應的文章ID列表。)
(正排索引用於快速獲取文件的SimHash值及其相關資訊;倒排索引用於根據SimHash分塊快速查詢可能相似的文件ID列表。)
-
-
去重檢測:
- 使用者請求推薦時,系統首先生成新文章的SimHash值。
(透過分塊查詢候選文件,然後計算海明距離以篩選出真正相似的文件)
- 使用倒排索引查詢與新文章相似的文章,計算海明距離。
- 過濾掉海明距離在閾值範圍內的文章,避免推薦重複內容。
-
個性化推薦:
- 基於使用者的瀏覽歷史和興趣模型,篩選符合使用者興趣的文章。
- 在去重檢測後,從剩餘的文章中挑選出最符合使用者興趣的文章進行推薦。