python实现simhash算法实例


Posted in Python onApril 25, 2014

Simhash的算法简单的来说就是,从海量文本中快速搜索和已知simhash相差小于k位的simhash集合,这里每个文本都可以用一个simhash值来代表,一个simhash有64bit,相似的文本,64bit也相似,论文中k的经验值为3。该方法的缺点如优点一样明显,主要有两点,对于短文本,k值很敏感;另一个是由于算法是以空间换时间,系统内存吃不消。

python实现simhash算法实例

#!/usr/bin/python
# coding=utf-8
class simhash:    #构造函数
    def __init__(self, tokens='', hashbits=128):        
        self.hashbits = hashbits
        self.hash = self.simhash(tokens);
    #toString函数    
    def __str__(self):
        return str(self.hash)
    #生成simhash值    
    def simhash(self, tokens):
        v = [0] * self.hashbits
        for t in [self._string_hash(x) for x in tokens]: #t为token的普通hash值           
            for i in range(self.hashbits):
                bitmask = 1 << i
                if t & bitmask :
                    v[i] += 1 #查看当前bit位是否为1,是的话将该位+1
                else:
                    v[i] -= 1 #否则的话,该位-1
        fingerprint = 0
        for i in range(self.hashbits):
            if v[i] >= 0:
                fingerprint += 1 << i
        return fingerprint #整个文档的fingerprint为最终各个位>=0的和
    #求海明距离
    def hamming_distance(self, other):
        x = (self.hash ^ other.hash) & ((1 << self.hashbits) - 1)
        tot = 0;
        while x :
            tot += 1
            x &= x - 1
        return tot
    #求相似度
    def similarity (self, other):
        a = float(self.hash)
        b = float(other.hash)
        if a > b : return b / a
        else: return a / b
    #针对source生成hash值   (一个可变长度版本的Python的内置散列)
    def _string_hash(self, source):        
        if source == "":
            return 0
        else:
            x = ord(source[0]) << 7
            m = 1000003
            mask = 2 ** self.hashbits - 1
            for c in source:
                x = ((x * m) ^ ord(c)) & mask
            x ^= len(source)
            if x == -1:
                x = -2
            return x
             

if __name__ == '__main__':
    s = 'This is a test string for testing'
    hash1 = simhash(s.split())
    s = 'This is a test string for testing also'
    hash2 = simhash(s.split())
    s = 'nai nai ge xiong cao'
    hash3 = simhash(s.split())
    print(hash1.hamming_distance(hash2) , "   " , hash1.similarity(hash2))
    print(hash1.hamming_distance(hash3) , "   " , hash1.similarity(hash3))

 

Python 相关文章推荐
python冒泡排序算法的实现代码
Nov 21 Python
Python中字符串对齐方法介绍
May 21 Python
在Django的session中使用User对象的方法
Jul 23 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python编程培训 python培训靠谱吗
Jan 17 Python
python实现图片批量压缩程序
Jul 23 Python
Python实现DDos攻击实例详解
Feb 02 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
深入了解Python 变量作用域
Jul 24 Python
python 利用opencv实现图像网络传输
Nov 12 Python
Python OpenCV之常用滤波器使用详解
Apr 07 Python
python实现DNS正向查询、反向查询的例子
Apr 25 #Python
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 #Python
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 #Python
python中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 #Python
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
Apr 25 #Python
Python time模块详解(常用函数实例讲解,非常好)
Apr 24 #Python
Python 时间操作例子和时间格式化参数小结
Apr 24 #Python
You might like
使用php 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
对Python中画图时候的线类型详解
2019/07/07 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
html5简介及新增功能介绍
2020/05/18 HTML / CSS
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
数据库基础的一些面试题
2012/02/25 面试题
庆七一活动总结
2014/08/27 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
亲属关系公证书样本
2015/01/23 职场文书
总账会计岗位职责
2015/04/02 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
python实现过滤敏感词
2021/05/08 Python