ToolAct工具行动

文本去重工具

快速去除文本中的重复内容,支持按行、按词、按句去重

输入文本
去重结果

去重模式

选项设置

统计信息

原始条目数0
唯一条目数0
重复条目数0

什么是文本去重?

文本去重工具用于删除文本中重复的行、词或条目,让列表更干净、更容易检查。它适合处理导入的 CSV 片段、关键词列表、邮箱集合、日志片段、商品编码、提示词版本和笔记内容,这些重复项常来自复制、合并或导出错误。真正需要注意的是比较规则:大小写、首尾空格、空行、标点、规范化方式和原始顺序都会影响两个条目是否应被视为相同。工具能加快清理,但不能替代业务判断;有些相似条目必须保留,小差异也可能代表不同含义。

使用说明

基本操作

  1. 在左侧文本框中输入或粘贴需要去重的文本
  2. 选择合适的去重模式(按行、单词、句子等)
  3. 按需调整选项(是否区分大小写、是否保持顺序等)
  4. 在右侧查看实时去重结果和统计信息
  5. 点击「复制」按钮将结果保存到剪贴板

模式说明

  • 按行:将每一行视为独立单元,删除重复的行
  • 按单词:以空格分隔文本,删除重复的单词
  • 按句子:按句号、问号、感叹号分隔,删除重复的句子
  • 按段落:以空行分隔,删除重复的段落
  • 按字符:删除文本中重复出现的字符

使用场景

去除重复的行、词、句子、段落或字符选择要去重的单位,工具会保留首次出现的条目并保持唯一项的顺序。每种模式使用适当的拆分和拼接策略,因此行、段落、词和字符的工作流程表现各不相同。哈希集合查找的时间复杂度为 O(n),即使是长列表也能在单次浏览器处理中完成去重。
复制清理结果前审查重复项统计信息显示原始数量、唯一数量和被移除的重复数量。可选的重复项显示功能会列出发现的重复条目,这在清理邮件列表、关键词列表、日志或调查导出数据之前很有用。先审查重复列表,确认正确的条目已被合并,然后再分享清理后的输出。
控制大小写敏感匹配当 Apple 和 apple 应该被视为不同条目时开启大小写敏感,当希望无论大小写都能检测重复文本时关闭它。这使得同一个工具既能用于文稿清理,也能用于精确的技术列表。不区分大小写模式会在哈希之前将输入统一转为小写,因此长日志不会将 'ERROR' 和 'error' 保留为两个独立条目。
清理邮件或标签列表并保留顺序粘贴邮件导出数据,切换到行模式并关闭大小写敏感,将 [email protected] 和 [email protected] 合并。首次出现的顺序会被保留,因此清理后的列表仍然尊重原始分组,适合 CSV 导入。排序稳定性在这里很重要:输出应保留输入顺序,而非按字母重新排列。
去重前规范化关键词集合的空白裁剪首尾空格并跳过空行,避免复制粘贴时混入的制表符造成虚假重复。当源列表来自电子表格导出(空行和缩进条目会虚增重复数量)时,这一步至关重要。对清理后的列表用更严格规则再跑一次通常不会再发现新的重复,这说明规范化处理已经生效。

技术原理

