跳到主要内容
实用工具2026-05-125 分钟阅读

在线文本去重工具:移除重复行和重复内容

什么是文本去重

文本去重是移除文本中重复的行、段落或内容的过程。它可以帮助清理数据、减少冗余、提高文本质量。

去重类型

类型说明示例
精确去重完全相同的行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"]  ← 在末次出现位置保留,仍按输入相对序

为什么需要文本去重

  1. 数据清洗:清理爬虫或 API 获取的重复数据
  2. 日志分析:移除重复日志行,只保留唯一条目
  3. SEO 内容:检测和移除重复内容
  4. 邮件列表:清理重复的联系人邮箱
  5. 代码审查:检测重复代码行
  6. 文本编辑:清理复制粘贴产生的重复

如何使用在线工具

使用 ToolVault 工具匣 的 文本去重工具:

  1. 粘贴文本,确保每行一条记录
  2. 按需勾选:忽略大小写、忽略首尾空白、折叠中间空白、Unicode NFC 规范化、保留空行、显示重复次数
  3. 选择保留策略:首次出现(默认保序)或末次出现(保序)
  4. 选择输出顺序:保持原序 / 字母排序 / 按出现次数
  5. 点击去重;可复制结果,或下载 .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 工具匣 提供。更多开发者工具请访问 首页。