新闻排重方案设计

 
背景
  
 
  提高产品体验,节省用户感知度。——想一想,若是看到一堆类似性很高的新闻,对于用户的留存会有很大的影响。
 
 
技术方案一、信息指纹算法
  
  思路:为每一个网页计算出一组信息指纹(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和海明距离

短文本合并重复(去重)的简单有效作法

海明距离查询方案

 


 

推荐
 
 
 
相关文章
相关标签/搜索