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的更多相关文章

  1. simhash进行文本查重 Simhash算法原理和网页查重应用

    simhash进行文本查重http://blog.csdn.net/lgnlgn/article/details/6008498 Simhash算法原理和网页查重应用http://blog.jobbo ...

  2. python 手把手教你基于搜索引擎实现文章查重

    前言 文章抄袭在互联网中普遍存在,很多博主都收受其烦.近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制.黏贴后发布标原创屡见不鲜,部分抄袭后的文章甚至标记了一些联系方式从而使读者获 ...

  3. python简单实现论文查重(软工第一次项目作业)

    前言 软件工程 https://edu.cnblogs.com/campus/gdgy/informationsecurity1812 作业要求 https://edu.cnblogs.com/cam ...

  4. .NET下文本相似度算法余弦定理和SimHash浅析及应用

    余弦相似性 原理:首先我们先把两段文本分词,列出来所有单词,其次我们计算每个词语的词频,最后把词语转换为向量,这样我们就只需要计算两个向量的相似程度.   我们简单表述如下   文本1:我/爱/北京/ ...

  5. 【NLP】Python实例:基于文本相似度对申报项目进行查重设计

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  6. 海量文件查重SimHash和Minhash

    SimHash 事实上,传统比较两个文本相似性的方法,大多是将文本分词之后,转化为特征向量距离的度量,比如常见的欧氏距离.海明距离或者余弦角度等等.两两比较固然能很好地适应,但这种方法的一个最大的缺点 ...

  7. 【NLP】Python实例:申报项目查重系统设计与实现

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  8. 数据结构与算法—simhash

    引入 随着信息爆炸时代的来临,互联网上充斥着着大量的近重复信息,有效地识别它们是一个很有意义的课题. 例如,对于搜索引擎的爬虫系统来说,收录重复的网页是毫无意义的,只会造成存储和计算资源的浪费: 同时 ...

  9. 高效网页去重算法-SimHash

    记得以前有人问过我,网页去重算法有哪些,我不假思索的说出了余弦向量相似度匹配,但如果是数十亿级别的网页去重呢?这下糟糕了,因为每两个网页都需要计算一次向量内积,查重效率太低了!我当时就想:论查找效率肯 ...

随机推荐

  1. 【数据结构与算法】--JavaScript 链表

    一.介绍 JavaScript 原生提供了数组类型,但是却没有链表,虽然平常的业务开发中,数组是可以满足基本需求,但是链表在大数据集操作等特定的场景下明显具有优势,那为何 JavaScript 不提供 ...

  2. 常用HBase操作

    HBase是一个分布式.面向列的数据库,可以用来存储非结构化和半结构化的松散数据,具有高可靠.高性能.面向列.可伸缩的特性.通过行键(RowKey).列族(ColumnFamily).列(Column ...

  3. Android [SharedPreference轻量级存储]

    SharedPreferencesActivity.java package com.xdw.a122.data; import android.content.SharedPreferences; ...

  4. centos7下mongoDB安装和配置

    2018-10-31更新 yum –y install mongodb-org 找不到这个包,清华源: https://mirrors.tuna.tsinghua.edu.cn/help/mongod ...

  5. NET Core 3.0 新姿势 将AutoFac替换内置DI

    .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原来在NET Core 2.1时候,AutoFac返回一个 IServ ...

  6. System.exit退出程序

    方法源码: /** * Terminates the currently running Java Virtual Machine. The * argument serves as a status ...

  7. freemarker属性配置

    freemarker属性配置: spring.freemarker.allow-request-override=false # Set whether HttpServletRequest attr ...

  8. FastDfs之TrackerServer的详细配置介绍

    # is this config file disabled # false for enabled # true for disabled disabled=false #当前配置是否不可用fals ...

  9. 玩转 SpringBoot 2 之整合 JWT 下篇

    前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...

  10. How to setup Electrum testnet mode and get BTC test coins

    For some reason we need to use BTC test coins, but how to set up the Bitcoin testnet wallet and get ...