hashset去重原理_基于simhash的文本去重原理


互联网网页存在着大量重复内容,必须有一套高效的去重算法,否则爬虫将做非常多的无用功,工作时效性无法得到保证,更重要的是用户体验也不好。业界关于文本指纹去重的算法众多,如 k-shingle 算法、google 提出的simhash 算法、Minhash 算法、百度top k 最长句子签名算法等等,本文主要介绍simhash算法以及python应用.

simhash

  • simhash 与传统hash 的区别

传统的Hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上仅相当于伪随机数产生算法。传统的hash算法产生的两个签名,如果原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别很大。所以传统的Hash是无法在签名的维度上来衡量原内容的相似度,而SimHash本身属于一种局部敏感哈希算法,它产生的hash签名在一定程度上可以表征原内容的相似度。

我们主要解决的是文本相似度计算,我们降维生成hash签名也是用于这个目的。看到这里估计大家就明白了,我们使用的simhash就算把文章中的字符串变成 01 串也还是可以用于计算相似度的,而传统的hash却不行。我们可以来做个测试,两个相差只有一个字符的文本串,“你妈妈喊你回家吃饭哦” 和 “你妈妈叫你回家吃饭啦”。

通过simhash计算结果为:

1000010010101101111111100000101011010001001111100001001011001011

1000010010101101011111100000101011010001001111100001101010001011

通过传统hash计算为:

0001000001100110100111011011110

1010010001111111110010110011101

大家可以看得出来,相似的文本只有部分 01 串变化了,而普通的hash却不能做到,这个就是局部敏感哈希的魅力。

  • simhash简介

simhash 是 google 用来处理海量文本去重的算法。 simhash 可以将一个文档转换成一个 64 位的字节,暂且称之为特征字。判断文档是否重复,只需要判断文档特征字之间的汉明距离。根据经验,一般当两个文档特征字之间的汉明距离小于 3, 就可以判定两个文档相似。

主要步骤:在新拿到文本之后需要先进行分词,这是因为需要挑出TopN个词来表征这篇文本,并且分词的权重不一样,可以使用相应数据集的tf-idf值作为分词的权重,这样就分成了带权重的分词结果。

之后对所有分词进行哈希运算获取二值化的hash结果,再将权重与哈希值相乘,获得带权重的哈希值,最后进行累加以及二值化处理.

b9ff2f229397d2cb79144eb05743d677.png
  • 分词

使用分词手段将文本分割成关键词的特征向量,分词方法有很多一般都是实词,也就是把停用词等都去掉之后的部分,使用者可以根据自己的需求选择.最后形成去掉噪音词的单词序列并为每个词加上权重. 例如:

行者AI 专注 于 游戏 领域 多年 AI技术 积淀 一站式 提供 文本 图片 音视频 内容 审核 游戏AI 以及 数据 平台 服务

目前的词只是进行了分割,但是词与词含有的信息量是不一样的,比如行者AI 游戏 审核 这三个词就比 专注 服务 以及更能表达文本的主旨含义,这也就是所谓信息熵的概念。

为此我们还需要设定特征词的权重,简单一点的可以使用绝对词频来表示,也就是某个关键词出现的次数,但是事实上出现次数少的所含有的信息量可能更多.总之需要选择一种加权方法,否则效果会打折扣。

  • 哈希和权重化

前面我们使用分词方法和权重分配将文本就分割成若干个带权重的实词,比如权重使用1-5的数字表示,1最低5最高

行者AI(5) 专注(2) 于(1) 游戏(3) 领域(1) ......

对各个特征词进行二值化哈希值计算, 再将所有的哈希值累加,最后将累加结果二值化.

fc5e8cdcc37c9fc60b6608b2f6878206.png
  • 汉明距离
