>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19583 个阅读者 刷新本主题
 * 贴子主题:  对simhash算法的一些思考 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-03-15 16:55:26     消息  查看  搜索  好友  邮件  复制  引用

     最近研究文档去重技术,研究了一下去重算法后,最终选择了simhash算法.这个算法相对而言最简单,效果又好,难怪被google选用.

           简单来讲,simhash分为3步:

           1.将文本去掉格式后,分词.

           2.将每一个分词hash为一组固定长度的数列.比如32bit的一个整数.

           3.建立一个长度为32的整数数组(假设要生成32位的数字指纹,也可以是其它数字),对每一个分词hash后的数列进行判断,如果是1000...1,那么数组的第一位和末尾一位加1,中间的30位减一,也就是说,逢1加1,逢0减1.一直到把所有的分词hash数列全部判断完毕.最后对数组进行判断,大于0的记为1,小于等于0的记为0,得到一个32bit的数字指纹.

           在实际编码中,有如下几点体会:

         1.中文文档进行分词后,其中的一些助词,语气词,人称代词等常用字会带来很大的干扰,比如说"的","我","了","这"等,要把这些词去掉,增加去重精度.

         2.分词后,尽量给每个分词一个权重数字,代表这个词的重要程度,这样能够极大提高精度.比较简单的算法是,把每个词在文章中出现的次数作为权重.比如,"美国总统克林顿登上了长城,这是登上长城的第x位美国总统.",那么分词后,长城权重2,美国权重2,总统权重2,克林顿权重1,其它分词权重0,可以忽略掉.

         3.分词算法,我参考了中科院的ICTCLAS.可以直接分析出文章的关键词,只让关键词参与到simhash算法中会提高效率和效果.

         4.对大量文章通过simhash提取数字指纹后,指纹间的海明距离代表了文章的相近程度.对于二进制来将,海明距离是两个数字的异或后1的个数.

         我觉得下面这个算法计算1的个数很高效:
    int Count(int v)
    {

        int num=0;

        while(v)

        {

            v&=(v-1);

            num++;

        }

        return num;
     }

         5.对于大量数字指纹的保存,需要考虑一种高效的数据结构.我没有自己设计,而是直接将数字指纹保存到了全文检索引擎提供的数据库中,这样的好处是,去重和全文检索可以和谐统一到一起.全文检索引擎我选择了xapian,实际用后,没有发现什么缺点.



----------------------------
原文链接:https://blog.51cto.com/2588084/558873

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-19 10:12:47 重新编辑]
  Java面向对象编程-->接口
  JavaWeb开发-->开发JavaMail Web应用
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->基于UDP的数据报和套接字
  精通Spring-->Vue简介
  Vue3开发-->Vue组件开发基础
  整理得吐血了,二叉树、红黑树、B、B+树超齐全,快速搞定数据...
  有关图片的LZW算法的原理
  算法学习与收集:一些有用的算法网站和网页
  浅谈算法,一些感悟
  java 通配符的应用范例, java 排序算法
  基于SQL的数据库算法研究
  算法之原码、补码、反码
  基于JavaScript的Base64编码、解码算法
  无向图的最短路径求解算法之——Dijkstra算法
  全排列的六种算法
  一种码位倒置算法
  为什么要学数据结构?
  比较迭代和递归:人理解迭代 ,神理解递归
  谷歌面试算法题:两个排序数组的中位数
  好书推荐:《小灰的算法之旅》
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。