simhash&hamming distince
simhash 是一种长文本的查重算法
SimHash本身属于一种局部敏感hash,其主要思想是降维,将高维的特征向量转化(加权)成低位的hash,通过算出两个海明距离来确定两篇文章的相似度,海明距离越小,相似度越低,一般海明距离为3就代表两篇文章相同。
simhash的算法具体分为5个步骤:分词、hash、加权、合并、降维
在实际使用过程中,我们可以使用simhash 分块来操作,假设对64位的SimHash,查找海明距离在3以内的所有签名。可以把64位的二进制签名均分成4块,每块16位。根据鸽巢原理(也称抽屉原理,见组合数学),如果两个签名的海明距离在3以内,它们必有一块完全相同。
局限
对海明距离敏感度较低:
SimHash主要依赖于海明距离来衡量相似度,但对于一些文档的微小变化,海明距离可能无法充分反映实际的相似度变化。例如,一些文档内容变化较小,但其SimHash值的海明距离可能较大,导致无法识别为相似文档。
对局部性敏感度较低:
SimHash是一种全局哈希算法,它对文档中的局部变化(例如插入或删除某段文字)不敏感。也就是说,如果文档的局部变化较大,SimHash可能会产生较大的哈希值变化,影响相似度判断。
维度限制:
SimHash通常将文档映射到固定长度的二进制向量(如64位或128位)。这种固定长度限制了算法的表达能力,可能无法捕捉到非常细微的文档差异。
碰撞问题:
尽管SimHash在设计上减少了哈希碰撞的可能性,但对于非常大的文档集合,仍然可能出现不同文档映射到相同SimHash值的情况,导致误判。
权重忽略:
在生成SimHash值时,通常会对文档中的特征词赋予一定的权重。但这种权重的设定是全局的,无法针对特定文档进行细致的调整,可能导致某些关键特征被忽略。
适用范围有限:
SimHash主要适用于文本相似度计算,对于图像、音频等其他类型的数据,其效果可能不如专门设计的哈希算法(如图像哈希、音频指纹)好。
SimHash处理短文本内容准确率往往不能得到保证。由于simhash是局部敏感的hash,其可能不适合做这种短标题的重复度判断,会存在一定的误差,当文本内容较长时,使用SimHash准确率很高(即文本越长判断的准确率越高)。在处理小于500字的短文本时,simhash的表现并不是很好,所以在使用simhash前一定要注意这个细节。
SimHash在大规模文本去重和相似文档检测方面仍然是一种高效且实用的算法
场景
- 文本去重
- 内容推荐
- 版本控制、变更检测
- 网页去重
- ……
实例 重复推荐
设计方案:
系统架构
- 数据预处理模块:
- 文本清洗:对文章进行预处理,包括去除HTML标签、标点符号、停用词等。
- 特征提取:提取文章的关键词或特征词,并计算词频。
- SimHash生成模块:
- SimHash计算:基于特征词生成每篇文章的SimHash值。
- 哈希存储和索引模块:
- 分块存储:将生成的SimHash值分块存储,以便快速查找和比对(例如将64位SimHash分成4个16位的块)。
- 倒排索引:构建倒排索引,将SimHash块与文章ID关联起来,方便快速查找相似文章。
- 相似度检测模块:
- 海明距离计算:在推荐新文章时,计算新文章的SimHash值,并通过哈希索引查找海明距离在阈值范围内的文章。
- 去重策略:根据海明距离和设定的相似度阈值,过滤掉相似度过高的文章,避免推荐重复内容。
- 推荐引擎模块:
- 个性化推荐:结合用户的兴趣和历史浏览记录,推荐与用户兴趣相似但不重复的文章。
- 实时更新:定期更新SimHash值和索引,以确保新发布的文章能够及时参与推荐。
具体流程
-
文章入库:
-
每当有新文章发布时,进行数据预处理和特征词提取,并根据特征词和其权重生成生成该文章的SimHash值。
-
将SimHash值分块并存储到哈希表中,同时更新倒排索引。(可以借助redis :使用Redis的哈希(Hash)结构存储文章ID和SimHash映射;使用Redis的集合(Set)结构存储每个SimHash块对应的文章ID列表。)
(正排索引用于快速获取文档的SimHash值及其相关信息;倒排索引用于根据SimHash分块快速查找可能相似的文档ID列表。)
-
-
去重检测:
- 用户请求推荐时,系统首先生成新文章的SimHash值。
(通过分块查找候选文档,然后计算海明距离以筛选出真正相似的文档)
- 使用倒排索引查找与新文章相似的文章,计算海明距离。
- 过滤掉海明距离在阈值范围内的文章,避免推荐重复内容。
-
个性化推荐:
- 基于用户的浏览历史和兴趣模型,筛选符合用户兴趣的文章。
- 在去重检测后,从剩余的文章中挑选出最符合用户兴趣的文章进行推荐。