跳到主要内容

字符串相似度怎么算:从编辑距离到文本相似度的实用指南

讲清字符串相似度的核心,编辑距离怎么数、相似百分比怎么归一化,以及查重、模糊匹配、拼写纠错、去重这几类活儿各该选哪种指标,配真实例子。

发布于 作者 李雷
#字符串相似度 #文本相似度 #编辑距离 #Levenshtein #模糊匹配

字符串相似度怎么算:从编辑距离到文本相似度的实用指南

两段文字到底有多像,人一眼就能感觉到,但程序需要一个能比较、能排序、能定阈值的数。字符串相似度就是把这种「像」量化成一个 0 到 100% 的分数,背后是几套各有脾气的算法。这篇把最常用的编辑距离讲透,再说清它能干什么活儿、什么时候该换别的指标。

编辑距离到底是什么

最经典的相似度基础是莱文斯坦(Levenshtein)编辑距离。它的定义很硬:编辑距离 = 把一个串变成另一个串所需的最少增删改次数,操作只有三种,插入一个字符、删除一个字符、替换一个字符。

举个真实例子,把 kitten 变成 sitting:

  • 把 k 换成 s,得到 sitten
  • 把 e 换成 i,得到 sittin
  • 末尾插一个 g,得到 sitting

三步,所以 kitten 和 sitting 的编辑距离是 3。关键在「最少」,工具不会贪心地随便数一组操作就交差,而是用动态规划填一张二维表格,保证报出来的一定是最优解,不会多算。你可以直接在 字符串相似度对比 里粘进这两个词,看它把整张表算出来。

编辑距离怎么变成相似百分比

裸的编辑距离有个坑:数字大小和串的长度绑死了。距离 3 对两个四个字母的词是天大的差异,对两段两百字的段落却微不足道。所以要做归一化:

相似度 = 1 − 编辑距离 ÷ 较长串长度

还拿 kitten 对 sitting 说,距离 3,较长串 7 个字符,相似度就是 1 − 3÷7 ≈ 0.571,约 57%。两个完全一样的串距离为 0,得 100%;两个毫无共同点的串趋近 0%。除以长度之后,短输入和长输入的分数才能放在同一把尺子上比。

不止编辑距离:三种各管一摊的指标

编辑距离数的是带位置的操作,词序一换分数就崩,所以它不是万能钥匙。常见的搭档还有三个:

  • Dice 系数,数的是两个串共享的相邻字符对(bigram),对词序不敏感,适合比标题、商品名这类顺序可能乱但用词重叠的文本。
  • Jaro-Winkler,专为人名这类短串调过,而且给开头相同的部分加权。课本例子 MARTHA 对 MARHTA 得分约 0.96,因为只是两个字母换了位、MAR 前缀完好,所以判得很高。
  • 最长公共子序列(LCS),给出两段里最长的那段连续相同片段,看「照搬了多长」时很直观。

选哪个不靠感觉,靠数据形状:人名用 Jaro-Winkler,代码逐行比用 Levenshtein,松散措辞用 Dice。

这些数到底拿来干什么

相似度分数本身不是目的,它是下面这几类活儿的判断依据:

  • 查重去重:从两个系统导出的客户名,「张伟」和「张玮」是不是同一个人?算 Jaro-Winkler,定个 0.9 的阈值,高过线的标成疑似重复交人工合并。整段文本的去重可以先用 文本去重 把完全相同的行清掉,再用相似度抓近似项。
  • 模糊匹配:用户搜「键攀」,目录里写的是「键盘」,把搜索词和每个候选项算分、按相似度排序,就能做出容错的搜索框。
  • 拼写纠错与判分:标准答案「光合作用」,学生写成「光和作用」,编辑距离 1、相似度九成以上,可以判这是笔误而非答错。
  • 改写检测:两段文案可疑地像,Dice 告诉你共享了多少措辞,LCS 告诉你最长照搬了多少,合起来就能把轻度改写和整段抄分开。

我自己最常用的场景是合并两份订阅名单。有一次担心写成 gmail.com 和 gmial.com 的是同一个人,我没去逐条肉眼核,而是把成对的疑似项跑了一遍编辑距离,距离 2 且百分比很高的全标出来交人工,省下大半天。要逐字符看清差在哪里,我会再开 文本对比 把两段并排高亮。

两个容易踩的坑

第一,不归一化就看裸编辑距离。同样的距离 4,放短词上是巨大差异,放长段落上微不足道,判断近不近之前永远先看那个除过长度的百分比。

第二,大小写和空白敏感没设对。比人名时若开着大小写,Apple 和 apple 会被当成不同;末尾多一个空格也会悄悄加距离。比源码或配置这种每个字节都算数的,才该把两个开关都开着。设错一个,同一份数据能得出两套结论。

小结

字符串相似度的核心就一句话:用编辑距离这类算法,把「两段文字有多像」变成一个能定阈值的数。编辑距离数最少增删改次数,归一化成百分比后才好横向比;词序乱了换 Dice,比人名换 Jaro-Winkler。把指标配对数据形状,查重、模糊匹配、纠错、去重这几类活儿就都有了可靠的判断依据。


Made by Toolora · Updated 2026-06-13