算法
simhash + 海明距离
-
简单易懂讲解simhash算法 hash 哈希:https://blog.youkuaiyun.com/le_le_name/article/details/51615931
-
simhash算法及原理简介:https://blog.youkuaiyun.com/lengye7/article/details/79789206
-
simhash 的 Python 实现原理: https://www.jianshu.com/p/1187fb7c59c5
-
simhash的中文实现(python) : https://www.jianshu.com/p/1187fb7c59c5
-
使用SimHash算法实现千万级文本数据去重插入(python版代码: https://blog.youkuaiyun.com/sinat_33455447/article/details/88956583
-
使用SimHash进行海量文本去重:https://www.cnblogs.com/maybe2030/p/5203186.html#_label3
-
海量数据相似度计算之simhash短文本查找: https://cloud.tencent.com/developer/article/1367128
-
面试|海量文本去重~simhash: https://blog.youkuaiyun.com/rlnLo2pNEfx9c/article/details/85110734
-
python使用simhash实现文本相似性对比(全代码展示):https://blog.youkuaiyun.com/weixin_43750200/article/details/84789361
-
simhash的py实现:https://blog.youkuaiyun.com/gzt940726/article/details/80460419
-
海量数据,海明距离高效检索(smlar) - 阿里云RDS PosgreSQL最佳实践: https://developer.aliyun.com/article/159575
核心
判定2篇文章相似的规则,就是 2 个 simhash 的汉明距离 <=3。
查询的复杂性在于:已有 100 亿个文章的 simhash,给定一个新的 simhash,希望判断是否与已有的 simhash 相似。
我们只能遍历100亿个 simhash,分别做异或运算,看看汉明距离是否 <=3,这个性能是没法接受的。
优化的方法就是“抽屉原理”,因为 2 个 simhash 相似的标准是 <=3 比特的差异,所以如果我们把 64比特的 simhash 切成 4 段,每一段 16 比特,那么不同的 3 比特最多散落在 3 段中,至少有 1 段是完全相同的。
同理,如果我们把 simhash 切成 5 段,分别长度 13bit、13bit、13bit、13bit、12bit,因为 2 个simhash 最多有 3 比特的差异,那么 2 个simhash 至少有 2 段是完全相同的。
存储设计
- redis + 冗余数据存储 (技术难度较低)
- postgres + smlar 插件
- Hbase
前期文本预处理时间
一篇千字左右的文章, jieba 分词 + 去除停止词的时间为 0.8 s 左右。
解决方案:
1.安装 jieba_fast : https://github.com/deepcs233/jieba_fast
2. jieba 开启并行: eg. https://github.com/fxsjy/jieba/blob/master/test/parallel/test_file.py
总体设计
- 【深度好文】simhash文本去重流程 https://zhuanlan.zhihu.com/p/71488127