首先感谢作者yanyiwu贡献的开源项目https://github.com/yanyiwu/simhash。在做项 目过程中,翻了一遍《这就是搜索引擎  核心技术详解》这本书的查重算法,在众多的算法中,我选择了simhash。这个算法的魅力在于,

它把文本内容的相似性,转换为哈希值的相似性,很好理 解,效率也高,再说,谷歌也用着。关于本算法的一些介绍,在yanyiwu大神的博客

http://yanyiwu.com/work/2014/01/30/simhash-shi-xian-xiang-jie.html中也有介绍。对这个 算法的实现逻辑之后,开始来对这个算

法的使用。既然大神已经贡献出了源码,那我们首先要去学会如何使用这个宝贵的东西。因此,我对大神yanyiwu封装 的Simhasher类的成员

函数的功能及其参数阐述自己的理解,学会如何使用这些接口。关于这些接口的实现,

请参见github上的源码  /simhash/src/Simhasher.hpp.

以下是函数使用说明:

 #ifndef SIMHASH_SIMHASHER_HPP
#define SIMHASH_SIMHASHER_HPP #include "CppJieba/KeywordExtractor.hpp" //使用结巴分词库下的"关键字提取头文件"
#include "hashes/jenkins.h" //使用jenkins.h进行特征到哈希值的转换 namespace Simhash
{
using namespace CppJieba;
class Simhasher: public NonCopyable
{
private:
enum{BITS_LENGTH = };
jenkins _hasher; //对象成员,用于获取哈希值,组合关系
KeywordExtractor _extractor; //jieba分词库中的类作为Simhash的类成员,组合关系
public:
/****************构造函数*****************/
/* 传入:
* 1)词典路径
* 2)模式路径
* 3)idf路径
* 4)停用词路径
*/ //赋值 _extractor 的构造与析构
Simhasher(const string& dictPath, const string& modelPath, const string& idfPath, const string& stopWords)
: _extractor(dictPath, modelPath, idfPath, stopWords)
{} //析构函数
~Simhasher(){}; /********以下是Simhash的类成员函数*********/
public:
/* 1 */ bool extract(const string& text, vector<pair<string,double> > & res, size_t topN) const;
/* 功能:
* 抽取关键字,内部调用了_extractor.extract();
* 参数:
* (1)text 是传入的将要进行抽取关键字的字符串
* (2)res 装“关键字/权重”的数组
* (3)topN 词频最高的前N个单词
*/ /* 2 */bool make(const string& text, size_t topN, vector<pair<uint64_t, double> >& res) const;
/* 功能:
* 返回能代表text这篇文章内容的topN个关键字的<二进制hash值,权重>对的数组。
* 参数:
* (1)text 是传入的将要进行抽取关键字的字符串
* (2)topN 词频最高的前N个单词
* (3)res topN个关键字对应的64bit hash值组成的数组
*/ /* 3 */bool make(const string& text, size_t topN, uint64_t& v64) const
/* 功能:
* 返回能代表text这篇文章内容的topN个关键字映射成的simhash值
* 参数:
* (1)text 是传入的将要进行抽取关键字的字符串
* (2)topN 词频最高的前N个单词
* (3)v64 topN个关键字对应的64bit simhash值
*/ /* 4 */static bool isEqual(uint64_t lhs, uint64_t rhs, unsigned short n = );
/* 功能:
* 计算并判断 lhs 与 rhs 的海明距离是否小于n(默认为3)
* 参数:
* (1) lhs ,rhs 左右(不分左右)的64bit simhash值
* (2) n 海明距离的上限值
*/ /* 5 */static void toBinaryString(uint64_t req, string& res);
/* 功能:
* 将uint64_t的hash值转变成64bit二进制,便于进行海明距离计算
* 参数:
* (1) req uint64_t型的哈希值
* (2) res 二进制字符串
*/ /* 6 */static uint64_t binaryStringToUint64(const string& bin);
/* 功能:
* 将64bit二进制转变成uint64_t的hash值
* 参数:
* (1) bin 二进制字符串
*/
};
}

