基於simhash的文字去重原理

2022-06-14 08:21:12 字數 2991 閱讀 9235

simhash 是 google 用來處理海量文字去重的演算法。 simhash 可以將乙個文件轉換成乙個 64 位的位元組,暫且稱之為特徵字。判斷文件是否重複,只需要判斷文件特徵字之間的漢明距離。根據經驗,一般當兩個文件特徵字之間的漢明距離小於 3, 就可以判定兩個文件相似。

傳統的hash演算法只負責將原始內容盡量均勻隨機地對映為乙個簽名值,原理上僅相當於偽隨機數產生演算法。傳統的hash演算法產生的兩個簽名,如果原始內容在一定概率下是相等的;如果不相等,除了說明原始內容不相等外,不再提供任何資訊,因為即使原始內容只相差乙個位元組,所產生的簽名也很可能差別很大。所以傳統的hash是無法在簽名的維度上來衡量原內容的相似度,而simhash本身屬於一種區域性敏感雜湊演算法,它產生的hash簽名在一定程度上可以表徵原內容的相似度。

我們主要解決的是文字相似度計算,要比較的是兩個文章是否相識,當然我們降維生成了hash簽名也是用於這個目的。看到這裡估計大家就明白了,我們使用的simhash就算把文章中的字串變成 01 串也還是可以用於計算相似度的,而傳統的hash卻不行。我們可以來做個測試,兩個相差只有乙個字元的文字串,「你媽媽喊你回家吃飯哦」 和 「你媽媽叫你回家吃飯啦」。

通過simhash計算結果為:

1000010010101101111111100000101011010001001111100001001011001011

1000010010101101011111100000101011010001001111100001101010001011

通過傳統hash計算為:

大家可以看得出來,相似的文字只有部分 01 串變化了,而普通的hash卻不能做到,這個就是區域性敏感雜湊的魅力。

在新拿到文字之後需要先進行分詞,這是因為需要挑出topn個詞來表徵這篇文字,並且分詞的權重不一樣,可以使用相應資料集的tf-idf值作為分詞的權重,這樣就分成了帶權重的分詞結果。

之後對所有分詞進行雜湊運算獲取二值化的hash結果,再將權重與雜湊值相乘,獲得帶權重的雜湊值,最後進行累加以及二值化處理。

2.1 分詞

目前的詞只是進行了分割,但是詞與詞含有的資訊量是不一樣的,比如行者ai 遊戲 審核這三個詞就比專注 服務 以及更能表達文字的主旨含義,這也就是所謂資訊熵的概念。

2.2 雜湊和權重化

前面我們使用分詞方法和權重分配將文字就分割成若干個帶權重的實詞,比如權重使用1-5的數字表示,1最低5最高。

對各個特徵詞進行二值化雜湊值計算, 再將所有的雜湊值累加,最後將累加結果二值化。

2.3 漢明距離

在資訊理論中,兩個等長字串之間的漢明距離(英語:hamming distance)是兩個字串對應位置的不同字元的個數。換句話說,它就是將乙個字串變換成另外乙個字串所需要替換的字元個數。

漢明重量是字串相對於同樣長度的零字串的漢明距離,也就是說,它是字串中非零的元素個數:對於二進位制字串來說,就是1的個數,所以11101的漢明重量是4。

對於二進位制字串a與b來說,它等於a 異或b後所得二進位制字串中「1」的個數。

漢明距離是以理查德·衛斯里·漢明的名字命名的,漢明在誤差檢測與校正碼的基礎性**中首次引入這個概念。

在通訊中累計定長二進位製字中發生翻轉的錯誤資料位,所以它也被稱為訊號距離。漢明重量分析在包括資訊理論、編碼理論、密碼學等領域都有應用。但是,如果要比較兩個不同長度的字串,不僅要進行替換,而且要進行插入與刪除的運算,在這種場合下,通常使用更加複雜的編輯距離等演算法。

谷歌經過工程驗證認為當兩個64bit的二值化simhash值的漢明距離超過3則認為不相似,所以判重問題就轉換為求兩個雜湊值的漢明距離問題。

pip 源中有數種 simhash 的實現,simhash,使用起來十分方便,直接使用 pip 就可以安裝

pip install simhash
使用例子

from simhash import simhash

def simhash_demo(text1, text2):

"""求兩文字的相似度

:param text1:

:param text2:

:return:

"""a_simhash = simhash(text1)

b_simhash = simhash(text2)

max_hashbit = max(len(bin(a_simhash.value)), (len(bin(b_simhash.value))))

# 漢明距離

distince = a_simhash.distance(b_simhash)

print(distince)

similar = 1 - distince / max_hashbit

return similar

if __name__ == '__main__':

similar = simhash_demo(text1, text2)

print(similar)

ps:我們是行者ai,我們在「ai+遊戲」中不斷前行。如果你也對遊戲感興趣,對ai充滿好奇,那就快來加入我們([email protected])。

基於simhash的短文本去重

usr bin env python coding utf 8 利用simhash進行文字去重 from simhash import simhash,simhashindex import jieba import codecs import datetime import os class du...

文字去重之SimHash演算法

說到文字相似性計算,大家首先想到的應該是使用向量空間模型vsm vector space model 使用vsm計算相似度,先對文字進行分詞,然後建立文字向量,把相似度的計算轉換成某種特徵向量距離的計算,比如余弦角 歐式距離 jaccard相似係數等。這種方法存在很大乙個問題 需要對文字兩兩進行相似...

文字去重之SimHash演算法

說到文字相似性計算,大家首先想到的應該是使用向量空間模型vsm vector space model 使用vsm計算相似度,先對文字進行分詞,然後建立文字向量,把相似度的計算轉換成某種特徵向量距離的計算,比如余弦角 歐式距離 jaccard相似係數等。這種方法存在很大乙個問題 需要對文字兩兩進行相似...