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

simhash 与传统hash 的区别

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

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

通过simhash计算结果为:

1000010010101101111111100000101011010001001111100001001011001011

1000010010101101011111100000101011010001001111100001101010001011

通过传统hash计算为:

0001000001100110100111011011110

1010010001111111110010110011101

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

simhash简介

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

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

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

  • 分词

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

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

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

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

  • 哈希和权重化

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

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

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

  • 汉明距离

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

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

Simhash局限

simhash也有其局限性:

  1. SimHash处理短文本内容准确率往往不能得到保证。由于simhash是局部敏感的hash,其可能不适合做这种短标题的重复度判断,会存在一定的误差,当文本内容较长时,使用SimHash准确率很高(即文本越长判断的准确率越高)。在处理小于500字的短文本时,simhash的表现并不是很好,所以在使用simhash前一定要注意这个细节。

2. 文本内容中每个term对应的权重如何确定要根据实际的项目需求,一般是可以使用IDF权重来进行计算

Python实现

1. 调包实现

from simhash import Simhash

def simhash_demo(text_a, text_b):
    """
   
求两文本的相似度
   
:param text_a:
    :param text_b:
    :return:
    """
   
a_simhash = Simhash(text_a)
    b_simhash = Simhash(text_b)
    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 similar

if __name__ == '__main__':
    text1 = "傲游AI专注于游戏领域,多年的AI技术积淀,一站式提供文本、图片、音/视频内容审核,游戏AI以及数据平台服务"
    text2 = "傲游AI专注于游戏领域,多年的AI技术积淀,二站式提供文本、图片、音 视频内容审核,游戏AI以及数据平台服务"
    text3 = '"傲游AI专注于游戏领域,多年的AI技术积淀,三站式提供文本、图片、音视频内容审核,游戏AI以及数据平台服务"'
    similar = simhash_demo(text1, text2)
    similar2 = simhash_demo(text1, text3)
    similar3 = simhash_demo(text2, text3)
    print(similar)
    print(similar2)
    print(similar3)

2. 自主实现

#!/usr/bin/python
# coding=utf-8
class simhash:# 构造函数def __init__(self, tokens='', hashbits=128):                      self.hashbits = hashbitsself.hash = self.simhash(tokens)# toString函数def __str__(self):return str(self.hash)# 生成simhash值def simhash(self, tokens):v = [0] * self.hashbitsfor t in [self._string_hash(x) for x in tokens]:  # t为token的普通hash值for i in range(self.hashbits):bitmask = 1 << iif t & bitmask:v[i] += 1  # 查看当前bit位是否为1,是的话将该位+1else:v[i] -= 1  # 否则的话,该位-1fingerprint = 0for i in range(self.hashbits):if v[i] >= 0:fingerprint += 1 << ireturn fingerprint  # 整个文档的fingerprint为最终各个位>=0的和# 求海明距离def hamming_distance(self, other):x = (self.hash ^ other.hash) & ((1 << self.hashbits) - 1)tot = 0while x :tot += 1x &= x - 1return tot# 求相似度def similarity (self, other):a = float(self.hash)b = float(other.hash)if a > b:return b / aelse:return a / b# 针对source生成hash值               (一个可变长度版本的Python的内置散列)def _string_hash(self, source):if source == "":return 0else:x = ord(source[0]) << 7m = 1000003mask = 2 ** self.hashbits - 1for c in source:x = ((x * m) ^ ord(c)) & maskx ^= len(source)if x == -1:x = -2return xif __name__ == '__main__':s1 = "傲游AI专注于游戏领域,多年的AI技术积淀,一站式提供文本、图片、音/视频内容审核,游戏AI以及数据平台服务"hash1 = simhash(s1.split())s2 = "傲游AI专注于游戏领域,多年的AI技术积淀,二站式提供文本、图片、音 视频内容审核,游戏AI以及数据平台服务"hash2 = simhash(s2.split())s3 = '"傲游AI专注于游戏领域,多年的AI技术积淀,三站式提供文本、图片、音视频内容审核,游戏AI以及数据平台服务"'hash3 = simhash(s3.split())print(hash1.hamming_distance(hash2) , "               " , hash1.similarity(hash2))print(hash1.hamming_distance(hash3) , "               " , hash1.similarity(hash3))print(hash2.hamming_distance(hash3) , "               " , hash2.similarity(hash3))

