网页去重||SimHash(高效的文本相似度去重算法)——适合大批量文档的相似度计算
網頁去重
之前我們對下載的url地址進行了去重操作,避免同樣的url下載多次。其實不光url需要去重,我們對下載的內容也需要去重。
在網上我們可以找到許多內容相似的文章。但是實際我們只需要其中一個即可,同樣的內容沒有必要下載多次,那么如何進行去重就需要進行處理了
去重方案介紹
指紋碼對比
最常見的去重方案是生成文檔的指紋門。例如對一篇文章進行MD5加密生成一個字符串,我們可以認為這是文章的指紋碼,再和其他的文章指紋碼對比,一致則說明文章重復。
但是這種方式是完全一致則是重復的,如果文章只是多了幾個標點符號,那仍舊被認為是重復的,這種方式并不合理。
BloomFilter
這種方式就是我們之前對url進行去重的方式,使用在這里的話,也是對文章進行計算得到一個數,再進行對比,缺點和方法1是一樣的,如果只有一點點不一樣,也會認為不重復,這種方式不合理。
KMP算法
KMP算法是一種改進的字符串匹配算法。KMP算法的關鍵是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數以達到快速匹配的目的。能夠找到兩個文章有哪些是一樣的,哪些不一樣。
這種方式能夠解決前面兩個方式的“只要一點不一樣就是不重復”的問題。但是它的時空復雜度太高了,不適合大數據量的重復比對。
還有一些其他的去重方式:最長公共子串、后綴數組、字典樹、DFA等等,但是這些方式的空復雜度并不適合數據量較大的工業應用場景。我們需要找到一款性能高速度快,能夠進行相似度對比的去重方案
Google 的 simhash 算法產生的簽名,可以滿足上述要求。這個算法并不深奧,比較容易理解。這種算法也是目前Google搜索引擎所目前所使用的網頁去重算法。
SimHash
???????流程介紹
simhash是由 Charikar 在2002年提出來的,為了便于理解盡量不使用數學公式,分為這幾步:
1、分詞,把需要判斷文本分詞形成這個文章的特征單詞。
2、hash,通過hash算法把每個詞變成hash值,比如“美國”通過hash算法計算為 100101,“51區”通過hash算法計算為 101011。這樣我們的字符串就變成了一串串數字。
3、加權,通過 2步驟的hash生成結果,需要按照單詞的權重形成加權數字串,“美國”的hash值為“100101”,通過加權計算為“4 -4 -4 4 -4 4”
“51區”計算為 “ 5 -5 5 -5 5 5”。
4、合并,把上面各個單詞算出來的序列值累加,變成只有一個序列串。
?“美國”的 “4 -4 -4 4 -4 4”,“51區”的 “ 5 -5 5 -5 5 5”
把每一位進行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5”à“9 -9 1 -1 1 9”
5、降維,把算出來的 “9 -9 1 -1 1 9”變成 0 1 串,形成最終的simhash簽名。
???????簽名距離計算
我們把庫里的文本都轉換為simhash簽名,并轉換為long類型存儲,空間大大減少。現在我們雖然解決了空間,但是如何計算兩個simhash的相似度呢?
我們通過海明距離(Hamming distance)就可以計算出兩個simhash到底相似不相似。兩個simhash對應二進制(01串)取值不同的數量稱為這兩個simhash的海明距離。
舉例如下: 10101 和 00110 從第一位開始依次有第一位、第四、第五位不同,則海明距離為3。對于二進制字符串的a和b,海明距離為等于在a XOR b運算結果中1的個數(普遍算法)。
總結
以上是生活随笔為你收集整理的网页去重||SimHash(高效的文本相似度去重算法)——适合大批量文档的相似度计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定时任务 ||
- 下一篇: 正态分布||方差、均值的概念