高效网页去重算法-SimHash
记得以前有人问过我,网页去重算法有哪些,我不假思索的说出了余弦向量相似度匹配,但如果是数十亿级别的网页去重呢?这下糟糕了,因为每两个网页都需要计算一次向量内积,查重效率太低了!我当时就想:论查找效率肯定是要考虑hash算法,相同字符串的hashcode肯定相同,不同字符串的hashcode却是大不相同,这也不符合要求啊,会不会存在一种算法能够使相似字符串的code值也相同或相似呢,于是就找到了Google的网页去重算法-SimHash。我们在使用SimHash算法前需要根据文档量级选择SimHash码的位数,一般可选32位或者64位。
1主要概念
海明距离:在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离。
注:比如合法代码长度为8,那么00111100与11110000的海明距离是4,10101111与01101111的海明距离是2,11110000与11110000的海明距离是0.
2算法流程
1)分词
将文档分词,然后为每个词分配权重(比如可以用tf-idf算法计算权重,但这里需要变换一下算法,将tf-idf值以单调递增函数映射到一个整数值),举个例子:我(3)是(2)中国人(5),我(3)热爱(4)我(3)的(1)祖国(5)。括号中是权重,权重越高表示这个词在文档中越重要。接下来需要去掉tf-idf值过低的,这样会把“的”这种虚词过滤掉。
2)计算Hash
计算每个词的Hash值,比如“我”——01001000,“是”——10110011,“中国人”——11001100,“热爱”——10101010,“祖国”——01011000
3)加权
将词乘以对应的权值,0用-1代替乘以对应权值,这样,“我”—— -33-3-33-3-3-3,“是”—— 2-222-2-222,“中国人”—— 55-5-555-5-5,“热爱”—— 4-44-44-44-4,“祖国”—— -55-555-5-5-5
4)合并
把单词序列从前到后按位累加,上面累加的结果是3,7,-7,-5,15,-9,-7,-15
5)降维
把第4)步的结果变为0-1串,方法是大于0的—>1,小于0的->0,所以结果是11001000,这样每篇文档会得到一个ID
6)比较海明距离
将第5)步得到的结果与已有的每一篇文档的ID做异或运算,然后求运算结果中1的个数(似曾相识燕归来啊!),得到海明距离。通常对于长文档来说,海明距离小于3的会被认为是一篇文档。对于微博等短文本来说,海明距离可以设置的较大,比如10以内的会被认为是同一篇文档。
3算法优缺点
优点:
1)算法高效,非常适用于大规模网页去重
2)算法非常容易使用在MapReduce等分布式计算中
3)对于每篇文档来说,算法消耗空间非常小
缺点:
1)对于长文档和短文档同时存在的情况,只依靠算法本身尚不能完美解决网页去重的问题
2)对于两篇看似完全不相关的文档来说,其海明距离甚至有可能为0,但出现这种情况的概率极小
- Simhash算法原理和网页查重应用
- 再谈poj2965(高效算法)
- Slope one:简单高效的推荐算法
- 多模式匹配算法,高效解决词典很大的模糊匹配问题
- jQuery快速高效制作网页交互特效第五章课后4
- 一个Sqrt函数引发的血案(sqrt函数的高效算法)
- 基于分块统计和机器学习的主题类网页内容识别算法实现和应用范例
- 点阵图形的高效旋转算法
- 【高效算法设计——跳跃枚举】Uva 11093 Just Finish it up
- 高效算法设计专项:UVa 10691
- 网页模糊归类算法的应用与实现
- 使用jQuery快速高效制作网页交互特效 第一章 JavaScript基础
- FP-growth算法高效发现频繁项集(Python代码)
- Sparse Table算法 - RMQ问题的简单高效算法
- 高效算法设计_再谈排序和检索(归并排序,逆序数对)
- 寻找链表中间节点-一种高效的算法
- 高效比对,返回最短编辑距离算法匹配度最高的数据
- 集训第四周(高效算法设计)B题 (二分查找优化题)
- 集训第四周(高效算法设计)C题 (二分查找优化题)
- 集训第四周(高效算法设计)P题 (构造题)