高效网页去重算法-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的更多相关文章
- 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度
摘 要 在搜索引擎的检索结果页面中,用户经常会得到内容相似的重复页面,它们中大多是由于网站之间转载造成的.为提高检索效率和用户满意度,提出一种基于特征向量的大规模中文近似网页检测算法DDW(Det ...
- 网页去重之Simhash算法
Simhash算法是Google应用在网页去重中的一个常用算法,在开始讲解Simhash之前,先了解——什么是网页去重?为什么要进行网页去重?如何进行网页去重,其基本框架是什么? 网页去重,顾名思 ...
- 海量数据去重之SimHash算法简介和应用
SimHash是什么 SimHash是Google在2007年发表的论文<Detecting Near-Duplicates for Web Crawling >中提到的一种指纹生成算法或 ...
- 文本去重之SimHash算法
文本去重之SimHash算法 - pathenon的个人页面 - 开源中国社区 文本去重之SimHash算法
- 【转】JavaScript下对去重算法的优化
本人较懒,直接将链接附上: JavaScript下去重算法优化:http://www.linuxde.net/2013/02/12062.html
- 谷歌的网页排序算法(PageRank Algorithm)
本文将介绍谷歌的网页排序算法(PageRank Algorithm),以及它如何从250亿份网页中捞到与你的搜索条件匹配的结果.它的匹配效果如此之好,以至于“谷歌”(google)今天已经成为一个被广 ...
- 【转】larbin中的url去重算法
1.bloom filter算法 传说中,larbin使用bloom filter算法来进行url去重.那我们就先来了解下bloom filter算法好了. [以下转自:http://hi.baidu ...
- javascript数组去重算法-----3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- javascript数组去重算法-----2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- Python2、3学习及迁移
一.Python2.7 Python 2.7教程 - 廖雪峰的官方网站 Python 基础教程 | 菜鸟教程 二.Python3 Python教程 - 廖雪峰的官方网站 Python3 教程 | 菜鸟 ...
- OK335x mksd.sh hacking
#! /bin/sh # mk3PartSDCard. # Licensed under terms of GPLv2 # 参考文档: # . sfidsk创建可启动分区问题 # http://seg ...
- Python3 移动文件——合集
文件/文件夹操作头文件 import os import shutil 参考 Python3批量移动指定文件到指定文件夹
- 【C++】STL之队列queue
1.头文件 # include<queue> 2.成员函数 empty() 当队列为空时,返回true size() 返回队列内元素个数 front() 返回队首元素 back() 返回队 ...
- 【剑指offer】连续子数组的最大和,C++实现
原创博文,转载请注明出处!本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 # 题目 输入一个整形数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求 ...
- Spring 学习笔记(一)
# IOC, DI # ApplicationContext.xml 描述类之间的依赖注入关系 # 初始化Bean工厂的两种方式 ## ClassPathXmlApplicationContext # ...
- ASP.NET WebForm 与 IE10、IE11
最近维护公司一个烂项目.NET4.0 Asp.Net WebForm(在MVC5泛滥的今天还有用WebForm的(⊙o⊙)…) IE10.IE11下aspx中大表单提交不上去,报_DoPostBack ...
- ubuntu查看进程端口号及运行的程序
查看进程端口号及运行的程序:netstat -atunp 根据端口号来查看进程号:lsof -i:16031
- 携程阿波罗(Apollo)配置中心
携程阿波罗(Apollo) https://www.cnblogs.com/xiaxiaolu/p/10025597.html 一.瞎扯点什么 1.1 阿波罗 阿波罗是希腊神话中的光明之神.文艺之 ...
- sysbench fileio 压力测试
备注: 使用的是yum 安装 1. 安装 yum install -y sysbench 2. 命令 fileio options: --file-num=N number of files ...