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.

以下是函数使用说明:

<span style="font-size:18px;">#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	二进制字符串
					 */
    };
}
#endif</span>


版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/houjun/p/4802192.html