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 相关文章推荐
ansible作为python模块库使用的方法实例
Jan 17 Python
python使用KNN算法手写体识别
Feb 01 Python
使用Python爬取最好大学网大学排名
Feb 24 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
Python实现深度遍历和广度遍历的方法
Jan 22 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
将Python文件打包成.EXE可执行文件的方法
Aug 11 Python
关于Numpy中的行向量和列向量详解
Nov 30 Python
Pycharm安装python库的方法
Nov 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
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
javascript轮播图算法
2016/10/21 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
js中url对象化管理分析
2017/12/29 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
Python遍历目录中的所有文件的方法
2016/07/08 Python
详解python基础之while循环及if判断
2017/08/24 Python
python字符串常用方法
2018/06/14 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
2014年网管工作总结
2014/12/11 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
党员身份证明材料
2015/06/19 职场文书
python关于集合的知识案例详解
2021/05/30 Python
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
Github 使用python对copilot做些简单使用测试
2022/04/14 Python