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

    在本次项目中,遇到很多问题,经过努力,都逐步得到解决.静下心来,做一个记录,以供以后学习. 在项目中遇到一个问题,需要在JS中读取数据库中的值,然后再把值返回到页面中,解决方案如下:使用Ajax方法来 ...

  2. JDK 1.8之 HashMap 源码分析

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/75579654 构造函数 Node hash put treeifyBin get re ...

  3. 随想录(kgdb的基本原理)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在linux kernel调试的时候,有一种很方便的调试方法,那就是kgdb.kgdb的本质,就 ...

  4. 依存可视化︱Dependency Viewer——南京大学自然语言处理研究组

    来源网页:http://nlp.nju.edu.cn/tanggc/tools/DependencyViewer.html 视频演示网页:http://nlp.nju.edu.cn/tanggc/to ...

  5. 2017~ROS暑期学校~分享

    http://www.robotics.sei.ecnu.edu.cn/ROS2017/ ---- 往年暑期学校活动:2015年,2016年 报名开始时间7月2日晚10点:暑期学校报名,机器人挑战赛报 ...

  6. Xcode9 新功能

    翻译: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcod ...

  7. 更换pip源,解决pip install安装包慢的问题

    而pip是很强大的Python包安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以最好是将使用的pip源更换一下,这样就能解决被墙导致的装不上库的问题.网上有很多可用的源,例如豆瓣:http ...

  8. JavaScript:逻辑操作符“==”与“===”的区别

    Summary JavaScript中,逻辑操作符“===”会先检查操作数的数据类型,对不同的数据类型会返回false. 而“==”对不同类型的操作数进行比较时,会进行类型转换后再比较. Descri ...

  9. Linux下Apache服务器配置

    Linux下Apache服务器配置 相关包: httpd-2.2.3-29.e15.i386.rpm                 //主程序包 httpd-devel-2.2.3-29.e15.i ...

  10. minio 安装以及使用

    1. 为了方便使用 docker 安装 docker run -p 9000:9000 minio/minio server /export   注意启动显示的 appkey secretkey  C ...