字符串匹配算法之SimHash算法

  由于实验室和互联网基本没啥关系,也就从来没有关注过数据挖掘相关的东西。在实际工作中,第一次接触到匹配和聚类等工作,虽然用一些简单的匹配算法可以做小数据的聚类,但数据量达到一定的时候就束手无策了。

  所以,趁着周末把这方面的东西看了看,做个笔记。

来历

  google的论文“detecting near-duplicates for web crawling”--------simhash。

  Google采用这种算法来解决万亿级别的网页的去重任务。  

基本思想

  simhash算法的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。

步骤:  

  1. 对于给定的一段语句,进行分词,得到有效的特征向量
  2. 为每一个特征向量设置一个权值
  3. 对每一个特征向量计算hash值,为01组成的n-bit签名
  4. 所有特征向量进行加权(1则为正,0则为负),然后累加
  5. 对于n-bit签名的累加结果,如果>0置1,否则置0
  6. 得到该语句的simhash值
  7. 根据不同语句simhash的海明距离就来判断相似程度

  解析的不好,看一下大神画的图,你就会懂了

 问题

  simhash用于比较大文本,比如500字以上效果都还蛮好,距离小于3的基本都是相似,误判率也比较低。

  这样的话,小文本呢?如何解决?

  该博客给出一个思路是,将短文本抽象出有序关键字,计算此有序字串的simhash值,寻找simhash相等的集合,缩小的搜索范围。还提到了并查集和bloom filter。

参考

http://www.lanceyan.com/tech/arch/simhash_hamming_distance_similarity.html

http://www.cnblogs.com/zhengyun_ustc/archive/2012/06/12/sim.html

http://blog.jobbole.com/21928/

 


本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-10-29 14:18:30

字符串匹配算法之SimHash算法的相关文章

Horspool 字符串匹配算法

Horspool 字符串匹配算法对Boyer-Moore算法的简化算法. Horspool 算法是一种基于后缀匹配的方法,是一种"跳跃式"匹配算法,具有sub-linear亚线性时间复杂度. Horspool 算法: 对于每个搜索窗口,该算法将窗口内的最后一个字符和模式串中的最后一个字符进行比较.如果相等,则需要进行一个校验过程.该校验过程在搜索窗口中从后向前对文本和模式串进行比较,直到完全相等或者在某个字符处不匹配.无论匹配与否,都将根据字符d在模式串中的下一个出现位置将窗口向右移动

字符串匹配算法之BF(Brute-Force)算法

蛮力搜索,比较简单的一种字符串匹配算法,在处理简单的数据时候就可以用这种算法,完全匹配,就是速度慢啊. 基本思想 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s的第二个字符起再重新和串t进行比较.  依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. 具体实现 int BFindex(String S, String T) { i

带有通配符的字符串匹配算法

问题描述 带有通配符的字符串匹配算法 C/C++实现 之前面试.遇见一个字符串匹配问题. 大概是这样的: 正常的匹配就不说了, 第一,'*'可以代表连续多个字符. 第二,'a+'可以代表'aa', 'aaa', 'aaaa'.....类推. 第三,'.'代表一个任意字符(非*, +): 字符串str,模式串假设名为mdstr; 我当时想的是str,mdstr都是有'*",等符号的. 后来觉得str应该没有* 我给出了一个可行的算法.暂不提,后来面试官说.两个字符串都允许*. 谁能提供一个思路.考

simhash算法原理及实现

转载自: 点击打开链接 背景 如何设计一个比较两篇文章相似度的算法?可能你会回答几个比较传统点的思路: 一种方案是先将两篇文章分别进行分词,得到一系列特征向量,然后计算特征向量之间的距离(可以计算它们之间的欧氏距离.海明距离或者夹角余弦等等),从而通过距离的大小来判断两篇文章的相似度. 另外一种方案是传统hash,我们考虑为每一个web文档通过hash的方式生成一个指纹(finger print). 下面,我们来分析下这两种方法. 采取第一种方法,若是只比较两篇文章的相似性还好,但如果是海量数据

基于局部敏感哈希的协同过滤算法之simHash算法

搜集了快一个月的资料,虽然不完全懂,但还是先慢慢写着吧,说不定就有思路了呢. 开源的最大好处是会让作者对脏乱臭的代码有羞耻感. 当一个做推荐系统的部门开始重视[数据清理,数据标柱,效果评测,数据统计,数据分析]这些所谓的脏活累活,这样的推荐系统才会有救. 求教GitHub的使用. 简单不等于傻逼. 我为什么说累:我又是一个习惯在聊天中思考前因后果的人,所以整个大脑高负荷运转.不过这样真不好,学习学成傻逼了. 研一的最大收获是让我明白原来以前仰慕的各种国家自然基金项目,原来都是可以浑水摸鱼忽悠过去

彻底弄懂LSH之simHash算法

马克·吐温曾经说过,所谓经典小说,就是指很多人希望读过,但很少人真正花时间去读的小说.这种说法同样适用于"经典"的计算机书籍. 最近一直在看LSH,不过由于matlab基础比较差,一直没搞懂.最近看的论文里几乎都是用simHash来实现LSH,从而进行ANN. 有空看看基于滑动窗口的论文相似性检测. 如何用matlab画出一个数列(函数)的收敛过程(菱形收敛.圆形收敛)? 学完分布式了,我打算自己学WordPress,建立自己的独立博客,放在云平台或者服务器空间,然后学着分析流量和负载

字符串搜索的Sunday算法

字符串搜索的Sunday算法 public class SUNDAY { public SUNDAY() { // // TODO: 在此处添加构造函数逻辑 // } public int QfindChr(string str, string Sfind) { int str_length = 0; int fin_length = 0; int find_count = 0; int start = 0; int moveNum = 0; if (str.Length < Sfind.Len

c++ monte carlo 字符串匹配算法,

问题描述 c++ monte carlo 字符串匹配算法, monte carlo 字符串匹配 求代码,求注释啊.谢谢好心人

最简单的php中字符串匹配算法教程

本文实例讲述了php中最简单的字符串匹配算法,具体实现方法如下:  代码如下 复制代码 <?php /* 最简单字符串匹配算法php实现方式   T: ababcabc P: abc   0.          1.          2. ababcabc    ababcabc    ababcabc |||          |||          ||| abc          abc          abc (X)          (X)          (O)   3.