字符串距离
文本所有处理都在浏览器本地完成,数据不上传服务器
两段文本有多像,取决于你问的是哪个问题 —— 所以这里给了五个算法,它们不是五种说法,是五种问题: · 编辑距离(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 字符时明说不算 —— 矩阵会让页面失去响应,不给你一个假死的结果
- 大小写可选区分与否(归一化只影响比对,列出来的原文不动)
使用方法
- 第一行写 A,第二行写 B
- 按需要挑算法 —— 它们回答的是不同的问题
- 编辑距离那条路径会给逐字符对照,照着改就行
常见问题
- 为什么给了五个算法,而不是一个「相似度」?
- 因为它们回答的是不同的问题,给一个会误导。`teh` 与 `the` 在编辑距离下差 2、在 Damerau 下差 1 —— 哪个对取决于你要衡量的是「打了几个键」还是「改了两个字」。Hamming 只允许替换、要求等长,是 DNA 比对与误码率的场景。Jaro-Winkler 输出的是相似度而不是距离,而且偏向「前几个字一样就是同一个」。选错了算法,得到的数虽然仍是数,却不再回答你的问题。
- 为什么相似度要特别说明「这是一个约定」?
- 因为「距离」有确切定义(改几步),而「相似度」没有 —— 把距离折成 0 到 1 之间的数有好几种做法。这里用的是 `1 − 距离 ÷ 较长的那段长度`。Jaro-Winkler 自己定义了一套相似度,两者在同一个输入上给出不同的数字完全正常。不说清楚的话,用户会拿两个数去比,然后以为其中一个算错了。
- 为什么 Hamming 在长度不等时不给一个数?
- 因为它没有定义。Hamming 距离是「两个等长序列在多少个位置上不同」,长度不等时那个问题不成立。这里可以编一个数出来(比如按较短的截断),但那个数不回答任何问题,而用户会当它是真的。所以直接说明。
- 为什么很长的输入不计算?
- 因为这些算法都要一张 `n × m` 的矩阵。两边各两万个字符就是四亿个格 —— 先吃满内存,再让标签页失去响应。而字符串比对的输入永远是短文本:错别字、姓名、单行标识符。真贴两篇长文进来多半是走错了工具,所以到 5000 字符就明说,而不是卡住不动。
- 为什么输入要分两行?
- 因为一个输入框只能放一段。让第二段填在选项里也可以,但比较字符串是个反复试的过程,改一次就要离开输入区很难用。两行的代价是字符串里不能有换行 —— 这是有意的取舍:算法本身对多行字符串完全成立,但界面上「第几个字符」就没法指了。
相关工具
正则测试
文本浏览器里调试正则:匹配实时高亮、捕获组、替换预览,并挡住灾难性回溯;调好可生成 JavaScript、Python、Java、Go、PHP 代码,反向引用按语言转换。
文本对比
文本把两份文本逐行对比,高亮标出新增、删除与未改动的行,改动按最小差异对齐,而不是整段标成变了。全部在浏览器本地完成,内容不上传。
文本体检
文本找出文本里看不见的零宽字符、BOM、同形异码字符,并报出规范化形式、行尾类型与四种字数统计。全部在浏览器本地完成。
字数统计
文本中英混排的文本到底有多长?中文按字、英文按词分开统计,给出字符数、行数、字节数、阅读与朗读时长,以及会被切成几条短信。全部在本机完成。
文本清洗
文本清洗从日志或表格里复制出来的一列内容:去重行、排序、去空行、去首尾空白、去行号、合并多空格,规则逐条开关。粘贴的内容只在本机处理。
命名风格转换
文本在十四种命名风格之间转换标识符,拆词时认得 fooBarBaz 与 FOO_BAR 这类混写,连续大写也会按词拆开。全部在浏览器本地完成,不上传。