首先感谢作者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. __init__class的简单使用/理解

    # -*- coding: utf-8 -*- class Student(object): def __init__(self, name, score): #通过定义一个特殊的__init__方法 ...

  2. JDK安装及Tomcat安装

    JDK安装及Tomcat安装 JDK 解压JDK到常用盘符 D为例 Tomcat安装 将tomcat.zip解压到常用的根目录下,我这里以D盘为例.这样就算安装好了! 接下来开始配置环境变量,打开环境 ...

  3. Delphi json解析相关

    身为一个资深的Delphi 开发者, 最近在做一个小工具的时候,开始捡起来pascal语言. 主要是开发一个内部用的小工具, 主要功能: 1.解析json格式 2.格式化json文件 3.校验json ...

  4. oracle pl/sql中的循环及if语句

    for循环 /* for循环打印1到10 */ set serveroutput on; declare begin .. loop dbms_output.put_line(i); end loop ...

  5. CORS跨域请求之简单请求与非简单请求

    先来看一个例子 定义server01的项目,在路由表中添加一条路由记录 url(r'^getData.html$',views.get_data) 对应的视图函数 from django.shortc ...

  6. IIS 加载 JSON 错误 404 解决办法

    MIME设置:在IIS的站点属性的HTTP头设置里,选MIME 映射中点击”文件类型”-”新类型”,添加一个文件类型:关联扩展名:*.json内容类型(MIME):application/x-java ...

  7. dos2unix和unix2dos

    dos2unix将windows格式的文件转换为linux格式的文件. unix2dos将linux格式的文件转换为windows格式的文件. dos2unix和unix2dos会转换windows和 ...

  8. 洛谷 [P1129] [ZJOI2007] 矩阵游戏

    这竟然是一道二分图 乍一看,可能是用搜索做,但是这个数据范围,一定会T. 我们观察发现,无论怎样变换,同一行的一定在同一行,同一列的一定还在同一列.所以说,一行只能配一列.这样,我们的目标就是寻找是否 ...

  9. Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]

    CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...

  10. 浅谈JavaScript的事件(事件类型)

    Web浏览器能够发生的事件有很多种类型,不同的事件类型有不同的事件信息.DOM3级的事件类型主要包括:UI事件,用户与页面上的元素交互时触发:焦点事件,元素获得或失去焦点触发:鼠标事件,用户通过鼠标在 ...