文本相似度计算——Simhash算法(python实现)相关推荐

  1. Finding Similar Items 文本相似度计算的算法——机器学习、词向量空间cosine、NLTK、diff、Levenshtein距离...

    http://infolab.stanford.edu/~ullman/mmds/ch3.pdf 汇总于此 还有这本书 http://www-nlp.stanford.edu/IR-book/ 里面有 ...

  2. sklearn tfidf求余弦相似度_【基础算法 】文本相似度计算

    在自然语言处理中,文本相似度是一种老生常谈而又应用广泛的基础算法模块,可用于地址标准化中计算与标准地址库中最相似的地址,也可用于问答系统中计算与用户输入问题最相近的问题及其答案,还可用于搜索中计算与输 ...

  3. 【基础算法 】文本相似度计算

    在自然语言处理中,文本相似度是一种老生常谈而又应用广泛的基础算法模块,可用于地址标准化中计算与标准地址库中最相似的地址,也可用于问答系统中计算与用户输入问题最相近的问题及其答案,还可用于搜索中计算与输 ...

  4. 文本相似度计算python lda_如何识别“答非所问”?使用gensim进行文本相似度计算...

    在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性. 评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和 ...

  5. ML:文本、图像等数值化数据相似度计算之余弦相似度计算三种python代码实现

    ML:文本.图像等数值化数据相似度计算之余弦相似度计算三种python代码实现 目录 相似度计算之余弦相似度计算 输出结果 三种python代码实现

  6. 文本相似度计算——HanLP分词+余弦相似度算法

    一.余弦相似度简介 余弦相似度(又称为余弦相似性):是通过测量两个向量的夹角的余弦值来度量它们之间的相似性.余弦值接近1,夹角趋于0,表明两个向量越相似:余弦值接近于0,夹角趋于90度,表明两个向量越 ...

  7. 如何识别“答非所问”?使用gensim进行文本相似度计算

    在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性. 评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和 ...

  8. 中文文本相似度计算工具集

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 一.基本工具集 1.分词工具 a.jieba 结巴中文分词 htt ...

  9. 最准的中文文本相似度计算工具

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx text2vec, chinese text to vetor.(文本向量化表示工具,包括词向 ...

最新文章

  1. Windows Live Writer 测试日志
  2. poj2305-Basic remains(进制转换 + 大整数取模)
  3. Memcached缓存实例
  4. matplotlib输出图形到网页_必学python库Matplotlib教程分享
  5. 求n个数的最大公因数和最小公倍数(c)
  6. Caffe + ROS + OpenCV + Qt creator
  7. 10.15 iptables filter表小案例10.16/10.17/10.18 iptables nat表应用
  8. 重学TCP协议(6) 四次挥手
  9. 使用tcpdump,adb进行手机抓包
  10. Python 迭代器,错误、异常处理
  11. 使用SDK进行二次开发流程简述
  12. 枚举项的数量限制在64个以内
  13. Nginx+Tomcat+Memcached实现session共享
  14. echart的关系图高亮_Echarts 环形图 默认高亮展示某个数据
  15. 图书管理系统数据库设计实验报告
  16. [20171122]rman filesystemio_options.txt
  17. python中shape[0~3]的意思
  18. js 中英文混合字符串 截取固定长度字节 方法封装
  19. C语言的除法与取余运算
  20. 美国OFAC发布针对个人的“网络安全相关处罚”规则

热门文章

  1. Win10管理员用户被禁用,无法登陆系统
  2. 通过SqlDbx导出*.sql
  3. 限制Editext输入字节长度
  4. 关于搭建简易广域网私人通信程序(python)一步到位!
  5. 杭电计算机学院和其他学院,浙江最好的5所大学,浙江大学一家独大,其余4所争议很大...
  6. 德鲁克日志读后感之五十三
  7. 自动化测试工具 Selenium WebDriver 入门教程
  8. linux startx无效_Linux使用startx不能进入图形界面解决方案
  9. 企业向SDN和NFV转型的最大阻碍是CXO们?
  10. 不懂精简指令集还敢说自己是程序员?