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中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
简单介绍Python中的round()方法
May 15 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
Python实现的端口扫描功能示例
Apr 08 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
Python中文编码知识点
Feb 18 Python
Python中的__init__作用是什么
Jun 09 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 Python
Python 装饰器(decorator)常用的创建方式及解析
Apr 24 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
截获网站title标签之家内容的例子
2006/10/09 PHP
第十五节--Zend引擎的发展
2006/11/16 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
php json_encode值中大括号与花括号区别
2013/09/30 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
python中Genarator函数用法分析
2015/04/08 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
深入浅析Python中的yield关键字
2018/01/24 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
pytorch 预训练层的使用方法
2019/08/20 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
请解释在new与override的区别
2012/10/29 面试题
自主招生自荐信
2013/12/08 职场文书
办公室文员自荐书
2014/02/03 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
教师个人年度总结
2015/02/11 职场文书
护士实习自荐信
2015/03/06 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
一文读懂navicat for mysql基础知识
2021/05/31 MySQL