码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【代码模板】simHash算法文本查重(golang代码实现)


    ps:

    • 供自己以后参考以及供了解simhash算法的人看
    • 本代码针对通用文本查重,故所有分词的权重均为1
    • 由于没有安装分词器,所以目前只能对英文句子进行相似度检测
    • 代码只提供一个大致思路,没有做进一步优化
    package main
    
    import (
    	"fmt"
    	"strings"
    )
    
    func main() {
    	fmt.Println(hemingwayDistance(simHash("rng tes jdg edg"), simHash("rng edg tes jdg")))
    	fmt.Println(hemingwayDistance(simHash("gen.g t1 dk drx"), simHash("rng edg tes jdg")))
    	fmt.Println(hemingwayDistance(simHash("wo zhen de hui xie"), simHash("ting wo shuo xie xie ni")))
    	fmt.Println(hemingwayDistance(simHash("wo zhen de hui xie"), simHash("wo shi zhen de xie xie ni")))
    }
    
    //计算simHash值
    func simHash(statement string) int {
    	words := strings.Split(statement, " ")
    	bitCount := make([]int, 32)
    	for _, word := range words {
    		h := stringHash(word)
    		for i := 0; i < 32; i++ {
    			if h%2 == 1 {
    				bitCount[i]++
    			} else {
    				bitCount[i]--
    			}
    			h /= 2
    		}
    	}
    	ans := 0
    	x := 1
    	for i := 0; i < 32; i++ {
    		if bitCount[i] > 0 {
    			ans += x
    		}
    		x *= 2
    	}
    	return ans
    }
    
    //计算普通的字符串hash值
    func stringHash(str string) int {
    	h := 0
    	bytes := []byte(str)
    	for i := 0; i < len(bytes); i++ {
    		h = 31*h + (int(bytes[i]) & 0xff)
    	}
    	return h
    }
    
    //计算海明威距离
    func hemingwayDistance(a, b int) int {
    	count := 0
    	for i := 0; i < 32; i++ {
    		if a%2 != b%2 {
    			count++
    		}
    		a /= 2
    		b /= 2
    	}
    	return count
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    输出:

    0
    5 
    6 
    1 
    
    • 1
    • 2
    • 3
    • 4

    ps.一般<=3就认为比较相似,海明威距离值越大说明相差越多。

  • 相关阅读:
    easyexcel操作之名称匹配
    【Windows 常用工具系列 11 -- 福昕PDF搜索高亮过的文本】
    [软件工具]opencv-svm快速训练助手教程解决opencv C++ SVM模型训练与分类实现任务支持C# python调用
    varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换
    【计算机组成原理】浮点数的运算
    大公司的Java面试题集
    wsl-安装伪分布式大数据集群
    基于C#的自动校时器 - 开源研究系列文章 - 个人小作品
    当成为全球第二大汽车出口国后,中国车企的下一步是什么?
    Java加密2-MAC 对称密钥加密
  • 原文地址:https://blog.csdn.net/qq_31618549/article/details/126814506
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号