1.千亿级数据量下,找两句话相似度,如何降低复杂度?
通过SimHash算法来实现海量文本的相似度计算与快速去重,通过海明距离,计算相似度,然后再通过抽屉原理提升效率。
SimHash 是 Google 在2007年发表的论文《Detecting Near-Duplicates for Web Crawling 》中提到的一种指纹生成算法或者叫指纹提取算法,被 Google 广泛应用在亿级的网页去重的 Job 中,其主要思想是降维,经过simhash降维后,可能仅仅得到一个长度为32或64位的二进制由01组成的字符串。而一维查询则是非常快速的。
SimHash的工作原理我们这里略过,大家可以简单理解为:我们可以利用SimHash算法为每一个网页/文章生成一个长度为32或64位的二进制由01组成的字符串(向量指纹)。
两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。
针对海量数据的去重效率,我们可以将64位指纹,切分为4份16位的数据块,根据抽屉原理在海明距离为3的情况,如果两个文档相似,那么它必有一个块的数据是相等的。
那也就是说,我们可以以某文本的 SimHash 的每个16位截断指纹为 Key,Value 为 Key 相等时文本的 SimHash 集合存入 K-V 数据库即可,查询时候,精确匹配这个指纹的4个16位截断指纹所对应的4个 SimHash 集合即可。
如此,假设样本库,有2^37 条数据(1375亿数据),假设数据均匀分布,则每个16位(16个01数字随机组成的组合为2^16 个)倒排返回的最大数量为
(2^37) * 4 / (2^16) =8388608个候选结果,4个16位截断索引,总的结果为:4*8388608=33554432,约为3356万,通过
这样一来的降维处理,原来需要比较1375亿次,现在只需要比较3356万次即可得到结果,这样以来大大提升了计算效率。
作者:步闲
链接:https://www.jianshu.com/p/1f1611570586
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。