(1)什么是海明距离两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。举例如下:10101和00110从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。

(2)海明距离的几何意义n位的码字可以用n维空间的超立方体的一个顶点来表示。两个码字之间的海明距离就是超立方体两个顶点之间的一条边,而且是这两个顶点之间的最短距离。

(3)海明距离的应用场景用于编码的检错和纠错经过SimHash算法提取来的指纹(Simhash对长文本500字+比较适用,短文本可能偏差较大,具体需要根据实际场景测试),最后使用海明距离,求相似,在google的论文给出的数据中,64位的签名,在海明距离为3的情况下,可认为两篇文档是相似的或者是重复的,当然这个值只是参考值,针对自己的应用可能又不同的测试取值

到这里相似度问题基本解决,但是按这个思路,在海量数据几百亿的数量下,效率问题还是没有解决的,因为数据是不断添加进来的,不可能每来一条数据,都要和全库的数据做一次比较,按照这种思路,处理速度会越来越慢,线性增长。

针对海量数据的去重效率,我们可以将64位指纹,切分为4份16位的数据块,根据抽屉原理在海明距离为3的情况,如果两个文档相似,那么它必有一个块的数据是相等的。

那么数据库是否支持这种高效率的检索呢?

反正PostgreSQL是支持的,通过黑科技smlar插件。

一、需求

二、架构设计

在PostgreSQL中,从海量数据中,搜索海明距离小于N的数据,有多种设计手段。每种方法的能耗比都不一样,读者可以按需选择。

1 暴力计算

1、单机多核并行计算,暴力扫描。采用阿里云RDS PostgreSQL 10提供的多核并行能力,暴力扫描。2、多机多核并行计算,暴力扫描。采用阿里云HybridDB for PostgreSQL提供的多级并行计算能力,暴力扫描。3、利用GPU、FPGA加速暴力运算。PostgreSQL提供了扩展接口,可以利用GPU,FPGA的能力对数据进行计算。4、利用CPU向量计算指令,暴力计算。PostgreSQL提供了扩展接口,可以利用CPU向量计算指令的能力加速计算。

2 索引

索引是高效的做法,例如PostgreSQL smlar插件,在阿里的导购平台就有使用,用于实时导购文的海量相似度查询。如果要让smlar加速海明距离的搜索,需要采用更科学的方法,比如切片。直接使用位置,会有问题,因为smlar的第一道工序是块级收敛,而海明码是bit64的编码,在一个数据块中,有若干条记录,任何位置都可能同时出现0和1,任何数据块都包含0和1,因此无法完成第一道过滤。我们可以采用切片,减少这种可能性。例如每2个BIT一片,或者每4个BIT一片,或者更多。通常海明距离大于3的,就没有什么相关性了。

三、DEMO与性能

1 暴力计算1、全扫,并行扫描创建测试表

四、技术点

1、阿里云RDS PostgreSQL smlar插件,使用GIN索引,块级收敛,二重过滤。0.2毫秒的响应速度,1000万数据中,检索海明距离2以内的记录。

2、阿里云RDS PostgreSQL 10,使用多核并行,暴力扫描,1000万数据,检索海明距离为N以内的数据,约450毫秒。

3、阿里云HybridDB for PostgreSQL,使用多机并行,横向扩展计算能力,也可以做到暴力扫描。根据实际的节点数计算查询效率。

五、云端产品

阿里云 RDS PostgreSQL:https://www.aliyun.com/product/rds/postgresql

阿里云 HybridDB for PostgreSQL:https://www.aliyun.com/product/gpdb

六、类似场景、案例

《电商内容去重\内容筛选应用(实时识别转载\盗图\侵权?) - 文本、图片集、商品集、数组相似判定的优化和索引技术》:https://github.com/digoal/blog/blob/master/201701/20170112_02.md

《基于 阿里云 RDS PostgreSQL 打造实时用户画像推荐系统》:https://github.com/digoal/blog/blob/master/201610/20161021_01.md

七、小结