在信息论中,两个等长字符串之间的汉明距离(英语:Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。 汉明重量是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是1的个数,所以11101的汉明重量是4。 对于二进制字符串a与b来说,它等于a 异或b后所得二进制字符串中“1”的个数。 汉明距离是以理查德·卫斯里·汉明的名字命名的,汉明在误差检测与校正码的基础性论文中首次引入这个概念。 在通信中累计定长二进制字中发生翻转的错误数据位,所以它也被称为信号距离。汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。

谷歌经过工程验证认为当两个64bit的二值化simhash值的汉明距离超过3则认为不相似,所以判重问题就转换为求两个哈希值的汉明距离问题。

  • python 实现

pip 源中有数种 simhash 的实现,simhash,使用起来十分方便,直接使用 pip 就可以安装

pip install simhash

使用例子

from simhash import Simhashdef simhash_demo(text1, text2):
"""
求两文本的相似度
:param text1:
:param text2:
:return:
"""
a_simhash = Simhash(text1)
b_simhash = Simhash(text2)
max_hashbit = max(len(bin(a_simhash.value)), (len(bin(b_simhash.value))))
# 汉明距离
distince = a_simhash.distance(b_simhash)
print(distince)
similar = 1 - distince / max_hashbit
return similarif __name__ == '__main__':
text1 = "行者AI专注于游戏领域,多年的AI技术积淀,一站式提供文本、图片、音/视频内容审核,游戏AI以及数据平台服务"text2 = "行者AI专注于游戏领域,多年的AI技术积淀,二站式提供文本、图片、音 视频内容审核,游戏AI以及数据平台服务"similar = simhash_demo(text1, text2)
print(similar)

PS:

我们是行者AI,我们在“AI+游戏”中不断前行。

如果你也对游戏感兴趣,对AI充满好奇,那就快来加入我们(contact@xingzhe.ai)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决express video 手机无法播放的问题

http://stackoverflow.com/questions/24976123/streaming-a-video-file-to-an-html5-video-player-with-node-js-so-that-the-video-c 项目地址 https://github.com/shenggen1987/mp4-demo express index.jade extends layoutblock contenth1 titlep Welcome to #{title}vid…

STM32F1笔记(十一)ADC

查看《STM32中文参考手册》里ADC的介绍和特性 STM32的ADC最大转换速率为1Mhz,即1us,在ADCCLK14M,采样周期为1.5个ADC时钟下得到。当ADC的时钟超过14M时,将导致结果准确度下降。 规则通道相当于正常运行的程序。注入通道就相当于中…

使用JPA和Spring 3.1进行事务配置

1.概述 本教程将讨论配置Spring Transactions ,使用Transactional批注和常见陷阱的正确方法 。 要更深入地讨论核心持久性配置,请查看Spring with JPA教程 。 有两种不同的配置事务的方法– 批注和AOP –每种都有自己的优势–我们将在这里讨论更常见的…

java epoll select_字节跳动高频面试题,操作系统/算法/Java等。

字节跳动# Java▲ 20 Java 中垃圾回收机制中如何判断对象需要回收?常见的 GC 回收算法有哪些?▲ 18 synchronized 关键字底层是如何实现的?它与 Lock 相比优缺点分别是什么?▲ 17 hashmap 和 hashtable 的区别是什么?▲…

Xamarin Android项目运行失败

Xamarin Android项目运行失败 错误信息:Build Failed: MonoDroid does not support running the previous version. Please ensure your solution builds before running or debugging it.这是由于由于项目生成失败,并找不到以前编译的结果。这时&#…

STM32F1笔记(十二)DAC

先看《STM32中文参考手册》中DAC的介绍 引脚的定义与ADC类似 这里需要留意手册提供的注意,DAC应该是输出,但是GPIO初始化配置时却要设置为模拟输入。 DAC配置示例 void DAC_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_Init…

有关为旧版代码创建存根的更多信息–测试技术7

在上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (1) SitePropertiesManager 类,以及如何通过提取接口来创建存根。 但是,如果由于旧类的源代码已被锁定在第三方JAR文件中而无法访问它,会发生什么情…

python动态时钟代码_python绘制动态时钟

桌面时钟项目描述 1、使用turtle库绘制时钟外形及表针; 2、使用datetime获取系统时间; 3、时钟动态显示 turtle库基本命令 1、turtle.setup()函数:用于启动一个图形窗口,它有四个参数turtle.setup(width, height, startx, starty)…

Ajax 学习 - 基础学习

《AJax - Async Javascript and xml - 异步的JavaScript和XML》 一、基础认识 AJax技术的目的:实现页面无刷新数据动态更改 优点: 不需要插件支持 提供WEB程序的功能 优秀的用户体验 减轻服务器带宽的负担 缺点: 破坏浏览器的前进与后退 搜索引擎…

STM32F1笔记(十三)SPI

SPI:Serial Peripheral interface,串行外围设备接口。 SPI接口一般使用4条线通信: MISO主设备数据输入,从设备数据输出。 MOSI主设备数据输出,从设备数据输入。 SCLK时钟信号,由主设备产生。 从图中可以…

红帽Openshift:入门–云中的Java EE6

现在有一段时间,我正在研究“云”。 研究它的功能,它可以做什么,为什么我们应该切换到“云”,进行讨论,与RealDolmen的云专家maartenballiauw等人交谈。 我已经在Google App Engine(用于Java)上…

python自定义函数参数_python自定义函数的参数之四种表现形式

(1)def a(x,y):print x,y 这是最常见的定义方式,调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错 (2)def a(x,y3):print x,y 提供了默认值…

osg添加纹理示例

转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <osgViewer/Viewer> #include <osg/Node>#include <osg/Geode>#include <osg/Geometry>#include <osg/Group>#include <osg/Texture2D&g…

2.运算符

Swift 支持大部分标准 C 语言的运算符&#xff0c;分为一元、二元和三元运算符。 一元运算符对单一操作对象操作&#xff08;如 -a&#xff09;。一元运算符分前置运算符和后置运算符&#xff0c;前置运算符需紧跟在操作对象之前&#xff08;如 !b&#xff09;&#xff0c;后置…

C语言开发笔记(二)volatile

volatile常用于多线程共享资源和嵌入式软件的中断。 &#xff08;一&#xff09;嵌入式软件中断中volatile的应用 volatile unsigned short g_timer3_count 0;void TIM3_IRQHandler(void) {if (TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET){TIM_ClearITPendingBit(TIM3, T…

在WebLogic 12c上运行RichFaces 4.1.0.Final

您可能已经注意到&#xff0c;我只是喜欢JSF。 不仅是Mojarra的规范和参考实现&#xff0c;而且是市场上最具创意的组件套件。 这是我一直以来最喜欢的PrimeFaces &#xff0c;当然还有RichFaces 。 这就是为什么在这里找到“在xxx上运行xxx”帖子的原因:)今天是我的RichFaces和…

maven 私服的setting.xml配置

1 <?xml version"1.0" encoding"UTF-8"?>2 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" 3 xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation"http://m…

python中的运算符_Python 中的神秘运算符

今天我们来讲讲 Python 里一个不为众人所知的运算符。你可能会觉得疑惑&#xff1a;还有我不知道的运算符&#xff1f;别急着下结论&#xff0c;先往下看看再说。 在 Python3.5 中通过 PEP465https://www.python.org/dev/peps/pep-0465 加入了 运算符&#xff0c;也就是矩阵相乘…

input type:text输入框点击输入,文字消失

<input name"Header1$txbsearch" type"text" value"18912345678" id"Header1_txbsearch" class"txbindex" οnfοcus"if (value 18912345678){value }" οnblur"if (value ){value18912345678}" sty…

C语言开发笔记(一)自动转换和强制转换

整型数据和实行数据之间可以进行运算&#xff0c;而且字符型数据可以和整型数据通用&#xff0c;所以整型、实型、字符型数据之间也是可以进行运算的&#xff0c;但在运算处理之前&#xff0c;不同类型的数据要事先转换成同一种数据类型。转换方法有两种&#xff1a;自动转换和…