• 【代码模板】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就认为比较相似,海明威距离值越大说明相差越多。

  • 相关阅读:
    OpenAI内斗剧情反转!微软力保ChatGPT之父回归?
    经典蓝牙Inquiry过程的跳频
    【JavaScript】Web API基础(五)
    驱动开发 day3 9/12
    516. 最长回文子序列
    SpringMVC-全面详解(学习总结---从入门到深化)
    【upload靶场12-16】截断、图片马
    java版直播商城平台规划及常见的营销模式有哪些?
    makefile的基本使用
    uniapp-vue3-微信小程序-标签选择器wo-tag
  • 原文地址:https://blog.csdn.net/qq_31618549/article/details/126814506