一句话定义
编辑距离(Edit Distance)衡量的是:把字符串 A 改成字符串 B,最少需要几次「单字符级」的动手操作。最经典的一种叫 Levenshtein Distance,它只允许三种操作——插入一个字符、删除一个字符、替换一个字符,每种都记 1 分。
它是怎么算的
举个最常见的例子:kitten 变成 sitting,需要 3 步。
```
kitten → sitten(k 替换成 s)
sitten → sittin(e 替换成 i)
sittin → sitting(末尾插入 g)
```
那机器怎么知道 3 是最少的?靠动态规划(Dynamic Programming):把「A 的前 i 个字符」和「B 的前 j 个字符」的距离记成一张表里的格子 dp[i][j],每个格子只依赖左边、上边、左上三个邻居,取三者最小值,再从对应操作上加 1。填满整张表,右下角就是答案,复杂度是 O(m×n)。
打个生活化的比方:这就像整理两排书架,你每次只允许抽出一本、塞进一本、或者把手里的书换掉一本。编辑距离算的是「最少动手几次能让两排书一致」。它不关心你换的是哪本、值不值钱,只数动作次数。
和相邻概念的区别
| 度量 | 允许的操作 | 前提 | 看的是什么 |
|---|---|---|---|
| 编辑距离(Levenshtein) | 插入、删除、替换 | 无 | 字符层面的字面差异 |
| 汉明距离(Hamming Distance) | 只能替换 | 两个串必须等长 | 有多少位对不上 |
| 最长公共子序列(LCS) | 只做删除/保留 | 无 | 最多能留下多少共同字符 |
| 向量AI 词典:余弦相似度">余弦相似度(Cosine Similarity) | —— | 需要先转向量 | 语义像不像 |
关键差别在最后一行:编辑距离是纯字面的。苹果手机 和 iPhone 在编辑距离眼里毫无关系,但语义模型会说它们很像。反过来,我今天很开心 和 我今天不开心 编辑距离只差 1,语义却几乎相反。
为什么它到今天还在天天出现
因为大量真实任务要的恰恰是「字面差多少」,而不是「意思像不像」:
- 拼写纠错与搜索建议:输入
recieve,系统扫词表找编辑距离最小的receive,这就是「你是不是想找」的底层逻辑之一。 - 语音识别与 OCR 评测:词错误率(WER)、字符错误率(CER)本质就是编辑距离除以总长度。做识别模型的团队,天天在看这个数字。
- 模糊匹配与数据清洗:两份客户名单里
张三和张 三、Beijing和Beijng要不要合并,编辑距离是最省事的判据。 - 生物信息学:DNA 序列比对的思想源头之一就是这个距离。
用之前要知道的坑
它不区分字符的重要性,长度差异会被放大——短串之间差一个字符,相对误差可能很高,所以有时会用编辑距离除以较长串长度做归一化。它没有语义,也处理不了同音字和语序。性能上,长文本两两比较是平方级开销,实践中常用长度差剪枝、只算对角线附近的带状区域、或者先做分词和索引过滤来降复杂度。
选它还是选语义向量,判断标准很简单:你要解决的是「写法不一致」,还是「说法不一致」。前者用编辑距离,便宜、可解释、可复现;后者才需要上模型。至于各工具库的具体接口和参数,以官方页面为准。
