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>
版权声明:本文为博主原创文章,未经博主允许不得转载。
simhash类的使用的更多相关文章
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- 使用simhash库来进行网页去重
首先感谢作者yanyiwu贡献的开源项目https://github.com/yanyiwu/simhash.在做项 目过程中,翻了一遍<这就是搜索引擎 核心技术详解>这本书的查重算法, ...
- R语言︱文本挖掘——jiabaR包与分词向量化的simhash算法(与word2vec简单比较)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- <数据挖掘之道>摘录话语:虽然我比 ...
- 基于ansj_seg和nlp-lang的简单nlp工具类
1.首先在pom中引入ansj_seg和nlp-lang的依赖包, ansj_seg包的作用: 这是一个基于n-Gram+CRF+HMM的中文分词的java实现: 分词速度达到每秒钟大约200万字左右 ...
- C++ 可配置的类工厂
项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
随机推荐
- CURL post/get提交
public function curlss($url){ $curl = curl_init(); // 设置你需要抓取的URL curl_setopt($curl, CURLOPT_URL, $u ...
- Eclipse 配置运行Spark
本文主要记录Spark 在 Eclipse中报 找不到主类的问题.在新建Spark工程,然后add external jars 选择 spark-assembly-1.4.0-hadoop2.6.0. ...
- 多对多中间表详解 -- Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- Asp.net mvc 下载文件
前言 最近有需求需要下载文件,可能是image的图片,也可能是pdf报告,也可能是微软的word或者excel文件. 这里就整理了asp.net mvc 和asp.net webapi 下载的方法 A ...
- 介绍一种非常好用汇总数据的方式GROUPING SETS
介绍 对于任何人而言,用T-SQL语句来写聚会查询都是工作中重要的一环.我们大家也都很熟悉GROUP BY子句来实现聚合表达式,但是如果打算在一个结果集中包含多种不同的汇总结果,可能会比较麻烦.我将举 ...
- BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]
2287. [HZOI 2015]疯狂的机器人 题意:从原点出发,走n次,每次上下左右不动,只能在第一象限,最后回到原点方案数 这不煞笔提,组合数写出来发现卷积NTT,然后没考虑第一象限gg 其实就是 ...
- BZOJ 4108: [Wf2015]Catering [上下界费用流]
4108: [Wf2015]Catering 题意:有一家装备出租公司收到了按照时间顺序排列的n个请求. 这家公司有k个搬运工.每个搬运工可以搬着一套装备按时间顺序去满足一些请求.一个搬运工从第i个请 ...
- BZOJ 3544: [ONTAK2010]Creative Accounting [set]
给定一个长度为N的数组a和M,求一个区间[l,r],使得$(\sum_{i=l}^{r}{a_i}) mod M$的值最大,求出这个值,注意这里的mod是数学上的mod 这道题真好,题面连LaTeX都 ...
- 基于Spring Boot,使用JPA动态调用Sql查询数据
在<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>,<基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合 ...
- ThinkPHP的使用
在public目录下使用命令行执行:php -S localhost:8888 route.php 无需使用服务器就可启动