1. 文字指紋介紹
網際網路網頁存在大量的重複內容網頁,無論對於搜尋引擎的網頁去重和過濾、新聞小說等內容網站的內容反盜版和追蹤,還是社交媒體等文字去重和聚類,都需要對網頁或者文字進行去重和過濾。
最簡單的文字相似性計算方法可以利用空間向量模型,計算分詞後的文字的特徵向量的相似性,這種方法存在效率的嚴重弊端,無法針對海量的文字進行兩兩的相似性判斷。模仿生物學指紋的特點,對每個文字構造一個指紋,來作為該文字的標識,從形式上來看指紋一般為固定長度較短的字串,相同指紋的文字可以認為是相同文字。
最簡單的指紋構造方式就是計算文字的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(locality sensitive hashing)的演算法。簡單來說,和md5和sha雜湊演算法所不同,區域性敏感雜湊可以將相似的字串hash得到相似的hash值,使得相似項會比不相似項更可能的hash到一個桶中,hash到同一個桶中的文件間成為候選對。這樣就可以以接近線性的時間去解決相似性判斷和去重問題。
simhash演算法通過計算每個特徵(關鍵詞)的雜湊值,並最終合併成一個特徵值即指紋。
2.2.1 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。
2.2.2 Simhash指紋匹配過程
經過simhash指紋生成演算法生成的指紋是一個f位的二進位制字串,如一個32位的指紋,‘101001111100011010100011011011’。對於兩個文字的f位0-1字串,simhash演算法採用hamming distance來計算兩個指紋之間的相似度,但是對於海量文字,如何從千萬級別(甚至更多)的指紋集合中,找出最多隻有k位不同的指紋呢?
一個簡單的思想就是以空間換時間,對於一個32位的指紋來說,將該指紋劃分成4段,即4個區間,每個區間8位,如果兩個指紋至多存在3(設k=3)位差異,那麼至少有一段的8位是完全相同的,因此可以考慮利用分段來建立索引,來減少需要匹配的候選指紋數量。
2.2.3 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的原理和推導,以及在大量文字及高維特徵下如何快速進行最小簽名矩陣的構建操作可以參考en.wikipedia.org/wiki/MinHas… 及《大資料網際網路大規模資料探勘與分散式處理》,數學的奧妙就在於此。
經過minhash降維後的文字向量,從概率上保證了兩個向量的相似度和降維前是一樣的,結合LSH技術構建候選對可以大大減少空間規模,加快查詢速度。
3. 內容型網頁文字指紋演算法
本節將給出我們在對內容型網頁(小說、新聞等)去重任務中總結出來的演算法和實踐經驗,特別在當前內容版權日益受到重視和保護的背景下,對於內容版權方來說,如何從網路上發現和追蹤侵權和盜版行為日益重要。
從前文可以看出,指紋識別演算法是實現指紋識別的關鍵,它直接決定了識別率的高低,是指紋識別技術的核心。特別是類似新聞類、小說類網頁在轉載或者盜版過程中,文字的個數、順序上一般都保持一致,當然不排除個別字錯誤或者少一個字的情況。
指紋生成的過程主要包括將文字全部轉換成拼音、擷取每個字拼音的首字母、統計該粒度內字母的頻率分佈、通過和參考系比較將結果進行歸一化、按字母序將數字表徵轉換成數字。
演算法描述:
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:
4. 達觀指紋系統結構
4.1 基本架構
達觀指紋追蹤系統主要由爬蟲系統、指紋生成系統、指紋儲存、指紋查詢和比對、資料分析、後臺管理系統等幾個主要模組構成,如圖4所示。其中儲存層包括匹配結果資訊庫、網頁庫以及指紋庫。
1) 爬蟲系統
爬蟲系統從目的上看主要在於抓取網際網路上的特定領域的網頁(如新聞類網頁),爬蟲系統是原始資料的唯一來源,只有通過爬蟲系統才能從浩瀚的網際網路中抓取相似的網頁內容。爬蟲系統需要擁有較高的抓取能力和反爬取能力,為整個系統提供大量的待檢測頁面。
2) 指紋儲存模組
指紋儲存模組計算母體(海量文字)的指紋,指紋可以理解為一行文字的向量表示,本系統的指紋儲存系統採用mongo DB進行儲存。
3) 指紋生成模組
指紋生成模組的輸入是一行文字,其輸出為該文字的指紋表示,為了達到較高的對比準確率,一個好的指紋生成系統至關重要。
4) 指紋查詢和比對模組
指紋庫中儲存著大量的母體指紋,對於某一文字,指紋查詢和比對模組要快速的判斷該文字是否在母體庫中存在重複。
5) 資料分析
資料分析系統需要對大量的文字及其對比結果進行統計資料分析。
6) 後臺管理平臺
提供資料分析的展示,並提供使用者使用查詢和輸出分析報告等。
資料儲存模組
1) 網頁庫
主要存放爬蟲系統抓取的網頁資訊、站點資訊,本系統網頁庫採用mongo DB。
2) 指紋庫
主要存放母體指紋,本系統採用mongo DB存放指紋。為了加快指紋的查詢和比對,本系統採用redis來對指紋建立索引,加快匹配速度。
3) 匹配資訊庫
儲存指紋匹配結果, 包括待匹配的兩個指紋、 原始網頁id、 匹配相似度等。
4.2 系統架構
4.3 系統處理流程
本系統的處理流程如圖6所示,系統支援每天自動化從母體庫中排程新的任務進行去重操作。
5. 總結
對於網頁去重、內容盜版追蹤、內容聚類等應用來說,指紋模組都是極其重要的模組。本文介紹了一些比較常用的指紋演算法,包括k-shingle、simhash、minhash;同時介紹了達觀資料自主開發的指紋追蹤系統及其關鍵演算法,達觀資料在指紋系統構建和演算法方面積累了豐富的經驗,沒有最好的演算法,只有合適的演算法,在實際的使用過程中,需要根據具體業務場景,確定架構和演算法。
編者注:
上文選自由達觀研究院編寫而成的《達觀資料技術實踐特刊》,該書集合了當下最熱門的人工智慧領域自然語言處理、個性化推薦、垂直搜尋引擎三大方向的技術實踐總結,融合了達觀技術團隊在服務華為、中興、招行、平安、京東雲等不同行業上百家企業後的技術感悟,是國內第一本系統介紹NLP、深度學習等AI技術實踐應用的電子刊,歡迎各位技術愛好者前往下載。