您的位置:首页 > 其它

使用simhash库来进行网页去重

2015-10-15 19:26 465 查看
首先感谢作者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 = 64};
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 = 3);
/*  功能:
*      计算并判断 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 二进制字符串
*/
};
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: