1. 文本指紋介紹
Web大量上的網頁集合里存在大量的重復內容網頁,無論對於搜索引擎的網頁去重和過濾、新聞小說等內容網站的內容反盜版和追蹤、還是社交媒體等文本去重和聚類,都需要對網頁或者文本進行去重和過濾。
最簡單的文本相似性計算方法可以利用空間向量模型,計算分詞后的文本的特征向量的相似性,這種方法存在效率的嚴重弊端,無法針對海量的文本進行兩兩的相似性判斷。模仿生物學指紋的特點,對每個文本構造一個指紋,來作為該文本的標識,從形式上來看指紋一般為固定長度較短的字符串,相同指紋的文本可以認為是相同文本。
最簡單的指紋構造方式就是計算文本的md5或者sha哈希值,除非輸入相同的文本,否則會發生“雪崩效應”,極小的文本差異通過md5或者sha計算出來的指紋就會不同(發生沖撞的概率極低),那么對於稍加改動的文本,計算出來的指紋也是不一樣。
因此,一個好的指紋應該具備如下特點:
1. 指紋是確定性的,相同的文本的指紋是相同的;
2. 指紋越相似,文本相似性就越高;
3. 指紋生成和匹配效率高。
業界關於文本指紋去重的算法眾多,如k-shingle算法、google提出的simhash算法、Minhash算法、top k最長句子簽名算法等等,本文接下來將簡單介紹各個算法以及指紋系統的基本架構和思路。
2. 常用的指紋算法
2.1 k-shingle算法
shingle在英文中表示相互覆蓋的瓦片。對於一段文本,分詞向量為[w1,w2, w3, w4, … wn], 設k=3,那么該文本的shingle向量表示為[(w1,w2,w3),(w2,w3,w4), (w3,w4,w5), …… (wn-2,wn-1,wn)],計算兩個文本的shingle向量的相似度(jarccard系數)來判斷文本是否重復。由於k-shingle算法的shingle向量空間巨大(特別是k特別大時),相比vsm更加耗費資源,一般業界很少采用這類算法。
2.2 Simhash算法
Simhash是google用來處理海量文本去重的算法,同時也是一種基於LSH(localitysensitive hashing)的算法。簡答來說,和md5和sha哈希算法所不同,局部敏感哈希可以將相似的字符串hash得到相似的hash值,使得相似項會比不相似項更可能的hash到一個桶中,hash到同一個桶中的文檔間成為候選對。這樣就可以以接近線性的時間去解決相似性判斷和去重問題。
simhash算法通過計算每個特征(關鍵詞)的哈希值,並最終合並成一個特征值即指紋。
simhash算法流程
1. 首先基於傳統的IR方法,將文章轉換為一組加權的特征值構成的向量。
2. 初始化一個f維的向量V,其中每一個元素初始值為0。
3. 對於文章的特征向量集中的每一個特征,做如下計算:
a) 利用傳統的hash算法映射到一個f-bit(一般設成32位或者64位)的簽名。對於這個f- bit的簽名,如果簽名的第i位上為1,則對向量V中第i維加上這個特征的權值,否則對向量的第i維減去該特征的權值;
b) 整個特征向量集合迭代上述運算后,根據V中每一維向量的符號來確定生成的f-bit指紋的值,如果V的第i維為正數,則生成f-bit指紋的第i維為1,否則為0。
圖1 simhash算法示意圖
Simhash指紋匹配過程
經過simhash指紋生成算法生成的指紋是一個f位的二進制字符串,如一個32位的指紋,‘101001111100011010100011011011’。對於兩個文本的f位0-1字符串,simhash算法采用hammingdistance來計算兩個指紋之間的相似度,但是對於海量文本,如何從千萬級別(甚至更多)的指紋集合中,找出最多只有k位不同的指紋呢?
一個簡單的思想就是以空間換時間,對於一個32位的指紋來說,將該指紋划分成4段,即4個區間,每個區間8位,如果兩個指紋至多存在3(設k=3)位差異,那么至少有一段的8位是完全相同的,因此可以考慮利用分段來建立索引,來減少需要匹配的候選指紋數量。
Simhash指紋匹配算法
1. 首先對於指紋集合Q構建多個表T1,T2…Tt,每一個表都是采用對應的置換函數π(i)將32-bit的fingerprint中的某p(i)位序列置換換到整個序列的最前面。即每個表存儲都是整個Q的fingerprint的復制置換;
2. 對於給定的F,在每個Ti中進行匹配,尋找所有前pi位與F經過π(i)置換后的前pi位相同的fingerprint。
3. 對於所有在上一步中匹配到的置換后的fingerprint,計算其是否與π(i)(F)至多有k-bit不同。
Simhash算法比較高效,比較適用於對於長文本。
2.3 Minhash算法
Minhash也是一種LSH算法,同時也是一種降維的方法。Minhash算法的基本思想是使用一個隨機的hash函數h(x)對集合A和B中的每個元素進行hash,hmin(A)、hmin(B)分別表示hash后集合A和集合B的最小值,那么P(hmin(A)== hmin(B)) = Jaccard(A, B)。這是minhash算法的核心,其中hmin(A)為哈希函數h(x)對集合A的最小哈希值。
圖: 最小簽名矩陣生成示意圖
Minhash算法采用最小哈希函數族(一組隨機的最小哈希函數)來構建文檔的最小哈希簽名。文檔的最小哈希簽名矩陣是對原始特征矩陣降維的結果。應用過程中,可以使用k個最小函數分別計算出集合的哈希最小值。設hi表示第i個最小hash函數,最小簽名矩陣中列向量為樣本si的最小簽名向量,其中wij表示第j個最小hash函數對樣本i的最小哈希值。
當k小於原始集合的長度(k<< n)時,就相當於對數據降維,類比PCA等降維方法,minhash避免了復雜的矩陣運算。由於最小簽名矩陣中,樣本i,j的某一行或某幾行的子向量的相似度於樣本i,j的jarcarrd距離相等,因此可以對最小簽名矩陣運行行條化策略,經矩陣平均分為b個行條,每個行條由r條組成,當兩個樣本在任意一個行條中的向量相等,即是一個相似性候選對,並檢查文檔是否真正相似或者相等。
關於minhash的原理和推導,以及在大量文本及高維特征下如何快速進行最小簽名矩陣的構建操作可以參考https://en.wikipedia.org/wiki/MinHash及《大數據 互聯網大規模數據挖掘與分布式處理》。(數學的奧妙就在於此)
經過minhash降維后的文本向量,從概率上保證了兩個向量的相似度和降維前是一樣的,結合LSH技術構建候選對可以大大減少空間規模,加快查找速度。
3. 內容型網頁文本指紋算法
從前文可以看出,指紋識別算法是實現指紋識別的關鍵,它直接決定了識別率的高低,是指紋識別技術的核心。特別是類似新聞類、小說類網頁在轉載或者盜版過程中,文字的個數、順序上一般都保持一致,當然不排除個別字錯誤或者少一個字的情況。
指紋生成的過程主要包括將文本全部轉換成拼音、截取每個字拼音的首字母、統計該粒度內字母的頻率分布、通過和參考系比較,將結果進行歸一化、按字母序,將數字表征轉換成數字。
圖2 指紋生成算法
算法描述:
1. 轉拼音:可以解決字符集編碼不一致的問題,可以利用程度的英文指紋算法,減小分布空間,同時可以解決同音字替代問題;
2. 截取拼音首字:減小存儲長度和分布空間(26個字母);
3. 提取首字母頻率:選擇多少字來計算指紋,統計頻率分布。需要設置顆粒度的大小(分段大小)以及重疊率。
大粒度容錯性高,但是匹配率低;小粒度容錯性低,但是誤報率高且敏感度高。
重疊率是設置指紋計算片段移動的窗口大小:
假設拼音內容長為2n,顆粒長度為n,重疊率為50%,則需要計算的指紋片段分別為[1-n],[n/2,3*n/2],[n,2n]
4. 減去參考系:頻率減去參考系
5. 歸一化:將每個字母的數字特征歸一化到一個閉區間內,如[0,9],按照字母順序連接數字特征,變成一個數字,即指紋。
• 若空間為[0,9],即一個20位的整數,2^64,需要 8 byte
• 若空間為[0,7],可用一個20位的8進制數,8^20,需要 8 byte
• 若空間為[0,3],只需要 4^20, 共40 bit, 5 byte
• 若空間為[0,1],需要2^20,20 bit,3 byte
歸一化過程的算法步驟如下,假設顆粒長度為m:
輸入:片段頻率集合S:[s1,s2,s3,…sn]
參數:指紋集合dnas:[]
計算基數radix:=pow(2, log(m)/log(2) )
FOR 片段頻率s IN S
修正頻率,每個頻率值:=max(頻率,基數)
指紋dna:=空串
FOR tmp IN s[m-5:m]
將tmp轉換成整數,基數為radix
將tmp轉換成字符串,基數為radix
dna:=dna連接tmp
dnas:=dnas添加dna
END
輸出:指紋集合dnas
4. 指紋系統結構
指紋追蹤系統主要由爬蟲系統、指紋生成系統、指紋存儲、指紋查詢和比對、數據分析、后台管理系統等幾個主要模塊構成。
圖3 指紋追蹤系統模塊圖
圖4 系統架構圖
圖5 系統流程圖
5. 總結
對於網頁去重、內容盜版追蹤、內容聚類等應用來說,指紋模塊都是極其重要的模塊。本文介紹了一些比較常用的指紋算法,包括k-shingle、simhash、minhash;同時介紹了指紋追蹤系統及其關鍵算法,在實際的使用過程中,需要根據具體業務場景,確定具體的架構設計和應用算法。
————————————————
版權聲明:本文為CSDN博主「wh_springer」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wh_springer/article/details/52177236