達觀文本指紋算法和系統簡述

1. 文本指紋介紹

互聯網網頁存在大量的重複內容網頁,不管對於搜索引擎的網頁去重和過濾、新聞小說等內容網站的內容反盜版和追蹤,仍是社交媒體等文本去重和聚類,都須要對網頁或者文本進行去重和過濾。redis

最簡單的文本類似性計算方法能夠利用空間向量模型,計算分詞後的文本的特徵向量的類似性,這種方法存在效率的嚴重弊端,沒法針對海量的文本進行兩兩的類似性判斷。模仿生物學指紋的特色,對每一個文本構造一個指紋,來做爲該文本的標識,從形式上來看指紋通常爲固定長度較短的字符串,相同指紋的文本能夠認爲是相同文本。算法

最簡單的指紋構造方式就是計算文本的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.1 simhash算法示意圖

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的最小哈希值。

圖2.2 最小簽名矩陣生成示意圖

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. 內容型網頁文本指紋算法

本節將給出咱們在對內容型網頁(小說、新聞等)去重任務中總結出來的算法和實踐經驗,特別在當前內容版權日益受到重視和保護的背景下,對於內容版權方來講,如何從網絡上發現和追蹤侵權和盜版行爲日益重要。

從前文能夠看出,指紋識別算法是實現指紋識別的關鍵,它直接決定了識別率的高低,是指紋識別技術的核心。特別是相似新聞類、小說類網頁在轉載或者盜版過程當中,文字的個數、順序上通常都保持一致,固然不排除個別字錯誤或者少一個字的狀況。

指紋生成的過程主要包括將文本所有轉換成拼音、截取每一個字拼音的首字母、統計該粒度內字母的頻率分佈、經過和參考系比較將結果進行歸一化、按字母序將數字表徵轉換成數字。


圖3.1 指紋生成算法

算法描述:
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所示。其中存儲層包括匹配結果信息庫、網頁庫以及指紋庫。

圖4.1 指紋追蹤系統模塊圖

1) 爬蟲系統

爬蟲系統從目的上看主要在於抓取互聯網上的特定領域的網頁(如新聞類網頁),爬蟲系統是原始數據的惟一來源,只有經過爬蟲系統才能從浩瀚的互聯網中抓取類似的網頁內容。爬蟲系統須要擁有較高的抓取能力和反爬取能力,爲整個系統提供大量的待檢測頁面。

2) 指紋存儲模塊

指紋存儲模塊計算母體(海量文本)的指紋,指紋能夠理解爲一行文本的向量表示,本系統的指紋存儲系統採用mongo DB進行存儲。

3) 指紋生成模塊

指紋生成模塊的輸入是一行文本,其輸出爲該文本的指紋表示,爲了達到較高的對比準確率,一個好的指紋生成系統相當重要。

4) 指紋查詢和比對模塊

指紋庫中存儲着大量的母體指紋,對於某一文本,指紋查詢和比對模塊要快速的判斷該文本是否在母體庫中存在重複。

5) 數據分析

數據分析系統須要對大量的文本及其對比結果進行統計數據分析。

6) 後臺管理平臺

提供數據分析的展現,並提供用戶使用查詢和輸出分析報告等。

數據存儲模塊

1) 網頁庫

主要存放爬蟲系統抓取的網頁信息、站點信息,本系統網頁庫採用mongo DB。

2) 指紋庫

主要存放母體指紋,本系統採用mongo DB存放指紋。爲了加快指紋的查詢和比對,本系統採用redis來對指紋創建索引,加快匹配速度。

3) 匹配信息庫

存儲指紋匹配結果, 包括待匹配的兩個指紋、 原始網頁id、 匹配類似度等。

4.2 系統架構

圖4.2 系統架構圖

4.3 系統處理流程

本系統的處理流程如圖6所示,系統支持天天自動化從母體庫中調度新的任務進行去重操做。

圖4.3 系統流程圖

5. 總結

對於網頁去重、內容盜版追蹤、內容聚類等應用來講,指紋模塊都是極其重要的模塊。本文介紹了一些比較經常使用的指紋算法,包括k-shingle、simhash、minhash;同時介紹了達觀數據自主開發的指紋追蹤系統及其關鍵算法,達觀數據在指紋系統構建和算法方面積累了豐富的經驗,沒有最好的算法,只有合適的算法,在實際的使用過程當中,須要根據具體業務場景,肯定架構和算法。

編者注:

上文選自由達觀研究院編寫而成的《達觀數據技術實踐特刊》,該書集合了當下最熱門的人工智能領域天然語言處理、個性化推薦、垂直搜索引擎三大方向的技術實踐總結,融合了達觀技術團隊在服務華爲、中興、招行、平安、京東雲等不一樣行業上百家企業後的技術感悟,是國內第一本系統介紹NLP、深度學習等AI技術實踐應用的電子刊,歡迎各位技術愛好者前往下載

相關文章
相關標籤/搜索