新聞排重方案設計

 
背景
  
 
  提高產品體驗,節省用戶感知度。——想一想,若是看到一堆類似性很高的新聞,對於用戶的留存會有很大的影響。
 
 
技術方案一、信息指紋算法
  
  思路:爲每一個網頁計算出一組信息指紋(Fingerprint)。比較兩個網頁相同信息指紋數量,從而判斷內容的重疊性。
 
  步驟:
    1)提取網頁正文信息特徵(一般是一組詞),並進行向量化處理(權重算法:如nf/df)。
    2)取前N個信息特徵,進行MD5哈希,獲得信息指紋。 優勢:算法簡單、工程好落地,不會受大數量問題影響。
 
 
技術方案二、分段簽名算法
 
  算法思路:按規則把網頁切成N段,爲每一段生成信息指紋。若是這N個信息指紋裏面,有M個(閾值)相同, 則認爲二者是複製網頁。
  缺點:小規模比較是很好的算法,對於大規模數據來講,算法複雜度至關高。
 

 
技術方案三、4
 
 
  方案三、基於關鍵詞的複製網頁算法
  方案四、基於句子的方式 算法思路:獲取標點符號左右兩邊各2個漢子或英文做爲特徵,來進行文本表示。
 
 

 
技術方案5   SimHash——最終方案
 
 
   SimHash:局部敏感哈希(locality sensitive hash)
 
  背景介紹:simhash是由 Charikar 在2002年提出來的!
 
  算法思路:主要思想是降維,爲每一個文檔經過hash的方式,生成一個指紋(fingerprint)。
 
  核心思想是將文本類似性問題轉換爲集合的類似性問題!
 
  設計的目的:是讓整個分佈儘量地均勻,形似的內容生成相近的hashcode。——即,hashcode的類似程度要 能直接反應輸入內容的類似程度(因此md5等傳統hash沒法知足需求)。
 
  使用方:Google基於此算法實現網頁文件查重。
 
  優勢:相對傳統文本類似性方法(歐氏距離、海明距離、餘弦角度),解決計算量龐大等問題。
 
  缺點:500字以上效果比較明顯500字之內,效果不是很理想,能夠調整海明距離的n值來調整(3升級爲10)
 
 
 
SimHash算法原理
 
  1)分詞:提取網頁正文信息特徵詞,造成去掉噪音詞(助詞、語氣詞、人稱代詞)的單詞序列,併爲每一個詞加上權重(詞出現次數)。
 
     抽取方式:
       1.1. 剔除全部英文、數字、標點字符
       1.2.分詞,並標註詞性,僅保留實體詞性,如名詞、動詞;(技巧一!)
       1.3.過濾掉經常使用實體詞(經常使用實體詞是經過對歷史銳推訓練而得,即創建本身的中止詞表);(技巧二!)
       1.4.計算保留實體詞的詞頻,並以此爲權重,選擇權重大的詞語做爲標籤;
        1.5.標籤數組長度大於一個閾值(如3),才認爲是有信息量的銳推,不然忽略。(技巧三!)  
     —其餘簡單方案:
       百度大搜的去重算法比較簡單,就是直接找出此文章的最長的n句話,作一遍hash簽名。n通常取3。
      工程實現巨簡單,聽說準確率和召回率都能到達80%以上。
  2)hash及加權:
     對於提取的信息特徵詞進行hash值運算,轉變成bit值,根據每一個位是否爲1,進行權重加減處理。
     權重設定:詞頻+詞位置
  3)合併及降維:每一個單詞的序列值累加,變成只有一個序列串。大於0 記爲1,小於0記爲0.
 
 
 
SimHash算法原理——圖例
 
 

 


 
SimHash 海明 (Hamming)距離
 
  一、海明距離閾值選擇
       模型效果:標題閾值、內容閾值
       距離選擇,考慮因素:除考慮數據效果以外,還得考慮工程查詢效率。
 
  二、提升性能的方式:
       把64爲simHash碼均分爲漢明距離n+1塊,方便後續查找全部臨近simHash碼。
 
 


 
