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

demo:
package main import (
"strings"
"math/big"
"fmt"
) type SimHash struct {
IntSimHash *big.Int
HashBits int
} func main() {
str := "有理数是“数与代数”领域中的重要内容之一,是数、代数式、方程、不等式、直角坐标系、函数、统计等数学内容以及相关学科知识的基础"
str2 := "有理数是“数与代数”领域中的重要内容之一,是继续学习实数、代数式、方程、不等式、直角坐标系、函数、统计等数学内容以及相关学科知识的基础"
//str3:="nai nai ge xiong cao"
s := params()
//str hash 值
hash := s.Simhash(str)
fmt.Println(hash)
////str2 距离
hash2 := s.Simhash(str2)
fmt.Println(hash2) ////距离
ts := s.HammingDistance(hash, hash2)
fmt.Println(ts)
////计算相似度
sm := s.Similarity(hash, hash2)
fmt.Println(sm) } /**
距离 补偿
*/
func (s *SimHash) HammingDistance(hash, other *big.Int) *big.Int {
hase_v := new(big.Int)
c_w := hase_v.Xor(hash, other)
fbIng := big.NewInt(1) fbIng.Lsh(fbIng, uint(s.HashBits))
bit_big := new(big.Int)
t_mak := bit_big.Sub(fbIng, big.NewInt(1))
c_result := new(big.Int)
c_result.And(c_w, t_mak)
//fmt.Println(c_result) tot := big.NewInt(0)
for c_result.Cmp(big.NewInt(0)) > 0 {
tot.Add(tot, big.NewInt(1))
ts := new(big.Int)
ts.Sub(c_result, big.NewInt(1))
c_result.And(c_result, ts)
}
return tot
} /**
相似度
*/
func (s *SimHash) Similarity(hash, other *big.Int) float64 {
a := new(big.Rat)
a.SetInt(hash)
b := new(big.Rat)
b.SetInt(other)
val := new(big.Rat)
if a.Cmp(b) > 0 {
val.Quo(b, a)
f, _ := val.Float64()
return f
}
val.Quo(a, b)
f, _ := val.Float64()
return f } /**
海明距离hash
*/
func (s *SimHash) Simhash(str string) *big.Int {
m := strings.Split(str, ",") token_int := make([]int, s.HashBits)
for i := 0; i < len(m); i++ {
temp := m[i]
t := s.Hash(temp)
//fmt.Println(t)
for j := 0; j < s.HashBits; j++ {
fbIng := big.NewInt(1)
bitMask := fbIng.Lsh(fbIng, uint(j))
statusBig := new(big.Int)
statusBig.And(t, bitMask)
if statusBig.Cmp(big.NewInt(0)) != 0 {
token_int[j] += 1
} else {
token_int[j] -= 1
}
} }
fingerprint := big.NewInt(0)
for i := 0; i < s.HashBits; i++ {
if token_int[i] >= 0 {
oneBig := big.NewInt(1)
tbig := big.NewInt(0)
fingerprint.Add(fingerprint, tbig.Lsh(oneBig, uint(i)))
}
}
return fingerprint
} /**
初始化
*/
func params() (s *SimHash) {
s = &SimHash{}
s.HashBits = 128
return s
} /**
hash 值
*/
func (s *SimHash) Hash(token string) *big.Int {
if token == "" {
return big.NewInt(0)
} else {
//fmt.Println(token)
bigIntToken := big.NewInt(int64(token[0]))
funit := new(big.Int)
x := funit.Lsh(bigIntToken, 7)
m := big.NewInt(1000003)
mslB := big.NewInt(1)
mask := mslB.Lsh(mslB, uint(s.HashBits))
tsk_b := mask.Sub(mask, big.NewInt(1))
for i := 0; i < len(token); i++ {
tokens := big.NewInt(int64(token[i]))
x.Mul(x, m)
x.Xor(x, tokens)
x.And(x, tsk_b)
}
x = x.Xor(x, big.NewInt(int64(len(token))))
if x == big.NewInt(-1) {
x = big.NewInt(-2)
}
return x
}
}
golang 实现海明距离 demo的更多相关文章
- 基于海明距离的加权平均值人职匹配模型(Sqlserver2014/16内存表实现)
最近给某大学网站制作一个功能,需要给全校所有的学生提供就业单位发布职位的自动匹配,学生登陆就业网,就可以查看适合自己的职位,进而可以在线投递. 全校有几万名学生,注册企业发布的职位也有上万,如何在很短 ...
- 海量数据相似度计算之simhash和海明距离
通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...
- 64. 海明距离(Hamming Distance)
[本文链接] http://www.cnblogs.com/hellogiser/p/hamming-distance.html [介绍] 在信息领域,两个长度相等的字符串的海明距离是在相同位置上不同 ...
- Matlab计算两集合间的海明距离
一.问题描述 B1[1 2 3 4 5 6 7 8 9] B2[12 13 14 21 31 41 51 1 1 81 1 1] 两个十进制矩阵,行数不一样,分别是n1和n2,列数必须一致,为nwo ...
- 使用simhash以及海明距离判断内容相似程度
算法简介 SimHash也即相似hash,是一类特殊的信息指纹,常用来比较文章的相似度,与传统hash相比,传统hash只负责将原始内容尽量随机的映射为一个特征值,并保证相同的内容一定具有相同的特征值 ...
- python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客
python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客 python海明距离 2009-10-01 09:50:41| 分类: Python | 标签: |举报 |字号大中小 ...
- Tag Archives: 海明距离
在前一篇文章 <海量数据相似度计算之simhash和海明距离> 介绍了simhash的原理,大家应该感觉到了算法的魅力.但是随着业务的增长 simhash的数据也会暴增,如果一天100w, ...
- 【佛山市选2013】JZOJ2020年8月7日提高组T3 海明距离
[佛山市选2013]JZOJ2020年8月7日提高组T3 海明距离 题目 描述 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数.异或的规则为: 0 XOR 0 = 0 1 XOR ...
- 海明距离hamming distance
仔细阅读ORB的代码,发现有很多细节不是很明白,其中就有用暴力方式测试Keypoints的距离,用的是HammingLUT,上网查了才知道,hamming距离是相差位数.这样就好理解了. 我理解的Ha ...
随机推荐
- java 内存分析之this
package Demo; /** * this 的值是当前对象的引用 * @author Aaron * */ public class Boy { private int age; public ...
- 带你从零学ReactNative开发跨平台App开发[react native SqlLite 终极运用](十二)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- C#自定义控件的创建
1.创建自定义控件 选择[经典桌面]——[窗体控件库] 2.添加控件,组合成一个新的控件 自定义控件功能:打开一张图片,将图片展示在pictureBox控件中,并将图片的名称.大小.尺寸显示出来 控件 ...
- Jquery Ajax 提交json数据
在MVC控制器(这里是TestController)下有一个CreateOrder的Action方法 [HttpPost] public ActionResult CreateOrder(List&l ...
- Redis学习---Redis操作之List
List操作,redis中的List在在内存中按照一个name对应一个List来存储 lpush(name,values) --> 实际上是左添加 # 在name对应的list中添加元素,每个新 ...
- Exchange & Office 365最小混合部署
前言 这篇文章的主题是混合部署~ 混合使得本地组织和云环境像一个单一的.协作紧密的组织一样运作.当组织决定进行混合部署,达到本地Exchange Server和Office 365共存的状态时,就会面 ...
- right here waiting的歌词
right here waiting的歌词 2006-12-30 17:36 匿名 | 分类:音乐 | 该问题已经合并到>> right here waiting的歌词有吗? 扫描二维 ...
- print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, 返回None 则不是闭包
print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, None 则不是闭包
- setnx redis
使用锁 1)setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功:如果返回0则没有获取到锁,转向2.2.)get(lockkey)获取值oldExpireTime ,并将 ...
- 为什么说Java中只有值传递----说服自己
在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本文. 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递.如果是个引用,就 ...