hashset去重原理_基于simhash的文本去重原理
互聯網網頁存在著大量重復內容,必須有一套高效的去重算法,否則爬蟲將做非常多的無用功,工作時效性無法得到保證,更重要的是用戶體驗也不好。業界關于文本指紋去重的算法眾多,如 k-shingle 算法、google 提出的simhash 算法、Minhash 算法、百度top k 最長句子簽名算法等等,本文主要介紹simhash算法以及python應用.
simhash
- simhash 與傳統hash 的區別
傳統的Hash算法只負責將原始內容盡量均勻隨機地映射為一個簽名值,原理上僅相當于偽隨機數產生算法。傳統的hash算法產生的兩個簽名,如果原始內容在一定概率下是相等的;如果不相等,除了說明原始內容不相等外,不提供任何信息,因為即使原始內容只相差一個字節,所產生的簽名也很可能差別很大。所以傳統的Hash是無法在簽名的維度上來衡量原內容的相似度,而SimHash本身屬于一種局部敏感哈希算法,它產生的hash簽名在一定程度上可以表征原內容的相似度。
我們主要解決的是文本相似度計算,我們降維生成hash簽名也是用于這個目的。看到這里估計大家就明白了,我們使用的simhash就算把文章中的字符串變成 01 串也還是可以用于計算相似度的,而傳統的hash卻不行。我們可以來做個測試,兩個相差只有一個字符的文本串,“你媽媽喊你回家吃飯哦” 和 “你媽媽叫你回家吃飯啦”。
通過simhash計算結果為:
1000010010101101111111100000101011010001001111100001001011001011
1000010010101101011111100000101011010001001111100001101010001011
通過傳統hash計算為:
0001000001100110100111011011110
1010010001111111110010110011101
大家可以看得出來,相似的文本只有部分 01 串變化了,而普通的hash卻不能做到,這個就是局部敏感哈希的魅力。
- simhash簡介
simhash 是 google 用來處理海量文本去重的算法。 simhash 可以將一個文檔轉換成一個 64 位的字節,暫且稱之為特征字。判斷文檔是否重復,只需要判斷文檔特征字之間的漢明距離。根據經驗,一般當兩個文檔特征字之間的漢明距離小于 3, 就可以判定兩個文檔相似。
主要步驟:在新拿到文本之后需要先進行分詞,這是因為需要挑出TopN個詞來表征這篇文本,并且分詞的權重不一樣,可以使用相應數據集的tf-idf值作為分詞的權重,這樣就分成了帶權重的分詞結果。
之后對所有分詞進行哈希運算獲取二值化的hash結果,再將權重與哈希值相乘,獲得帶權重的哈希值,最后進行累加以及二值化處理.
- 分詞
使用分詞手段將文本分割成關鍵詞的特征向量,分詞方法有很多一般都是實詞,也就是把停用詞等都去掉之后的部分,使用者可以根據自己的需求選擇.最后形成去掉噪音詞的單詞序列并為每個詞加上權重. 例如:
行者AI 專注 于 游戲 領域 多年 AI技術 積淀 一站式 提供 文本 圖片 音視頻 內容 審核 游戲AI 以及 數據 平臺 服務目前的詞只是進行了分割,但是詞與詞含有的信息量是不一樣的,比如行者AI 游戲 審核 這三個詞就比 專注 服務 以及更能表達文本的主旨含義,這也就是所謂信息熵的概念。
為此我們還需要設定特征詞的權重,簡單一點的可以使用絕對詞頻來表示,也就是某個關鍵詞出現的次數,但是事實上出現次數少的所含有的信息量可能更多.總之需要選擇一種加權方法,否則效果會打折扣。
- 哈希和權重化
前面我們使用分詞方法和權重分配將文本就分割成若干個帶權重的實詞,比如權重使用1-5的數字表示,1最低5最高
行者AI(5) 專注(2) 于(1) 游戲(3) 領域(1) ......對各個特征詞進行二值化哈希值計算, 再將所有的哈希值累加,最后將累加結果二值化.
- 漢明距離
谷歌經過工程驗證認為當兩個64bit的二值化simhash值的漢明距離超過3則認為不相似,所以判重問題就轉換為求兩個哈希值的漢明距離問題。
- python 實現
pip 源中有數種 simhash 的實現,simhash,使用起來十分方便,直接使用 pip 就可以安裝
pip install simhash使用例子
from simhash import Simhashdef 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 similarif __name__ == '__main__': text1 = "行者AI專注于游戲領域,多年的AI技術積淀,一站式提供文本、圖片、音/視頻內容審核,游戲AI以及數據平臺服務"text2 = "行者AI專注于游戲領域,多年的AI技術積淀,二站式提供文本、圖片、音 視頻內容審核,游戲AI以及數據平臺服務"similar = simhash_demo(text1, text2) print(similar)PS:
我們是行者AI,我們在“AI+游戲”中不斷前行。
如果你也對游戲感興趣,對AI充滿好奇,那就快來加入我們(contact@xingzhe.ai)。
總結
以上是生活随笔為你收集整理的hashset去重原理_基于simhash的文本去重原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 70平米简装多少钱啊?
- 下一篇: c语言程序源代码_程序的编译、链接和执行