实时重复文章识别——SimHash

一、背景介绍

    在前边的文章中,我们采用的是用google的Doc2Vec模型来识别重复文章的,从线上运行的效果来看,它的准确率是比较高的。当然,这是建立在把所有的文章都当做训练数据来训练Doc2Vec模型的基础上的,它推断出一篇文章的向量之后再去做相似计算的效果是不太好的。况且,训练模型的耗时是比较长的,因此,这种模型的适用性只适合于离线计算文章之间的相似,并不适合实时识别重复文章,由于我们现在的文章内容接入了爬虫,量会比较大,tps也有所要求。因此,我们发现了google使用的另一个工具,它是用于网页去重的算法,即SimHash。

二、SimHash使用

    这部分内容我们只介绍SimHash的使用方法,而在后续章节后详细讨论它的原理。
    使用SimHash来做重复文章识别的步骤如下:

  1. 分词。将爬虫源的文章做过简单处理之后进行分词,加入权重
  2. hash。通过算法将每一个词计算它的hash值
  3. 加权。对上述hash值进行加权,按照第一步单词的权重
  4. 合并。将文章的所有单词加权后的值进行累加
  5. 降维。把上述合并的结果变为0,1的形式。

然后,我们可以通过计算两篇文章的64位simhash值的hamming距离小于等于3来判断它们是否重复(相似)文章,理论依据如下:、

这里写图片描述

整个过程如下图所示:
这里写图片描述

上述就是算法的实现过程,但是实际中,我们还需做进一步的工程处理,我们要考虑实际的性能。因此,我们需要存储4份table,并将64位的simhash code等分成4份;对于每一个输入的code,我们通过精确匹配的方式,查找前16位相同的记录作为候选记录,如下图所示:
这里写图片描述

让我们来总结一下上述算法的实质:
1、将64位的二进制串等分成四块
2、调整上述64位二进制,将任意一块作为前16位,总共有四种组合,生成四份table
3、采用精确匹配的方式查找前16位
4、如果样本库中存有2^34(差不多10亿)的哈希指纹,则每个table返回2^(34-16)=262144个候选结果,大大减少了海明距离的计算成本

三、压测效果

  1. tps: 500+
  2. cpu
    这里写图片描述
  3. 内存
    这里写图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值