实时重复文章识别——SimHash

一、背景介绍

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

二、SimHash使用

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

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

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

实时重复文章识别——SimHash_第1张图片

整个过程如下图所示:
实时重复文章识别——SimHash_第2张图片

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

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

三、压测效果

  1. tps: 500+
  2. cpu
    实时重复文章识别——SimHash_第4张图片
  3. 内存
    实时重复文章识别——SimHash_第5张图片

你可能感兴趣的:(自然语言处理)