记得以前有人问过我,网页去重算法有哪些,我不假思索的说出了余弦向量相似度匹配,但如果是数十亿级别的网页去重呢?这下糟糕了,因为每两个网页都需要计算一次向量内积,查重效率太低了!我当时就想:论查找效率肯定是要考虑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的更多相关文章

  1. 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度

    摘  要  在搜索引擎的检索结果页面中,用户经常会得到内容相似的重复页面,它们中大多是由于网站之间转载造成的.为提高检索效率和用户满意度,提出一种基于特征向量的大规模中文近似网页检测算法DDW(Det ...

  2. 网页去重之Simhash算法

    Simhash算法是Google应用在网页去重中的一个常用算法,在开始讲解Simhash之前,先了解——什么是网页去重?为什么要进行网页去重?如何进行网页去重,其基本框架是什么?   网页去重,顾名思 ...

  3. 海量数据去重之SimHash算法简介和应用

    SimHash是什么 SimHash是Google在2007年发表的论文<Detecting Near-Duplicates for Web Crawling >中提到的一种指纹生成算法或 ...

  4. 文本去重之SimHash算法

    文本去重之SimHash算法 - pathenon的个人页面 - 开源中国社区 文本去重之SimHash算法

  5. 【转】JavaScript下对去重算法的优化

    本人较懒,直接将链接附上: JavaScript下去重算法优化:http://www.linuxde.net/2013/02/12062.html

  6. 谷歌的网页排序算法(PageRank Algorithm)

    本文将介绍谷歌的网页排序算法(PageRank Algorithm),以及它如何从250亿份网页中捞到与你的搜索条件匹配的结果.它的匹配效果如此之好,以至于“谷歌”(google)今天已经成为一个被广 ...

  7. 【转】larbin中的url去重算法

    1.bloom filter算法 传说中,larbin使用bloom filter算法来进行url去重.那我们就先来了解下bloom filter算法好了. [以下转自:http://hi.baidu ...

  8. javascript数组去重算法-----3

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. javascript数组去重算法-----2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. L166

    THE idea of underwater mining is not restricted to the ocean floor (see article). High water tables ...

  2. 3. 什么是JSR参考实现? - JavaEE基础系列

    本文是JavaEE基础系列的第三节. Java EE简介 - JavaEE基础系列 JSR简介 - JavaEE基础系列 上一节中, 我们介绍了什么是JSR.JSR就是一个提交到JCP的抽象请求,包含 ...

  3. anjular2以及微信小程序的一点比较

    1条件渲染: 小程序:用 wx:if="{{condition}}" 来判断是否需要渲染该代码块. <view wx:if="{{condition}}" ...

  4. [svn]显示日志很慢 点击文件查看更改记录也贼慢

    特此记录,防止以后忘记. 解决办法: 在 C:\Windows\System32\drivers\etc (win7) 中加入 即可 亦或将代码的url中pc名字改为ip地址也可以解决问题 对文件夹点 ...

  5. onenote的笔记本在windows10保存的路径

    onenote挺好用的,支持windows,android,mac等操作系统,完全符合我的需求,并且还没有广告.但是,在删除笔记本的时候,感觉比较费事,因为他没有配置告诉我们文件具体放在哪个路径下了, ...

  6. Jmeter用表格查看结果

    Sample#:编号类似id Start Time:开始时间 Thread Name:线程名称 Label:请求名称 Sample Time:取样时间ms Status:状态 Bytes:接受字节数 ...

  7. HDU1556 线扫

    昨天睡得太晚,今天又在看新算法,明天事情也多,烦,所以今天刷刷水题就过去了. 叫我用线段树,我反而搞不来 #include<cstdio> #include<cstdlib> ...

  8. HTTP请求报头及其处理

    ps:详细说明http://www.cnblogs.com/kkgreen/archive/2011/04/11/2012829.html

  9. hdfs会出现的一些问题

    实训的第一篇博客献给坑了我的hdfs…… 由于电脑的原因,突然花屏,虚拟机来不及挂起.之后发现50070端口进不去,查看jps进程发现没有namenode 先用stop-all.sh命令再start还 ...

  10. 从数据库导出数据到excel之POI操作

    项目说明: 1:数据库中有两张表,主键关联 2:根据条件查询数据 3:处理为需要的数据封装类型,然后传到导出excel的方法中 <--框架部署就不详谈了,用的spring框架--> 补充: ...