simhash-- 一种文档去重的算法

最早看数学之美的时候,书中就提到了这个算法,当时没有做过相关地工作,没什么具体的印象。一年前转岗时面试时别人提到了这个算法,知道了simhash可以用来解决网页等海量数据的去重问题,很高效。

然后自己大概实现了一下这个算法的python版本,试了一下,感觉还不错,mark下吧

# coding=utf-8
import os

single_bits = {}
for x in xrange(32):
    single_bits[x] = 1 << x

print single_bits
def simhash(str):
    simhash_map = {}
    for x in xrange(32):
        simhash_map[x] = 0
    for c in str:
        h = hash(c)
        for bit in single_bits:
            if h & single_bits[bit] == 0:
                simhash_map[bit] -= 1
            else:
                simhash_map[bit] += 1
    result = 0
    for x in xrange(32):
        if simhash_map[x] > 0:
            result |= single_bits[x]

    return result

def haiming_dis(simhash1, simhash2):
    dis = 0
    sh = simhash1 ^ simhash2
    for x in xrange(32):
        if sh & (1 << x) > 0:
            dis += 1
    return dis

if __name__ == "__main__":
    str = "事实上,传统比较两个文本相似性的方法,大多是将文本分词之后,转化为特征向量距离的度量,比如常见的欧氏距离、海明距离或者余弦角度等等。两两比较固然能很好地适应,但这种方法的一个最大的缺点就是,无法将其扩展到海量数据。例如,试想像Google那种收录了数以几十亿互联网信息的大型搜索引擎,每天都会通过爬虫的方式为自己的索引库新增的数百万网页,如果待收录每一条数据都去和网页库里面的每条记录算一下余弦角度,其计算量是相当恐怖的。"
    str2 = "事实上,传统比较两个文本相似性的方法,大多是将文本分词之后,转化为特征向量距离的度量,比如常见的几何距离或者余弦角度等等。两两比较固然能很好地适应,但这种方法的一个最大的优点就是,无法将其扩展到海量数据。例如,试想像baidu那种收录了数以几十亿互联网信息的大型搜索引擎,每天都会通过爬虫的方式为自己的索引库新增的数百万网页,如果待收录每一条数据都去和网页库里面的每条学习算一下余弦角度,其计算量是相当恐怖的。"
    sh1 = simhash(str)
    sh2 = simhash(str2)
    print sh1
    print sh2
    print haiming_dis(sh1, sh2)

输出结果为:

3544471205
3540285093
2
时间: 2024-10-29 03:25:56

simhash-- 一种文档去重的算法的相关文章

在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。

        在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性.精确性.清晰性.完整性.灵活性.可追溯性. ◇ 可行性分析报告:说明该软件开发项目的实现在技术上.经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由. ◇ 项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员.开发的进度.开发经费的预算.所需的硬件及软件资源等. ◇ 软件需求说明书(软件规格说明书):对所开发软件的功能.性能.

文档摘要自动提取算法——抽取式

文档摘要自动提取算法--抽取式 自动提取文档摘要的算法,主流方法分为两类:Extractive 抽取式.Abstractive 概要式.这篇我们主要将抽取式. 抽取式: 从原始文档集中抽取一些具有代表性的文本片段构成摘要,这些片段可以是整个文档中的句子.子句.段落或者小节. 抽取式方法有两个问题,如何对文本单元排序打分:如何抽取文本单元的一个子集生成摘要.分别对应着排序单元和抽取单元. 通俗讲就是,先用排序单元把文档中的单元排序,选择排名靠前的单元,再用抽取单元去除选出来的单元之间的冗余信息,得

软件开发十三种文档格式

在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性.精确性.清晰性.完整性.灵活性.可追溯性. ◇ 可行性分析报告:说明该软件开发项目的实现在技术上.经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由. ◇ 项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员.开发的进度.开发经费的预算.所需的硬件及软件资源等. ◇ 软件需求说明书(软件规格说明书):对所开发软件的功能.性能.用户界面及运行环

HTML 4.01 规定了三种文档类型

HTML 4.01 规定了三种文档类型:Strict.Transitional 以及 Frameset. 严格的——该 DTD 包含所有 HTML 元素和属性,但不包括展示性的和弃用的元素(比如 font).不允许框架集(Framesets). <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 过渡的——该 DTD 包含所有

图片文档倾斜矫正算法 附完整c代码

2年前在学习图像算法的时候看到一个文档倾斜矫正的算法. 也就是说能将一些文档图像进行旋转矫正, 当然这个算法一般用于一些文档扫描软件做后处理 或者用于ocr 文字识别做前处理. 相关的关键词: 抗倾斜 反倾斜  Deskew 等等. 最简单算法实现思路,采用 霍夫变换(Hough Transform)进行直线检测, 当然也可以用霍夫变换检测圆. 在倾斜矫正算法中,自然就是检测直线. 通过对检测出来的直线进行角度判断, 一般取 认可度最高的几条直线进行计算, 最后求取均衡后的角度值. 进行图像角度

一种文档同步的方案

一开始将很多笔记放在云笔记本上面,后来发现笔记太零碎很多没有去整理,而且笔记本上面虽然可以写文档,但是没有word上面的直观正式,决定整理一些笔记归档到word上面,这样容易对整个知识体系有所整理,打通一些静脉.想了一些思路,最终使用云网盘的方法.当然了云网盘有一些隐私泄露的风险,要自行斟酌. 使用word记录,可以在左边点击想要跳转的章节,并且导出pdf也有目录可以看,比较清晰. 这里选择了很多人推崇云同步软件(这里不提到).它可以在多个电脑之间同步文件,本着不相信云的观念,怕他一不小心将我的

VBA7种文档遍历法

Sub 在选定文档最后加入一句话() '遍历文件 Dim MyDialog As FileDialog On Error Resume Next Application.ScreenUpdating = False Set MyDialog = Application.FileDialog(msoFileDialogFilePicker) With MyDialog ' .InitialFileName = "C:\" .Filters.Clear '清除所有文件筛选器中的项目 .Fi

基于hash的文档判重——simhash

本文环境: python3.5 ubuntu 16.04 第三方库: jieba 文件寄于github: https://github.com/w392807287/angelo_tools.git simhash介绍 没多久就要写毕业论文了,据说需要查重,对文档重复判定还挺好奇的所以看了下相关的东西.发现simhash比较好用,实现简单. 顾名思义 simhash是一种hash算法,以前在我印象中hash算法是将一个对象映射成一个hash值,一般只要求当两个对象完全相同时才有相同的hash值,

1.2 Illustrator多文档的几种排列方式

本节课将为您演示,在多个文档的情况下,文档的各种排列方式.当前窗口包含三份文档.依次点击[窗口 > 排列 > 平铺]命令. 点击[平铺]命令,将所有打开的文档,以平铺的方式紧密排列. 接着依次点击[窗口 > 排列 > 在窗口中浮动]命令. 点击[在窗口中浮动]命令,将当前的文档转换为浮动窗口. 接着依次点击[窗口 > 排列 > 全部在窗口中浮动]命令. 点击[全部在窗口中浮动]命令,将所有打开的文档转换为浮动窗口. 接着依次点击[窗口 > 排列 > 合并所有