• 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>


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

  • 相关阅读:
    Eclipse背景颜色设置
    SQL ROW_NUMBER() OVER函数的基本用法用法
    hdu 2844 Coins 多重背包问题
    VC++学习/MFC (1)
    java学习 (1)
    hdu 1506 City Game 二维的多重背包
    java学习(2)
    VC++学习/MFC (2)
    hdu 1506 Largest Rectangle in a Histogram
    hdu 1171 Big Event in HDU
  • 原文地址:https://www.cnblogs.com/houjun/p/4802192.html
Copyright © 2020-2023  润新知