网页去重之Simhash算法
作者:互联网
Simhash算法是Google应用在网页去重中的一个常用算法,在开始讲解Simhash之前,先了解——什么是网页去重?为什么要进行网页去重?如何进行网页去重,其基本框架是什么?
网页去重,顾名思义,就是过滤掉重复的网页。统计结果表明,近似重复网页的数量占网页总数量的比例较高,即互联网上有很多的页面内容是完全一样的或是相近的(这个不难理解,比如对于某一事件的新闻报道,很多是大同小异的)。基于这一实际情况,所以要进行网页去重。
那么如何进行网页去重呢?这就用到了Simhash算法。
去重算法的任务是对海量数据进行处理,通用的网页去重的基本框架如下。
参考: 1. 《这就是搜索引擎-核心技术详解》
- 对于给定的文档,首先通过一定的特征抽取手段,从文档中抽取出一系列能够表征文档主体内容的特征集合。这一步的关键点在于,尽可能保留文档的重要信息,抛弃无关紧要的信息。如何判定哪些信息是重要的,哪些是不重要的,就是算法研究的重点。
- 将文档转换为特征集合后,由于搜索引擎所处理的网页数量数以亿计,为了能够提高计算速度,很多算法会在特征集合的基础上,对信息进一步压缩,采用信息指纹相关算法,将特征集合压缩为新的数据集合(即生成文档指纹),其包含的元素数量远远小于特征集合数量。
- 把文档压缩为文档指纹后,即可通过相似性计算来判断哪些网页是近似重复页面。
- 从文档中提取一组能表征文章的特征词(这里首先需要利用开源的cppjieba进行分词),并计算权重(见笔记:利用tf-idf算法自动提取关键词),得到pair<特征词,权重>;
- 利用hash函数(这个hash函数利用开源的),将每个特征词映射成为固定长度的二进制数,即哈希值,得到pair<哈希值,权重>;
- 利用权值(w)对步骤2产生的二进制数进行改写,即把权重信息融入二进制序列中,变成一个实数向量。假设步骤2中得到的是<100110, w>,那么经过改写变成了实数向量(w,-w,-w,w,w,-w);
- 每个特征词都做了步骤3的改写后,对一篇文档中的所有特征词的实数向量进行累加(即对应位置相加),从而获得一个代表整个文档的实数向量。假设最后得到的实数向量是(13,108,-22,-5,-32,55)。
- 将步骤4得到的实数向量规范化,即将实数向量转换为二进制序列,转换规则为正数变为1,负数变为0。即(13,108,-22,-5,-32,55) --> 110001。最终得到的这个二进制序列就是本文档的文档指纹。
int numOf_1(int n) { int cnt = 0; while(n){ ++cnt; n = n & (n-1); } return cnt; }
至此,Simhash算法就算全部讲完了。 【总结】 1、网页去重的基本框架 (1)特征词提取 --> (2)生成文档指纹 --> (3)相似性计算 2、simhash算法,将一篇文档转换成二进制序列来表示 3、文档相似性计算-->计算两篇文档的海明距离-->计算二进制序列中"1"的个数
参考: 1. 《这就是搜索引擎-核心技术详解》
标签:网页,二进制,指纹,算法,文档,序列,Simhash 来源: https://www.cnblogs.com/kkbill/p/11507235.html