首先感谢作者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. NIO笔记---上

    小弟前端时间由于开发个管理系统导致断更了近20天!!马上就要春招了,学习了一下NIO,将笔记记录下,希望和我一样的18届毕业生都能找到满意的公司!! 本文记录了NIO与IO的区别,缓冲区的数据存取,直 ...

  2. ROS学习笔记

    创建ros工作环境: mkdir -p ~/catkin_ws/src //建立项目目录,同时生成src文件夹 cd ~/catkin_ws/ //进入项目目录 catkin_make //编译项目, ...

  3. Java POI读取Excel数据,将数据写入到Excel表格

    1.准备 首先需要导入poi相应的jar包,包括: 下载地址:http://pan.baidu.com/s/1bpoxdz5 所需要的包的所在位置包括: 2.读取Excel数据代码 package S ...

  4. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]

    小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,如 ...

  5. Windows Azure Virtual Machine (34) Azure VM挂载WebDAV

    <Windows Azure Platform 系列文章目录> 之前使用Azure VM,挂载box网盘.发现不能正常挂载,这里简单记录一下. 1.WebDAV的网络映射,需要WebCli ...

  6. JDBC常见面试题

    以下我是归纳的JDBC知识点图: 图上的知识点都可以在我其他的文章内找到相应内容. JDBC常见面试题 JDBC操作数据库的步骤 ? JDBC操作数据库的步骤 ? 注册数据库驱动. 建立数据库连接. ...

  7. JS声明对象时属性名加引号与不加引号的问题

    般情况下属性名加引号和不加引号是都可以的,效果是一样的. var obj = { name : '你好', 'age' : 1, }; document.write( obj['name'] + '& ...

  8. git命令行工作的正确姿势

    git命令行创建并提交新分支到mater分支的常规步骤 git branch new_branch git status 查看修改的文件 git add changed_files git commi ...

  9. Tomcat服务器的配置

    本地安装的Tomcat服务器版本是 Apache Tomcat/7.0.42 启动 localhost 使用Tomcat的前提是安装了jdk,我在本地安装了jdk7.Tomcat服务器的文件目录为F: ...

  10. angular-file-upload封装为指令+图片尺寸限制

    不了解angular-file-upload基础使用 请先参考http://blog.csdn.net/lai_xu/article/details/49535847 博客地址 下文如果有更好的建议请 ...