在线文本去重工具:移除重复行和重复内容
什么是文本去重
文本去重是移除文本中重复的行、段落或内容的过程。它可以帮助清理数据、减少冗余、提高文本质量。
去重类型
| 类型 | 说明 | 示例 |
|---|---|---|
| 精确去重 | 完全相同的行 | abc + abc → abc |
| 忽略大小写去重 | 忽略大小写差异 | ABC + abc → abc |
| 忽略首尾空白 | 忽略首尾空白 | abc + abc → abc |
| 折叠中间空白 | 多空格/制表符归一后再比 | a b + a b → a b |
| 近重复(需预处理) | 相似度或键提取后再精确匹配 | 见下文阶梯 |
去重算法
精确去重(Set 去重):
输入: ["a", "b", "a", "c", "b"]
Set: {"a", "b", "c"}
输出: ["a", "b", "c"]
保留首次出现:
输入: ["c", "a", "b", "a", "c"]
输出: ["c", "a", "b"] ← 保留第一次出现的顺序
保留末次出现:
输入: ["c", "a", "b", "a", "c"]
输出: ["b", "a", "c"] ← 在末次出现位置保留,仍按输入相对序
为什么需要文本去重
- 数据清洗:清理爬虫或 API 获取的重复数据
- 日志分析:移除重复日志行,只保留唯一条目
- SEO 内容:检测和移除重复内容
- 邮件列表:清理重复的联系人邮箱
- 代码审查:检测重复代码行
- 文本编辑:清理复制粘贴产生的重复
如何使用在线工具
使用 ToolVault 工具匣 的 文本去重工具:
- 粘贴文本,确保每行一条记录
- 按需勾选:忽略大小写、忽略首尾空白、折叠中间空白、Unicode NFC 规范化、保留空行、显示重复次数
- 选择保留策略:首次出现(默认保序)或末次出现(保序)
- 选择输出顺序:保持原序 / 字母排序 / 按出现次数
- 点击去重;可复制结果,或下载
.txt/ 带次数的.tsv
勾选「显示重复次数」时,输出为 行文本 + 制表符 + 次数,下载按钮会导出带表头的 TSV,方便丢进表格看哪些行最常重复。
代码中的去重
JavaScript
// 精确去重(保持顺序)
function dedupeExact(text) {
const lines = text.split('\n');
const seen = new Set();
return lines.filter(line => {
if (seen.has(line)) return false;
seen.add(line);
return true;
}).join('\n');
}
// 忽略大小写去重
function dedupeIgnoreCase(text) {
const lines = text.split('\n');
const seen = new Set();
return lines.filter(line => {
const lower = line.toLowerCase();
if (seen.has(lower)) return false;
seen.add(lower);
return true;
}).join('\n');
}
// 模糊去重(基于相似度;小批量可用,不适合百万行)
function dedupeFuzzy(text, threshold = 0.85) {
const lines = text.split('\n');
const unique = [];
for (const line of lines) {
if (!unique.some(u => similarity(u, line) >= threshold)) {
unique.push(line);
}
}
return unique.join('\n');
}
// 计算相似度(Jaccard 系数)
function similarity(a, b) {
const setA = new Set(a.split(''));
const setB = new Set(b.split(''));
const intersection = new Set([...setA].filter(x => setB.has(x)));
const union = new Set([...setA, ...setB]);
return intersection.size / union.size;
}
Python
from collections import OrderedDict
def dedupe_exact(text):
"""精确去重,保持顺序"""
lines = text.split('\n')
return '\n'.join(OrderedDict.fromkeys(lines))
def dedupe_ignore_case(text):
"""忽略大小写去重"""
lines = text.split('\n')
seen = set()
result = []
for line in lines:
lower = line.lower()
if lower not in seen:
seen.add(lower)
result.append(line)
return '\n'.join(result)
def dedupe_fuzzy(text, threshold=0.85):
"""模糊去重"""
from difflib import SequenceMatcher
lines = text.split('\n')
unique = []
for line in lines:
if not any(SequenceMatcher(None, u, line).ratio() >= threshold for u in unique):
unique.append(line)
return '\n'.join(unique)
精确去重是已解题;近重复才是价值所在
精确匹配(trim+比较)是已解决的——有趣的都在近重复:同一行但空白/大小写/Unicode 形态不同(全半角、NFC/NFD 规范化)。实用阶梯从便宜到贵:先规范化(小写+折空白+NFC)再精确匹配;键提取(去标点数字取「同句」语义);相似度聚类(编辑距离阈值——n² 复杂度,万行内可用,百万行不可行)。选对档位比直上模糊匹配重要:日志要「剥时间戳的精确匹配」,商品名要键提取,自然语言才在小批量上用贵的那档。
在线工具覆盖阶梯的前半段:忽略大小写、首尾空白、折叠中间空白,以及 Unicode NFC 规范化。NFC 会合并「看起来一样、码点不同」的组合/分解重音(é 与 e+组合尖音符)。全角/半角数字与标点是另一档——先开 NFC;若 1 与 1 仍算两条,再用宽度折叠(或 行批处理 / 正则)预处理,再精确去重。更重的键提取或模糊匹配,同样先预处理,再丢回本工具。
幸存行保留什么
规范化只作用于比较键。输出仍是幸存行的原始字节(首次或末次出现)。例如开忽略大小写时,先 ABC 后 abc → 输出仍是 ABC,次数为 2。NFC 同理:除非选保留末次,否则以你粘贴的第一种形态为准。这是刻意设计——静默改写显示文本会破坏剪贴板工作流。若需要所有幸存行都写成 NFC,请在去重后再做整文件规范化。
保序:keep-first 与 keep-last 两种语义
两种都合法而工具静默不同:keep-first(原始行幸存——历史日志的正确语义)vs keep-last(最新行幸存——后写覆盖的偏好列表)。哈希集实现的去重常打乱输出顺序——对原始文件的 diff 就坏了。
去重页明确提供两种策略,且默认保持输入相对顺序(不是按哈希乱序)。需要审计时勾选「显示重复次数」或下载 TSV——去重无次数报告≈静默删数据。
百万行体制
大规模下浏览器去重从 Set(快、吃内存)转向外部方案:先排序(sort -u 的 Unix 语义——排序顺带去重、外部归并省内存)或哈希分片。去重页的场合是「看得见删了什么」的交互尺寸;偶尔的巨型文件,命令行是诚实答案。
FAQ
去重后顺序会变吗?
默认保留原始相对顺序(首次或末次出现位置,取决于保留策略)。也可以改为字母排序,或按出现次数从高到低——需要更复杂排序时用专门的文本排序工具。
如何处理空行?
可勾选「保留空行」:空行不参与去重键,会按原位保留;不勾选则输出中去掉空行。需要合并连续空行时,可先用空白清理或行批处理。
模糊去重的阈值怎么设置?
在线工具做的是规范化后的精确匹配,不含内置相似度阈值。若你在脚本里做模糊去重:阈值 0–1,越接近 1 越严格。常见区间:0.85–0.9 清理轻微变体,0.95+ 只去几乎完全相同的行。大批量请先降档到键提取或规范化精确匹配。
排查注记
「精确去重是已解题」一节把近重复按成本排成阶梯——规范化、键提取、相似度聚类,并强调选对档位比直上模糊匹配重要:日志要剥时间戳的精确匹配,商品名要键提取,自然语言才在小批量上用贵的那档。幸存行语义是刻意设计:规范化只作用于比较键、输出保留原始形态,因为静默改写显示文本会破坏剪贴板工作流——开忽略大小写时先 ABC 后 abc,输出的仍是 ABC。审计相关的两句也很硬:哈希集去重常打乱顺序、对原始文件的 diff 就坏了,所以工具默认保持输入相对序;去重无次数报告约等于静默删数据。
本文由 ToolVault 工具匣 提供。更多开发者工具请访问 首页。
相关工具
相关文章
Markdown 转 Word 交付指南:样式映射与行内降级
把 Markdown 草稿变成可交付的 .docx:pandoc 命令行与浏览器本地转换两条路线,标题/表格/代码块的 Word 原生样式映射对照,行内格式降级清单,以及「可编辑」为什么比「看起来像」更重要。
Word 转 Markdown 怎么转才干净:两条路线与格式保真对照
docx 转 Markdown 教程:pandoc 命令行与浏览器本地转换两条路线对比,标题/表格/图片/自动编号的保真行为,.doc 旧格式、图片体积、合并单元格等常见坑的解法。
中国车牌号规则与校验:普通牌、新能源与特殊格式全解
中国大陆车牌号编码规则详解:普通蓝牌、新能源 GA36D-2018、武警与使馆牌的结构、省份简称与发牌机关编码,附在线校验方法。