piapia123
zh

字符串距离

文本

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

两段文本有多像,取决于你问的是哪个问题 —— 所以这里给了五个算法,它们不是五种说法,是五种问题: · 编辑距离(Levenshtein) —— 改几个字能变成对方,允许增、删、改。 · Damerau —— 在上面加一条「相邻两字互换算一步」。`teh` → `the` 在编辑距离下是 2,在 Damerau 下是 1,而打字错误里相邻互换是最常见的一类。 · Hamming —— 只允许替换,要求两段等长。DNA 比对与误码率是它的场景。 · Jaro-Winkler —— 给 0–1 的相似度而不是距离,且对开头相同的部分加分。它来自姓名比对。 · 最长公共子序列 —— 不要求连续,文本 diff 的基础。 ⚠️ 为什么结论里还要给逐字符对照:「距离是 3」这个数字没法用。知道差在哪才能改,所以编辑距离那条路径会把每一处是匹配、替换、插入还是删除都标出来。 ⚠️ 关于相似度有一个容易踩的地方:这里的相似度按 `1 − 距离 ÷ 较长的那段长度` 折算,那是一个约定而不是唯一定义。Jaro-Winkler 的相似度是另一套定义,同一个输入上两者给出不同的数字是正常的,不要直接比较。 输入约定:第一行是 A,第二行是 B。全部在浏览器本地完成。

功能

  • 编辑距离:给定距离,并给出逐字符对照与改变清单(替换 / 插入 / 删除各是哪些)
  • Damerau-Levenshtein:相邻互换算一步 —— `teh` → `the` 是 1 而不是 2
  • Hamming 距离:⚠️ 长度不等时明说不给数,因为这个度量在那种情况下没有定义
  • Jaro 与 Jaro-Winkler 相似度(0–1),前缀最多看 4 位、阈值 0.7 才加分(原论文取值)
  • 最长公共子序列:给出长度与具体的那个子序列
  • ⚠️ 相似度带「这是一个约定」的说明,避免与 Jaro-Winkler 的数字直接比较
  • 中文字符在对照表里按两格宽对齐,不会错位
  • ⚠️ 单段超过 5000 字符时明说不算 —— 矩阵会让页面失去响应,不给你一个假死的结果
  • 大小写可选区分与否(归一化只影响比对,列出来的原文不动)

使用方法

  1. 第一行写 A,第二行写 B
  2. 按需要挑算法 —— 它们回答的是不同的问题
  3. 编辑距离那条路径会给逐字符对照,照着改就行

常见问题

为什么给了五个算法,而不是一个「相似度」?
因为它们回答的是不同的问题,给一个会误导。`teh` 与 `the` 在编辑距离下差 2、在 Damerau 下差 1 —— 哪个对取决于你要衡量的是「打了几个键」还是「改了两个字」。Hamming 只允许替换、要求等长,是 DNA 比对与误码率的场景。Jaro-Winkler 输出的是相似度而不是距离,而且偏向「前几个字一样就是同一个」。选错了算法,得到的数虽然仍是数,却不再回答你的问题。
为什么相似度要特别说明「这是一个约定」?
因为「距离」有确切定义(改几步),而「相似度」没有 —— 把距离折成 0 到 1 之间的数有好几种做法。这里用的是 `1 − 距离 ÷ 较长的那段长度`。Jaro-Winkler 自己定义了一套相似度,两者在同一个输入上给出不同的数字完全正常。不说清楚的话,用户会拿两个数去比,然后以为其中一个算错了。
为什么 Hamming 在长度不等时不给一个数?
因为它没有定义。Hamming 距离是「两个等长序列在多少个位置上不同」,长度不等时那个问题不成立。这里可以编一个数出来(比如按较短的截断),但那个数不回答任何问题,而用户会当它是真的。所以直接说明。
为什么很长的输入不计算?
因为这些算法都要一张 `n × m` 的矩阵。两边各两万个字符就是四亿个格 —— 先吃满内存,再让标签页失去响应。而字符串比对的输入永远是短文本:错别字、姓名、单行标识符。真贴两篇长文进来多半是走错了工具,所以到 5000 字符就明说,而不是卡住不动。
为什么输入要分两行?
因为一个输入框只能放一段。让第二段填在选项里也可以,但比较字符串是个反复试的过程,改一次就要离开输入区很难用。两行的代价是字符串里不能有换行 —— 这是有意的取舍:算法本身对多行字符串完全成立,但界面上「第几个字符」就没法指了。

相关工具