去重算法,simhash,shingle,百度去重算法

文章对比了不同去重算法。百度去重算法简单,找出文章最长的3句话做hash签名,准确率和召回率超80%。shingle算法原理复杂,对工程实现不友好,速度慢,难以处理海量数据,其他算法可看微博讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对比其他算法
『百度的去重算法』

百度的去重算法最简单,就是直接找出此文章的最长的n句话,做一遍hash签名。n一般取3。 工程实现巨简单,据说准确率和召回率都能到达80%以上。

『shingle算法』

shingle原理略复杂,不细说。 shingle算法我认为过于学院派,对于工程实现不够友好,速度太慢,基本上无法处理海量数据。

『其他算法』

具体看微博上的讨论

可以使用golang的hash/crc32包来计算simhash算法中的哈希值,具体实现可以参考以下代码: ``` package simhash import ( "bytes" "hash/crc32" ) // Simhash represents a 64-bit hash value type Simhash uint64 // NewSimhash calculates the simhash of the given data func NewSimhash(data []byte) Simhash { // Step 1: tokenize data into shingles shingles := tokenize(data) // Step 2: compute the weighted frequency counts of shingles counts := countShingles(shingles) // Step 3: create the simhash var simhash Simhash for shingle, weight := range counts { hash := crc32.ChecksumIEEE([]byte(shingle)) for i := 0; i < 32; i++ { if hash&(1<<uint(i)) != 0 { simhash += Simhash(weight) } else { simhash -= Simhash(weight) } } } return simhash } // tokenize splits the given data into shingles func tokenize(data []byte) []string { shingles := make([]string, 0) var buffer bytes.Buffer for i := 0; i < len(data); i++ { if data[i] == ' ' { shingles = append(shingles, buffer.String()) buffer.Reset() continue } buffer.WriteByte(data[i]) } if buffer.Len() > 0 { shingles = append(shingles, buffer.String()) } return shingles } // countShingles computes the weighted frequency counts of the given shingles func countShingles(shingles []string) map[string]int { counts := make(map[string]int) for _, shingle := range shingles { counts[shingle]++ } return counts } ``` 这段代码实现了simhash算法的三个步骤:将输入数据分割为shingles,计算shingles的加权频率,以及计算simhash值。其中,crc32包用于计算哈希值,bytes包用于处理字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值