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解析xml文件实例分享
Dec 04 Python
python网络爬虫采集联想词示例
Feb 11 Python
Python实现抓取百度搜索结果页的网站标题信息
Jan 22 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 Python
Python字符串转换成浮点数函数分享
Jul 24 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
Django框架使用mysql视图操作示例
May 15 Python
Django框架首页和登录页分离操作示例
May 28 Python
python爬虫 正则表达式解析
Sep 28 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 17 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类
2006/07/15 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
python统计日志ip访问数的方法
2015/07/06 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
python实现简单学生信息管理系统
2020/04/09 Python
详解python 内存优化
2020/08/17 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
党支部承诺书范文
2014/03/28 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
护士节慰问信
2015/02/15 职场文书
公司的力量观后感
2015/06/05 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
小学新课改心得体会
2016/01/22 职场文书