文本相似性检测算法----simhash

本文介绍了SimHash算法及其在文本相似度检测中的应用。SimHash由谷歌提出,可通过计算汉明距离来评估文档间的相似度。文章详细解释了SimHash的计算步骤,并探讨了其优势与局限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hash函数

     Hash,一般翻译做" 散列 ",也有直接音译为" 哈希 "的,就是把任意长度的输入(又叫做预映射, pre-image),通过 散列算法 ,变换成固定长度的输出,该输出就是 散列值 。这种转换是一种 压缩映射 ,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的 消息摘要 的函数。

 

SimHash +汉明距离

simhash是谷歌发明的算法,可以将一个文档转换成64位的字节,然后我们可以通过判断两个字节的汉明距离就知道是否相似了。其目的是降维。

汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:

1011101 1001001之间的汉明距离是 2

"toned" "roses"之间的汉明距离是 3

首先我们来计算SimHash

①分词,把需要判断文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重。提取文档特征词得到[word,weight]这个一个数组。(举例 [美国,4])

hash算法将word转为固定长度的二进制值的字符串[hash(word),weight]。(举例 [1001014]),通过hash算法把每个词变成hash值

wordhash从左到右与权重相乘,如果为1则乘以1,如果是0则曾以-1。(举例4,-4,-4,4,-4,4)。

接着计算下个数,直到将所有分词得出的词计算完,然后将每个词第三步得出的数组中的每一个值相加。(举例美国和51区,[4,-4,-4,4,-4,4][5 -5 5 -5 5 5]得到[9 -9 1 -1 1 9]

对第四步得到的数组中每一个值进行判断,如果>0记为1,如果<0记为0。(举例[101011]

第四步得出的就是这个文档的SimHash

这样我们就能将两个不同长度的文档转换为同样长度的SimHash值,因此,我们现在可以计算第一个文档的值和第二个文档的汉明距离(一般<3就是相似度高的)。

SimHash本质上是局部敏感性的hash(如果是两个相似的句子,那么只会有部分不同),和md5之类的不一样。正因为它的局部敏感性,所以我们可以使用海明距离来衡量SimHash值的相似度。

如果想要小数形式的可以这么做:1 -汉明距离 /最长关键词数组长度。

优点:文本处理速率快,计算后的指纹能够存储于数据库,因此对海量文本相似判定非常适合。缺点:由于短文本的用于哈希计算的数据源较少,因此短文本相似度识别率低。

更多simhash转载文章的链接

 http://www.cnblogs.com/hxsyl/p/4518506.html(simhash的原理及应用)

  http://blog.youkuaiyun.com/heiyeshuwu/article/details/44117473(simhash与minhash)

http://blog.youkuaiyun.com/ygrx/article/details/12748857(JaccardSimilarity方法和哈希签名函数)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值