文本查重算法SimHash
1.介绍
爬虫采集了大量的文本数据,如何进行去重?可以使用文本计算MD5,然后与已经抓取下来的MD5集合进行比较,但这种做法有个问题,文本稍有不同MD5值都会大相径庭,
无法处理文本相似问题。另一种方式是本文要介绍的SimHash,这是谷歌提出的一种局部敏感哈希算法,在吴军老师的《数学之美》里也有介绍,这种算法可以将文本降维成一个
数字,极大地减少了去重操作的计算量。SimHash算法主要分为以下几个步骤:
1.分词,并为每个词加上权重,代表这个词在这句话中的重要程度(可以考虑使用TF-IDF算法)
2.哈希,分好每个词映射为哈希值
3.加权,按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。
4.合并,把上面各个单词算出来的序列值累加,变成只有一个序列串
5.降维,如果序列串每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。
2.SimHash的比较
根据上面的步骤可以计算出每个文本的一个SimHash值,两个SimHash的相似度就是通过比较不同二者数位的个数,这叫做海明距离,比如10101 和 00110 ,海明距离
为3。
3.比较效率的提高
加入我们已经有了一个simhash库,现在有一个query过来需要查询是否库里存在与这个query海明距离为1到3的文本,如何查询?
方式1. 将这个query的海明距离为1到3的结果实时计算出来,然后依次在库里查找,缺点:海明距离为1到3的结果可能有上万个,逐个查询效率肯定很低。
方式2.将库里每个simhash海明距离为1到3的结果事先离线计算出来,这样每个查询只需要O(1)的复杂度。缺点:需要的存储空间非常大。
待续。。。。
文本查重算法SimHash的更多相关文章
- simhash进行文本查重 Simhash算法原理和网页查重应用
simhash进行文本查重http://blog.csdn.net/lgnlgn/article/details/6008498 Simhash算法原理和网页查重应用http://blog.jobbo ...
- python 手把手教你基于搜索引擎实现文章查重
前言 文章抄袭在互联网中普遍存在,很多博主都收受其烦.近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制.黏贴后发布标原创屡见不鲜,部分抄袭后的文章甚至标记了一些联系方式从而使读者获 ...
- python简单实现论文查重(软工第一次项目作业)
前言 软件工程 https://edu.cnblogs.com/campus/gdgy/informationsecurity1812 作业要求 https://edu.cnblogs.com/cam ...
- .NET下文本相似度算法余弦定理和SimHash浅析及应用
余弦相似性 原理:首先我们先把两段文本分词,列出来所有单词,其次我们计算每个词语的词频,最后把词语转换为向量,这样我们就只需要计算两个向量的相似程度. 我们简单表述如下 文本1:我/爱/北京/ ...
- 【NLP】Python实例:基于文本相似度对申报项目进行查重设计
Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...
- 海量文件查重SimHash和Minhash
SimHash 事实上,传统比较两个文本相似性的方法,大多是将文本分词之后,转化为特征向量距离的度量,比如常见的欧氏距离.海明距离或者余弦角度等等.两两比较固然能很好地适应,但这种方法的一个最大的缺点 ...
- 【NLP】Python实例:申报项目查重系统设计与实现
Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...
- 数据结构与算法—simhash
引入 随着信息爆炸时代的来临,互联网上充斥着着大量的近重复信息,有效地识别它们是一个很有意义的课题. 例如,对于搜索引擎的爬虫系统来说,收录重复的网页是毫无意义的,只会造成存储和计算资源的浪费: 同时 ...
- 高效网页去重算法-SimHash
记得以前有人问过我,网页去重算法有哪些,我不假思索的说出了余弦向量相似度匹配,但如果是数十亿级别的网页去重呢?这下糟糕了,因为每两个网页都需要计算一次向量内积,查重效率太低了!我当时就想:论查找效率肯 ...
随机推荐
- (七十六)c#Winform自定义控件-表单验证组件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- redirectTo、navigateTo与switchTap区别
老是记忆不大清楚,简单写一下 简单作区分就是: redirectTo:关闭当前页(卸载),跳转到指定页 navigateTo:保留当前页(隐藏),跳转到指定页 switchTap:只能用于跳转到tab ...
- Spring Boot(三) 使用Lombok
C#写的多了用习惯了众多的语法糖,再写起来Java总会有一些非常不舒服的地方.比如用惯了C#的属性在用起来Java的属性,写起来就会感觉不够优雅.如:定义一个Person类 public cl ...
- Spring boot 官网学习笔记 - Auto-configuration(@SpringBootApplication、@EnableAutoConfiguration、@Configuration)
Spring Boot auto-configuration attempts to automatically configure your Spring application based on ...
- js深度克隆对象、数组
function deepCopy(o) { if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ++i) { ...
- 理解JS引擎的执行机制
首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问 : JS为什么是单线程的 ...
- Linux下几种常见压缩方式测试对比
目录 Linux下几种常见压缩方式测试对比 参考 简介 测试 总结 Linux下几种常见压缩方式测试对比
- Python爬虫:获取JS动态内容
经过一段时间的python学习,能写出一些爬虫了.但是,遇到js动态加载的网页就犯了难.于是乎谷歌.百度,发现个好介绍http://www.jianshu.com/p/4fe8bb1ea984 主要就 ...
- 死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- 全网最新最简单的 OpenJDK13 代码编译
目录 开始咯 1.下载源码 2.安装编译需要的依赖 3.安装 jdk 12 4.检查配置 5.开始编译 6.验证是否成功 回顾 个人博客原文:全网最新最简单的 OpenJDK13 代码编译 最近因写文 ...