使用simhash库来进行网页去重
首先感谢作者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库来进行网页去重的更多相关文章
- simhash与Google的网页去重
前几天去吃葫芦头的路上,大飞哥给详细的讲解了他在比较文本相似度实验时对Google的simhash方法高效的惊叹,回来特意去找了原文去拜读. Simhash 传统IR领域内文本相似度比较所采用的经典方 ...
- 高效网页去重算法-SimHash
记得以前有人问过我,网页去重算法有哪些,我不假思索的说出了余弦向量相似度匹配,但如果是数十亿级别的网页去重呢?这下糟糕了,因为每两个网页都需要计算一次向量内积,查重效率太低了!我当时就想:论查找效率肯 ...
- 网页去重之Simhash算法
Simhash算法是Google应用在网页去重中的一个常用算法,在开始讲解Simhash之前,先了解——什么是网页去重?为什么要进行网页去重?如何进行网页去重,其基本框架是什么? 网页去重,顾名思 ...
- simhash进行文本查重 Simhash算法原理和网页查重应用
simhash进行文本查重http://blog.csdn.net/lgnlgn/article/details/6008498 Simhash算法原理和网页查重应用http://blog.jobbo ...
- 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度
摘 要 在搜索引擎的检索结果页面中,用户经常会得到内容相似的重复页面,它们中大多是由于网站之间转载造成的.为提高检索效率和用户满意度,提出一种基于特征向量的大规模中文近似网页检测算法DDW(Det ...
- C语言调用curl库抓取网页图片
思路是先用curl抓取网页源码,然后以关键字寻找出图片网址. #include <stdio.h> #include <stdlib.h> #include <str ...
- C语言调用curl库抓取网页图片(转)
思路是先用curl抓取网页源码,然后以关键字寻找出图片网址. 范例: #include <stdio.h> #include <stdlib.h> #include < ...
- 使用python标准库urllib2访问网页
#访问不需要登录的网页import urllib2target_page_url='http://10.224.110.118/myweb/view.jsp' f = urllib2.urlopen( ...
- python requests库爬取网页小实例:爬取网页图片
爬取网页图片: #网络图片爬取 import requests import os root="C://Users//Lenovo//Desktop//" #以原文件名作为保存的文 ...
随机推荐
- 【转】shell学习笔记(四)——条件测试
1 test 条件检测 当我要检测系统上面某些文件或者是相关的属性时,利用 test 这个命令来工作真是好用得不得了, 举例来说,我要检查 /home/oracle/zy是否存在时,使用: test ...
- TCP/IP参考模型
1.简介 什么是TCP/IP参考模型? TCP/IP模型是网络通信模型的一种.网络通信模型还包括OSI,旨在使各种计算机在世界范围内互连为网络.其中有OSI为七层模型.TCP/IP为四层模型,现在大部 ...
- gulp最简示例
全局安装 $ npm gulp -g 作为项目的开发依赖安装 $ npm gulp --save-dev 脚本文件 在根目录创建gulpfile.js文件 const gulp = require(' ...
- javascript中的BOM对象
1.window对象 所有的浏览器都支持window对象 概念上讲,一个html文档对应一个window对象 功能上讲,控制浏览器窗口 使用上讲,window对象不需要创建对象,直接使用 2.wind ...
- JDBC(二)
三层架构的一些基本报结构如下: domain包:下面是一些实体bean,属性为private,提供属性相对应的set和get方法.一般对应于数据库中的一张数据表,属性对应于数据表中的列. dao包,数 ...
- UVA 12633 Super Rooks on Chessboard [fft 生成函数]
Super Rooks on Chessboard UVA - 12633 题意: 超级车可以攻击行.列.主对角线3 个方向. R * C 的棋盘上有N 个超级车,问不被攻击的格子总数. 行列好好做啊 ...
- BZOJ 1758: [Wc2010]重建计划 [暂时放弃]
今天晚上思维比较乱,以后再写写吧#include <iostream> #include <cstdio> #include <cstring> #include ...
- BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]
以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- tcp 网络编程
网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型: ...