去重是基于 JavaScript Set 的单次扫描。ECMAScript Set 使用 SameValueZero 相等算法(与 Array.prototype.includes 使用的比较方式相同,其中 NaN 等于 NaN,但 +0 等于 -0),规范要求其提供亚线性的平均查找效率 —— V8 将其实现为开放寻址哈希表,摊销插入为 O(1),因此整个扫描的时间复杂度为 O(n)。朴素方案 —— 推入结果数组并对每个元素调用 indexOf —— 时间复杂度为 O(n²),在约 1 万条记录时开始变得缓慢。拆分方式因模式而异:行模式按 /\r?\n/ 拆分以兼容 CRLF(Windows)和 LF(Unix)行尾,词模式按 /\s+/ 拆分,句模式按 /(?<=[.!?])\s+/ 拆分,段落模式按 /\n{2,}/ 拆分。每个单元在成为 Set 键之前会经过可选的规范化处理:trim() 去除首尾空格,toLowerCase() 实现不区分大小写匹配,String.prototype.normalize('NFC') 使组合形式(é, U+00E9)与分解形式(e + U+0301)的视觉相同字符串合并为单个条目。顺序被保留,因为结果数组按迭代顺序构建 —— Set 仅用作「是否已见过」的过滤器。同样的数据结构选择支撑着 SQL DISTINCT 和 Python set();对于数千万条记录的唯一真正替代方案是概率性布隆过滤器,它以较小的误报率(每元素约 10 比特时约 1%)换取恒定内存,对于浏览器端文本工具来说属于过度设计。

  • Set 查找使用 SameValueZero 算法(ECMA-262 §7.2.10)—— NaN 匹配 NaN,+0 匹配 -0,其余严格相等
  • V8 将 Set 实现为哈希表;insert 和 has 的摊销时间为 O(1),使整个去重为 O(n),而基于 indexOf 的方案为 O(n²)
  • 行模式正则 /\r?\n/ 在一次拆分中处理 CRLF、LF 和末尾 CR;忽略此点会留下不可见的 '\r' 后缀,导致精确匹配失败
  • Unicode 规范化通过 String.prototype.normalize('NFC') 将组合/分解形式(如 'é' U+00E9 与 'e' + U+0301)合并为一个键
  • 不区分大小写模式仅将键小写化 —— 原始大小写的值保留在输出中,因此第一个 'ERROR' 保持原样,后续的 'error' 行被丢弃
  • 顺序保留是免费的:结果数组按输入顺序构建,Set 仅作为过滤器,因此行为类似具有稳定排序的 SQL DISTINCT
  • 对于 1000 万条以上内存成为瓶颈的场景,布隆过滤器(每元素约 10 比特,1% 误报率)可替代 Set —— 在浏览器中不需要,100 万条字符串的 Set 轻松控制在 100 MB 以内

示例

按行去重,保留首次出现

输入:
apple
banana
apple
orange
banana

输出:
apple
banana
orange

去除两侧空白后再按行去重

输入:
hello
  hello
hello 
world

输出(去除空白后):
hello
world

忽略大小写去重

输入:
ERROR
error
Warning
WARNING
warning

输出(忽略大小写):
ERROR
Warning

提取唯一邮箱列表

输入:
alice@example.com
bob@example.com
ALICE@example.com
carol@example.com
bob@example.com

输出(忽略大小写,按行):
alice@example.com
bob@example.com
carol@example.com

按词去重

输入:hello world hello again world

输出:hello world again

按句去重

输入:This is a test. This is a test. Another sentence.

输出:This is a test. Another sentence.

常见问题

什么样算重复?

每个单元(行、单词、句子、段落或字符)会与其他单元逐一比较,完全相同的单元就是重复项。可切换是否区分大小写。页面会输出去重后的结果,并报告共移除多少个重复项。

会保留原始顺序吗?

会——每个唯一项的首次出现保留在原位,后续重复项会被剔除。输出结果保持原有顺序。

空行会被当作重复吗?

空行与其他行一样参与比较。第一个空行会被保留;后续与之相同的空行会和其他重复项一起被移除。

可以按子串或某一列去重吗?

不可以。去重基于每个单元(行、单词、句子、段落或字符)的完整内容。本工具不支持按列或按子串去重模式。

会对输出结果排序吗?

不会。输出始终保持原始顺序,没有排序选项。

能处理多大的文件?

上限取决于浏览器内存。桌面浏览器可处理数十万行。数百万行级别的文件会内存溢出,这种情况建议使用 `sort -u` 或 `awk '!seen[$0]++'` 等命令行工具。

我的文本会被上传吗?

不会。去重在浏览器中借助内存中的 Set 完成,粘贴的内容不会被传输。