使用simhash库来进行网页去重的更多相关文章

  1. simhash与Google的网页去重

    前几天去吃葫芦头的路上,大飞哥给详细的讲解了他在比较文本相似度实验时对Google的simhash方法高效的惊叹,回来特意去找了原文去拜读. Simhash 传统IR领域内文本相似度比较所采用的经典方 ...

  2. 高效网页去重算法-SimHash

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

  3. 网页去重之Simhash算法

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

  4. simhash进行文本查重 Simhash算法原理和网页查重应用

    simhash进行文本查重http://blog.csdn.net/lgnlgn/article/details/6008498 Simhash算法原理和网页查重应用http://blog.jobbo ...

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

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

  6. C语言调用curl库抓取网页图片

    思路是先用curl抓取网页源码,然后以关键字寻找出图片网址.   #include <stdio.h> #include <stdlib.h> #include <str ...

  7. C语言调用curl库抓取网页图片(转)

    思路是先用curl抓取网页源码,然后以关键字寻找出图片网址.  范例: #include <stdio.h> #include <stdlib.h> #include < ...

  8. 使用python标准库urllib2访问网页

    #访问不需要登录的网页import urllib2target_page_url='http://10.224.110.118/myweb/view.jsp' f = urllib2.urlopen( ...

  9. python requests库爬取网页小实例:爬取网页图片

    爬取网页图片: #网络图片爬取 import requests import os root="C://Users//Lenovo//Desktop//" #以原文件名作为保存的文 ...

随机推荐

  1. 交换两个变量的值,不借助第三个变量的 三种方法(JS实现)

    第一种:算术运算法 var a = 10; var b = 12; a = b - a; b = b - a; a = b + a; 它的原理是:把a.b看做数轴上的点,围绕两点间的距离来进行计算.具 ...

  2. awk打印第n个参数到最后一个技巧/将n行组成一列

    打印第n参数到最后一个参数 文本的NF不等,即字段长度不固定,想截取从$3到$NF 第一反应是使用循环 [root@localhost ~]# echo "1 2 3 4 5" | ...

  3. Hyperledger Fabric Chaincode for Operators——实操智能合约

    什么是Chaincode(智能合约)? chaincode是一个程序,它是使用Go语言编写的,最终在Java等其他编程语言中实现了指定的接口.chaincode运行在一个被背书peer进程独立出来的安 ...

  4. JAVA并发编程学习笔记------基础构建模块

    一.并发容器:ConcurrentHashMap:1.分段锁机制: 任意数量的读取线程可以并发的访问map,执行读取操作的线程和执行写入操作的线程可以并发的访问Map,并且一定数量的写入线程可以并发的 ...

  5. mysql安装(CentOS 7.1 (64-bit system) MySQL 5.6.24)

    环境:CentOS 7.1 (64-bit system) MySQL 5.6.24yum install libaio //安装依赖的包wget http://dev.mysql.com/get/m ...

  6. ServiceStack.OrmLite T4模板使用记录

    前言 最近研究了下ServiceStack.OrmLite,文档中也提到了使用T4模板对数据库中已经有了表进行实体的映射,这里也顺便记录下使用的步骤和情况. 开始使用 引用T4模板 首先我们创建一个工 ...

  7. Python基础篇(一)

    首先需要从Python的官网下载python的安装程序,下载地址为:www.python.org/downloads.最新的版本为3.4.1,下载和操作系统匹配的安装程序并安装即可. 安装好了后,在开 ...

  8. 微信小程序开发《一》:阿里云tomcat免费配置https

    小狼咕咕最近开启了微信小程序开发的征程,由于微信小程序的前后台通信必须通过https协议,所以小狼咕咕第一件要做的事就是配置一个能够通过https访问的后台服务.小狼咕咕用的是阿里云ECS服务器,Li ...

  9. 反反爬虫 IP代理

    0x01 前言 一般而言,抓取稍微正规一点的网站,都会有反爬虫的制约.反爬虫主要有以下几种方式: 通过UA判断.这是最低级的判断,一般反爬虫不会用这个做唯一判断,因为反反爬虫非常容易,直接随机UA即可 ...

  10. 使用supervisor 进行进程管理时调整最大文件打开数

    [supervisord]logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.loglogfile_maxbytes=50MB ; 日志文 ...