有笨蛋嘛?
Graph Neural Networks 炼丹中...
睡大觉中
前方高能反应!
BUG 修复进度 99%
到底在干嘛?
GROMACS 跑起来了吗?
Tailwind CSS 拯救前端
在干嘛呢?
MD 模拟什么时候才能出图啊
写算法中
有笨蛋嘛?
BUG 修复进度 99%
睡大觉中
前方高能反应!
Evernightの宝藏之地
首页项目归档照片墙音乐说说友链关于
封面

LSH算法原理讲解:从文本相似到大规模候选检索

写作时间:2026-05-19
约 5 分钟 · 1740 字

前置知识:什么是哈希(Hash)算法?

在深入 LSH 之前,我们需要先理解基础的哈希算法。

简单来说,哈希函数(Hash Function)就像是一个“数字指纹生成器”。它接收任意长度的数据(如一段文本、一篇文档),并将其映射为一个固定长度的较短字符串或数值(即哈希值或签名)。

传统哈希算法(如 MD5、SHA-256)的核心特征是:

  1. 唯一性与确定性:绝对相同的输入,一定会得到完全相同的哈希值。
  2. 雪崩效应:输入数据哪怕仅仅改变了一个标点符号,输出的哈希值也会变得面目全非、毫无规律。这在密码学中非常重要,能用来保证数据未被篡改。

然而,传统哈希的“雪崩效应”在相似度检索任务中反而成为了阻碍。如果我们想通过比对哈希值来判断两篇文章是否相似,传统哈希算法完全无能为力——因为两篇高度相似但不完全相同的文章,它们的哈希值是截然不同且没有任何关联的。

这也恰恰引出了本文的主角——LSH(局部敏感哈希)。它一反常态,特意设计出了一种**“让越相似的数据,越容易产生相同的哈希值(即越容易发生碰撞)”**的过滤机制。


算法背景:LSH解决了什么痛点?

在实际系统中,“相似检索/去重”的难点通常不在于“能否计算”,而在于计算代价是否可接受。 当文档规模达到百万、千万级时,直接比较全部文档对几乎不可行。

LSH(Locality-Sensitive Hashing)的核心机制是:

  • 使高相似对象以较高概率落入同一桶(进入候选集)
  • 使低相似对象以较高概率在早期被过滤

因此,它特别适合“先粗筛、再精排”的检索流程。

常见应用领域

  1. 搜索与推荐:相似文章召回、相似商品召回、候选集构建。
  2. 数据清洗与去重:网页去重、日志去重、训练语料去重。
  3. 反作弊与内容安全:近重复内容识别、模板化刷屏检测。
  4. 大模型数据工程:预训练/微调语料去重,降低数据污染与过拟合风险。

示例文本集合

设文档集合:


D={d1,d2,d3,d4,d5}D = \{d_1,d_2,d_3,d_4,d_5\}D={d1​,d2​,d3​,d4​,d5​}
  • d1=“今天北京天气很好”d_1=\text{“今天北京天气很好”}d1​=“今天北京天气很好”
  • d2=“今天北京天气真好”d_2=\text{“今天北京天气真好”}d2​=“今天北京天气真好”
  • d3=“昨天上海天气很差”d_3=\text{“昨天上海天气很差”}d3​=“昨天上海天气很差”
  • d4=“今天北京天气挺好”d_4=\text{“今天北京天气挺好”}d4​=“今天北京天气挺好”
  • d5=“深度学习推荐系统”d_5=\text{“深度学习推荐系统”}d5​=“深度学习推荐系统”

直观上,d1d_1d1​、d2d_2d2​ 和 d4d_4d4​ 句式高度相似(仅一字之差),而 d3d_3d3​、d5d_5d5​ 语义或结构上有显著差异。


Shingling(文本 → q-gram集合)

先将文本映射为字符 qqq-gram 集合。这里取字符 3-gram。

文本 3-gram 集合
d1d_1d1​ {今天北, 天北京, 北京天, 京天气, 天气很, 气很好}
d2d_2d2​ {今天北, 天北京, 北京天, 京天气, 天气真, 气真好}
d3d_3d3​ {昨天上, 天上海, 上海天, 海天气, 天气很, 气很差}
d4d_4d4​ {今天北, 天北京, 北京天, 京天气, 天气挺, 气挺好}
d5d_5d5​ {深度学, 度学习, 学习推, 习推荐, 推荐系, 荐系统}

随后可用 Jaccard 相似度刻画集合之间的相似性:


J(A,B)=∣A∩B∣∣A∪B∣J(A,B)=\frac{|A\cap B|}{|A\cup B|}J(A,B)=∣A∪B∣∣A∩B∣​

小幅文本改动通常只影响局部 gram,因此 Jaccard 往往仍较高。


MinHash(集合 → 签名向量)

目的:不直接计算交并集,也能快速估计 Jaccard 相似度。

3.1 构造方式

设有 kkk 个哈希函数 h1,…,hkh_1,\dots,h_kh1​,…,hk​,对集合 SSS 定义:


mhi(S)=min⁡{hi(g):g∈S},i=1,…,km_{h_i}(S)=\min\{h_i(g):g\in S\},\quad i=1,\dots,kmhi​​(S)=min{hi​(g):g∈S},i=1,…,k

于是签名向量为:


sig(S)=(mh1(S),mh2(S),…,mhk(S))\text{sig}(S)=\big(m_{h_1}(S),m_{h_2}(S),\dots,m_{h_k}(S)\big)sig(S)=(mh1​​(S),mh2​​(S),…,mhk​​(S))

3.2 为什么可行

对两个集合 A,BA,BA,B,MinHash 的核心定理是:


P(mh(A)=mh(B))=J(A,B)P(m_h(A)=m_h(B)) = J(A,B)P(mh​(A)=mh​(B))=J(A,B)

简要证明: 哈希函数 hhh 相当于对全集元素做了一次随机排列。考察两集合的并集 A∪BA \cup BA∪B 中的所有元素: 要使 mh(A)=mh(B)m_h(A) = m_h(B)mh​(A)=mh​(B),意味着 A∪BA \cup BA∪B 中经过哈希映射后值最小(即排在“最前面”)的那个元素,必须既属于 AAA 也属于 BBB,也就是说必须属于交集 A∩BA \cap BA∩B。 因为哈希是完全随机的,A∪BA \cup BA∪B 中的每一个元素成为最小值的概率是完全相等的。所以这个最小元素正好属于交集 A∩BA \cap BA∩B 的概率,就是交集元素个数占并集元素个数的比例,即 ∣A∩B∣∣A∪B∣=J(A,B)\frac{|A \cap B|}{|A \cup B|} = J(A,B)∣A∪B∣∣A∩B∣​=J(A,B)。

用 kkk 个哈希后,可得无偏估计量:


J^(A,B)=1k∑i=1kI[mi(A)=mi(B)]\hat J(A,B)=\frac{1}{k}\sum_{i=1}^{k} I[m_i(A)=m_i(B)]J^(A,B)=k1​i=1∑k​I[mi​(A)=mi​(B)]

方差为:


Var(J^)=J(1−J)k\mathrm{Var}(\hat J)=\frac{J(1-J)}{k}Var(J^)=kJ(1−J)​

kkk 越大,估计越稳定,但存储和计算成本也越高。

3.3 示例签名矩阵(k=6k=6k=6)

文本 h1 h2 h3 h4 h5 h6
d1d_1d1​ 12 7 5 20 1 13
d2d_2d2​ 12 7 6 20 1 13
d3d_3d3​ 21 5 8 19 7 4
d4d_4d4​ 12 7 5 19 1 58
d5d_5d5​ 30 14 22 33 28 5

可以看出:d1d_1d1​ 与 d4d_4d4​ 在前三个哈希函数取值一致,而与 d2d_2d2​ 在后三个哈希函数取值一致,这反映了它们较高的相似度。


LSH Banding(签名矩阵 → 候选对)

有了签名后,仍不想做全量比较,于是引入 Banding。

4.1 切分规则

将长度 kkk 的签名切成 bbb 个 band,每个 band 含 rrr 行:


k=b⋅rk=b\cdot rk=b⋅r

例如:k=6,b=2,r=3k=6,b=2,r=3k=6,b=2,r=3。

  • Band 1: (h1,h2,h3)(h_1,h_2,h_3)(h1​,h2​,h3​)
  • Band 2: (h4,h5,h6)(h_4,h_5,h_6)(h4​,h5​,h6​)

4.2 候选判定

若两个文档在任一 band 完全相同,则在该 band 碰撞,成为候选对。

Band 桶 文档
1 B1-1 d1d_1d1​, d4d_4d4​
1 B1-2 d2d_2d2​
1 B1-3 d3d_3d3​
1 B1-4 d5d_5d5​
2 B2-1 d1d_1d1​, d2d_2d2​
2 B2-3 d3d_3d3​
2 B2-4 d4d_4d4​
2 B2-5 d5d_5d5​

在这里,d1,d4d_1,d_4d1​,d4​ 在 Band 1 碰撞、d1,d2d_1,d_2d1​,d2​ 在 Band 2 碰撞,它们都会被成功召回送入下一阶段。

4.3 概率解释(S曲线)

若两篇文本的真实相似度为 sss,则其被召回为候选的概率为:


Pcand(s)=1−(1−sr)bP_{\text{cand}}(s)=1-(1-s^r)^bPcand​(s)=1−(1−sr)b

这条曲线会在某一阈值附近快速上升,因此 LSH 能实现“高相似度优先召回、低相似度优先过滤”。


精确验证(候选对 → 最终结果)

对候选集合中的文档对再计算真实 Jaccard:

文本对 交集大小 并集大小 Jaccard
d1d_1d1​, d4d_4d4​ 4 8 0.5
d1d_1d1​, d2d_2d2​ 4 8 0.5

最终保留满足 Jaccard≥τJaccard \ge \tauJaccard≥τ 的文档对(τ\tauτ 为业务阈值)。

这里需要注意:精确验证负责“剔除误报(假阳性)”,而召回上限由前面的 LSH 候选阶段决定。


算法直观总结

  1. Shingling:把文本变成可比较的集合表示。
  2. MinHash:把集合压缩成固定长度签名,近似保留 Jaccard。
  3. LSH Banding:用概率机制快速生成候选,避免全量比较。
  4. 精确验证:在候选上做高精度判定,得到最终相似对。

核心思想:用可控的概率近似换取数量级的效率提升,使海量文本相似检索在工程上可落地。

上一篇BPE 分词算法原理讲解:大模型背后的词表构建基石下一篇RLHF算法原理讲解:让大模型对齐人类偏好

评论

正在加载评论…

正在检查登录状态…

avatar

Evernight

记录学习、代码与生活的片刻。

RECOMMENDED

RLHF算法原理讲解:让大模型对齐人类偏好

2026-05-21

BPE 分词算法原理讲解:大模型背后的词表构建基石

2026-05-19

从 Hexo 到 Nuxt:博客迁移全记录

2026-05-03

Table of Contents

© 2026 Evernight✦把片刻留给永夜

基于 XingHuiSama · Evernight 修改CC BY-NC 4.0