一、背景介绍
在前边的文章中,我们采用的是用google的Doc2Vec模型来识别重复文章的,从线上运行的效果来看,它的准确率是比较高的。当然,这是建立在把所有的文章都当做训练数据来训练Doc2Vec模型的基础上的,它推断出一篇文章的向量之后再去做相似计算的效果是不太好的。况且,训练模型的耗时是比较长的,因此,这种模型的适用性只适合于离线计算文章之间的相似,并不适合实时识别重复文章,由于我们现在的文章内容接入了爬虫,量会比较大,tps也有所要求。因此,我们发现了google使用的另一个工具,它是用于网页去重的算法,即SimHash。
二、SimHash使用
这部分内容我们只介绍SimHash的使用方法,而在后续章节后详细讨论它的原理。
使用SimHash来做重复文章识别的步骤如下:
- 分词。将爬虫源的文章做过简单处理之后进行分词,加入权重
- hash。通过算法将每一个词计算它的hash值
- 加权。对上述hash值进行加权,按照第一步单词的权重
- 合并。将文章的所有单词加权后的值进行累加
- 降维。把上述合并的结果变为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个候选结果,大大减少了海明距离的计算成本
三、压测效果
- tps: 500+
- cpu
- 内存