采用阿里云RDS PostgreSQL的SMLAR插件,对千万量级的simhash数据检索相似文本,(更多数据量的测试后续提供,响应速度应该在毫秒级),相比没有索引的情况,性能从23秒提升到了0.2毫秒。提升了11.48万倍。

海量数据,海明距离高效检索(smlar)相关推荐

  1. 海明距离mysql查询_海量数据,海明距离高效检索(smlar) - 阿里云RDS PosgreSQL最佳实践-阿里云开发者社区...

    标签 PostgreSQL , 海明距离 , smlar , GiST索引 背景 SimHash的应用 通过上面的步骤,我们可以利用SimHash算法为每一个网页生成一个向量指纹,那么问题来了,如何判 ...

  2. 【转】海量数据相似度计算之simhash和海明距离

    2019独角兽企业重金招聘Python工程师标准>>> 通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何 ...

  3. simhash mysql_海量数据相似度计算之simhash和海明距离

    通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...

  4. 海量数据相似度计算之simhash和海明距离

    通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...

  5. Tag Archives: 海明距离

    在前一篇文章 <海量数据相似度计算之simhash和海明距离> 介绍了simhash的原理,大家应该感觉到了算法的魅力.但是随着业务的增长 simhash的数据也会暴增,如果一天100w, ...

  6. mysql 海明距离_海明距离 - holy_black_cat - 博客园

    通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...

  7. Matlab计算两集合间的海明距离

    一.问题描述 B1[1 2 3 4 5 6 7 8 9] B2[12 13 14 21 31 41 51  1 1 81 1 1] 两个十进制矩阵,行数不一样,分别是n1和n2,列数必须一致,为nwo ...

  8. Java实现海明距离简单计算

    文本相似度比较有很多方法,如余弦夹角算法.欧式距离.Jaccard相似度.最长公共子串.编辑距离等,海明距离是其中之一. 在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离. n位 ...

  9. JZOJ 5489. 【清华集训2017模拟11.28】海明距离

    Description 设有一长度为n的初始每个位置均为0的序列A.再给定一个长度为n的01序列B. 有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变. ...

最新文章

  1. ASP-JSP-NET 清空IE缓存
  2. python安装modify setup选哪-python 之禅 import this
  3. Behavioral模式之Memento模式
  4. 私人仓库免费后本地git和远程github首次连接
  5. Python:错误FileNotFoundError: [Errno 2] No such file or directory: 'objects/epsilon.pkl
  6. Zookeeper_原生API操作(一)
  7. 源码编译构建安装内核kernel
  8. python能做什么软件-Python能做什么
  9. 记录:ubuntu安装zlog及使用
  10. 怎么把手机字体改成繁体_如何把手机字体变成繁体 繁体字转换器
  11. CTF_ctfshow_meng新_web1-web24
  12. Lonza高通量384孔Nucleofector电转平台
  13. 随机密聊 匿名聊天室程序源码
  14. 形容计算机很烂的网络用语,坑爹什么意思 网络术语坑爹是什么意思?
  15. STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!
  16. 6开机白苹果一闪一灭_我的苹果6p突然死机,一直出现白苹果又黑屏,反复出现,无法开机,请...
  17. Tensorflow小技巧整理:修改张量特定元素的值
  18. Revit建模绘制楼板时剖面图上如何修改使其在墙的外边界?
  19. 有温度传感器的风机控制系统C语言,基于单片机的暖风机的设计任务书、开题报告...
  20. 北航数理统计大作业_如何自学概率论与数理统计/微积分/线性代数等科目

热门文章

  1. java安全编码指南之:对象构建
  2. 一文弄懂EnumMap和EnumSet
  3. Leet Code OJ 171. Excel Sheet Column Number [Difficulty: Easy]
  4. Effective Java之利用有限制通配符提升API的灵活性(二十八)
  5. 17行代码AC_51Nod - 2133 排队接水(贪心)
  6. Java与C、C++的区别
  7. Mysql俩种表级锁
  8. Mysql数据库(七)——mysql高阶语句(上)
  9. 路由(二)——动态路由简介与RIP协议
  10. Windows Server 笔记之活动目录,域的联系和区别