SimHash 海明 (Hamming)距離(一)

 

 第一種是方案是查找待查詢文本的64位simhash code的全部3位之內變化的組合,大約須要四萬屢次的查詢,參考下圖:html

 


 
SimHash 海明 (Hamming)距離(二)

 

第二種方案是預生成庫中全部樣本simhash code的3位變化之內的組合,大約須要佔據4萬多倍的原始空間,參考下圖 git

 

 


 
SimHash 海明 (Hamming)距離1、二方案分析

 

上述兩種方法,或者時間複雜度,或者空間複雜度,其一沒法知足實際的需求。咱們須要一種方法,其時間複雜度優於前者,空間複雜度優於後者。 假設咱們要尋找海明距離3之內的數值,根據抽屜原理,只要咱們將整個64位的二進制串劃分爲4塊,不管如何,匹配的兩個simhash code之間至少有一塊區域是徹底相同的,如圖所示 github

 

 

 


 
SimHash 海明 (Hamming)距離(三)

 

  因爲咱們沒法事先得知徹底相同的是哪一塊區域,所以咱們必須採用存儲多份table的方式。在本例的狀況下,咱們須要存儲4份table,並將64位的simhash code等分紅4份;對於每個輸入的code,咱們經過精確匹配的方式,查找前16位相同的記錄做爲候選記錄,如圖所示:算法

 

 

 

  讓咱們來總結一下上述算法的實質:數組

    一、將64位的二進制串等分紅四塊函數

      二、調整上述64位二進制,將任意一塊做爲前16位,總共有四種組合,生成四份table post

      三、採用精確匹配的方式查找前16位 性能

    四、若是樣本庫中存有2^34(差很少10億)的哈希指紋,則每一個table返回2^(34-16)=262144個候選結果,大大減小了海明距離的計算成本測試

 

  咱們能夠將這種方法拓展成多種配置,不過,請記住,table的數量與每一個table返回的結果呈此消彼長的關係,也就是說,時間效率與空間效率不可兼得! 這就是Google天天所作的,用來識別獲取的網頁是否與它龐大的、數以十億計的網頁庫是否重複。另外,simhash還能夠用於信息聚類、文件壓縮等。url

 

 

  

 

SimHash 算法原理

  

  simhash用於比較大文本,好比500字以上效果都還蠻好,距離小於3的基本都是類似,誤判率也比較低。可是若是咱們處理的是微博信息,最多也就140個字,使用simhash的效果並不那麼理想。看以下圖,在距離爲3時是一個比較折中的點,在距離爲10時效果已經不好了,不過咱們測試短文本不少看起來類似的距離確實爲10。若是使用距離爲3,短文本大量重複信息不會被過濾,若是使用距離爲10,長文本的錯誤率也很是高,如何解決?——採用分段函數!

 

  

 

 

 

SimHash 算法原理——評估結果

  一、dump 一天的新聞數據:

     數據項要求:標題、內容、新聞原始地址。

 

  二、評估指標

     排重準確率(97%): 數據集:排從新聞集

     方式:人工(研發先評估、產品評估)

     召回率(75%):

         數據集:訓練數據集-排從新聞集

         方式:擴大海明距離,再進行人工評估

 

 

SimHash 算法原理——代碼片斷

 

  高效計算二進制序列中1的個數:這個函數來計算的話,時間複雜度是 O(n); 這裏的n默認取值爲3。因而可知仍是蠻高效的。

 

 

 


 
參考資料

 

中文文檔simhash值計算

網頁文本的排重算法介紹

海量數據類似度計算之simhash和海明距離

短文本合併重複(去重)的簡單有效作法

海明距離查詢方案

 


 

推薦
 
 
 
相關文章
相關標籤/搜索