You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求SimHash算法的详细原理剖析与实现方案指导

SimHash 详解:原理、作用与实现示例

一、基本定义

SimHash 是一种**局部敏感哈希(LSH)**算法,核心特性是:相似的输入会生成相似的哈希值,而普通哈希算法中相似输入的哈希值可能差异极大。它专门用于将高维的文本(或其他高维数据)向量压缩为低维哈希值,同时保留输入的相似性特征。

二、核心作用

  • 快速检测重复/相似文本:广泛应用于搜索引擎内容去重、垃圾邮件识别、学术论文查重、社区内容审核等场景
  • 降低计算复杂度:将高维向量的相似性对比,转化为低维哈希值的汉明距离计算,计算效率提升几个数量级

三、算法工作原理(核心步骤)

SimHash 的执行流程分为5个关键步骤:

  1. 分词与权重赋值:将文本拆分为关键词(分词、去停用词),为每个词赋予权重(常用 TF-IDF 值,词频越高、在语料中越稀有,权重越高)
  2. 词向量映射:为每个关键词生成固定长度的二进制向量(可通过预训练词向量转换,或直接对词做哈希得到二进制串)
  3. 加权求和:对每个词的二进制向量按权重加权:若向量某一位是1,则加上对应权重;是0则减去对应权重,最终得到一个由实数组成的中间向量
  4. 二值化:将中间向量的每一位与0比较,大于等于0则设为1,小于0则设为0,得到最终的 SimHash 二进制串(或转为十进制存储)
  5. 相似性判断:计算两个 SimHash 值的汉明距离(二进制串中不同位的数量),距离越小则内容越相似(通常汉明距离≤3时,认为内容高度相似)

四、Python 实现示例

以下是简化版的 SimHash 实现,用词频作为权重、内置哈希生成词向量,可直接运行测试:

import jieba
from collections import Counter

def simhash(text, hash_bits=64):
    # 1. 分词与权重计算(简化用词频占比作为权重)
    words = jieba.lcut(text)
    word_counts = Counter(words)
    total_words = sum(word_counts.values())
    weights = {word: count / total_words for word, count in word_counts.items()}

    # 2. 初始化加权向量
    weight_vector = [0.0] * hash_bits

    for word, weight in weights.items():
        # 3. 生成词的固定长度哈希二进制串
        word_hash = hash(word)
        binary_str = bin(word_hash & ((1 << hash_bits) - 1))[2:].zfill(hash_bits)
        
        # 4. 加权更新向量
        for i in range(hash_bits):
            weight_vector[i] += weight if binary_str[i] == '1' else -weight

    # 5. 二值化生成最终SimHash值
    simhash_val = 0
    for i in range(hash_bits):
        if weight_vector[i] >= 0:
            simhash_val |= (1 << (hash_bits - 1 - i))
    
    return simhash_val

def hamming_distance(hash1, hash2, hash_bits=64):
    # 计算两个SimHash值的汉明距离
    xor_result = hash1 ^ hash2
    return bin(xor_result).count('1')

# 测试用例
text1 = "人工智能是一门研究如何使计算机模拟、延伸和扩展人类智能的技术科学"
text2 = "人工智能是研究计算机模拟、延伸与扩展人类智能的技术科学"
text3 = "今天天气晴朗,适合户外散步"

hash1 = simhash(text1)
hash2 = simhash(text2)
hash3 = simhash(text3)

print(f"文本1 SimHash: {hex(hash1)}")
print(f"文本2 SimHash: {hex(hash2)}")
print(f"文本3 SimHash: {hex(hash3)}")
print(f"文本1与文本2汉明距离: {hamming_distance(hash1, hash2)}")
print(f"文本1与文本3汉明距离: {hamming_distance(hash1, hash3)}")

说明:实际生产环境中,建议用更稳定的哈希函数(如 MD5 转二进制)替代内置 hash(),权重可改用 TF-IDF 提升准确性,词向量也可替换为预训练的语义向量(如 Word2Vec)增强语义相似性识别能力。

五、关键注意事项

  • 哈希位数:常用64位,位数越高区分度越好,但存储和计算成本也会上升
  • 阈值调整:汉明距离的判定阈值需根据场景调整,比如搜索引擎去重用≤3,内容查重可设为≤5
  • 性能优化:处理大规模数据时,可通过分桶存储(按哈希值前N位分桶)进一步缩小相似性比对的范围

内容的提问来源于stack exchange,提问作者hoodie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:34:52