中文语料与通用语料的数据去重与脱敏方法综述

内容纲要

在大规模语言模型(LLM)训练的数据集构建过程中,必须对海量的原始语料进行去重(去除重复文本)和脱敏(去除或变形敏感信息)处理。这不仅能提升语料质量,减少模型记忆无用信息,还能避免隐私泄露等风险 📌。本文从语料来源、常用去重方法、脱敏手段、通用模型与垂直领域模型差异,以及可用的开源工具五个方面进行整理说明。

1. 不同语料来源的典型去重与脱敏挑战

不同来源的中文语料在重复内容形式和敏感信息类型上各有特点,需要针对性处理:

  • 网页爬取语料:网页数据常包含大量模版化或转载内容,出现“环路引用”或多站点复制的现象非常普遍 📌。例如,同一篇新闻可能在知乎专栏、CSDN博客、微信公众号、小红书等多个平台反复转载 📌。因此网页语料面临跨站点的重复文本去重挑战,同时网页中还经常附带模板导航、版权声明(如“转载自...”“版权所有...”)等重复段落。脱敏方面,公开网页可能包含作者署名、联系方式(电话、邮箱)等个人信息,需要删除或替换 📌。另外,网页爬取内容中可能夹带垃圾信息或违法有害信息(如黄色、反动内容),这些在广义上也属于脱敏清洗范畴,需要过滤 📌
  • 问答对话语料:来自问答社区或聊天对话的语料,重复挑战在于相似问答的重复以及对话模板化内容。例如,知识问答社区中不同用户提出的相近问题可能共享相似答案,或FAQ解答被多次复制引用。如果数据集中有大量重复问答对,需进行去重。对话语料还常出现固定寒暄用语、客服对话模板(如“您好,很高兴为您服务”)反复出现,这些高频句子也应视为重复内容做处理。脱敏方面,问答对话中可能包含用户的姓名称呼、账号ID,甚至咨询中透露的个人信息(地址、订单号等)。这些对话场景下的隐私信息需要通过实体识别或规则检测出来并处理掉。此外,如果对话来自社交App,还可能附带时间戳、用户名等元数据,也需去除。
  • 社交媒体语料:社交平台上的文本(微博、论坛帖、评论等)往往短小且非正式,但具有大量转发和模仿现象。例如流行的段子、热门话题会被大量用户复制或只做轻微改动后再次发布,形成近似重复内容。这给去重带来挑战,需要检测文本在字符或语义层面的高度相似 📌。同时,社交媒体文本中夹杂的表情符号、话题标签、@用户名引用等也可能反复出现,影响重复判断,需预先标准化处理。脱敏方面,社交数据经常涉及用户隐私(如@某人、地理定位、个人照片描述),需要清理或匿名化。例如,微博转发链中可能泄露原作者昵称;评论中可能出现电话号码用于交易联系等。这类信息应该使用正则或模型识别出来替换/去除,以保护隐私 📌。由于社交媒体语言随意,俗称、绰号等不易通过简单规则发现,脱敏难度较高,可能需要结合中文NER模型识别。
  • 书籍及长文档语料:包括电子书、维基百科条目、报告文档等长篇文本。该类语料通常由正式出版物或资料组成,本身内部重复较少,但跨来源重复可能存在。例如,一个公共领域的文学作品可能出现在多个语料库,或者同一章节内容因OCR来源不同而重复。对于书籍语料,常见挑战是整本书的重复(不同版本或来源的重复扫描) 📌。处理时需要在文档级进行去重,比如删除内容高度相似度超过90%的书籍 📌。另外,书籍章节内部的版权声明、目录等结构化内容在每本书里重复,也可按需去除。脱敏方面,书籍和百科类语料一般不含个人隐私信息,因为是公开出版内容。不过需要注意版权信息或敏感引用。例如,有的文本附带“作者邮箱”“联系地址”在序言或致谢部分,这些属于个人敏感信息也应脱敏。少数语料(如案例故事、日记)可能包含真人姓名等,需要判断是否要作匿名化处理(历史人物除外)。

小结:不同来源的数据在去重上需要考虑重复粒度(整篇、段落、句子)和跨来源交叉去重,在脱敏上需要根据语域判断隐私信息类型。例如,网页和社交媒体注重清理联系方式和用户名,书籍更关注版权和出版信息。理解这些差异有助于制定有针对性的去重与脱敏方案。

2. 常用文本去重方法及其效果对比

针对海量中文语料的重复内容,业界发展出多种去重技术。下面按照方法类别列举,并说明每种方法在中文语料中的适配性、优势与劣势。

2.1 哈希指纹(散列)去重

方法说明:采用哈希算法为每段文本生成固定长度的指纹(如MD5/SHA-1等),通过比较哈希值快速判断文本是否完全相同。典型做法是对每条语料(可整篇或行)计算哈希,将哈希相同的视为重复并保留一条。

适用性:哈希指纹法主要检测完全相同的重复文本,对中文语料适用前提是先做必要的标准化处理,如去除空白符、统一全/半角符号、繁简体转换等,以避免无意义的格式差异导致哈希不一致。在中文场景,如果两段内容哪怕只有一个字不同(包括标点差异),普通哈希就视为不同,因此对近似重复无能为力。但对于抓取的大规模数据,直接哈希能高效发现精确重复(例如完全相同的新闻文本、多份数据集中重复收录的段落等)。

优点:实现简单、计算和存储成本低。对完全重复文本能100%检测,误判率为零。适合用来过滤精确重复的文档或句子。例如在维基百科、Gutenberg等合并数据时,先按文档哈希去重删除90%以上内容相同的文档 📌。哈希指纹也可用布隆过滤器等方式高效实现用于TB级数据流处理 📌

缺点:只能发现完全相同的重复,无法识别出哪怕细微修改的近似文本。例如在中文中,同一句话增加或删除一个助词、替换同义词,哈希值会完全不同,指纹法将视作不重复。此外,如果文本包含可变信息(如时间、ID)导致每次抓取不同,哪怕正文一样也难以匹配。对于长文档部分重叠的问题,哈希只能在粒度足够细(如段落级别)时才能解决,但那会显著增加计算量。总之哈希去重召回率有限,仅作为第一步粗过滤。

中文语料效果:哈希去重在中文数据清洗中通常作为基础步骤使用,清理掉简单重复。如某篇百度百科条目如果在语料中出现两次,MD5指纹可以直接去掉重复一份。对中文微博这类短文本,完全重复的几率高(大量转发而不改变文本),哈希法能有效识别转发原文重复。对爬取网页的模板内容(如相同导航HTML片段),由于上下文一样每次抓取都重复,也可以通过哈希值去除。然而对于改写轻微差异的中文内容(如同一新闻不同媒体发表,只有标题或某些句式不同),哈希法往往失效,需要更高级的方法。

2.2 MinHash(最小哈希)去重

方法说明:MinHash是一种局部敏感哈希技术,可用于估计两个集合的相似度(Jaccard系数)。应用于文本去重时,通常将文本拆分为词或字符shingle集合,然后通过多组哈希函数获取MinHash签名,利用LSH(局部敏感哈希索引)快速匹配高Jaccard相似度的文本对 📌。简单来说,MinHash能将高重叠度的文本映射到相同或相近签名,从而检测出近重复文本。

适用性:MinHash非常适合海量中文网页的去重 📌。对于中文,需要先确定分片策略,例如以字/词n元gram作为特征集合。一种做法是不进行分词,直接取字符k-gram(比如每连续6个字作为一个shingle窗口),这样对文本细微差别也敏感 📌。也可以按中文分词结果取n元词串。不过中文分词可能引入不一致性,许多实践中干脆用字符粒度。MinHash能够发现部分重合大量的文本,例如一篇文章被略微修改后的版本。

优点:对近似重复文本非常有效,可容忍少量编辑差异。与精确哈希相比,MinHash能识别“高度相似但不完全相同”的文档。例如在一个中文新闻数据集中,将相似度阈值设为80%,可以过滤掉大部分改写稿 📌。MinHash+LSH方法扩展性好,可以借助Spark等在T级数据上并行计算 📌。许多大模型预训练语料构建都采用了MinHash或类似模糊去重技术 📌。它还能用于跨数据集去重,如删除CommonCrawl中和Wikipedia重复的部分 📌

缺点:需要调节相似度阈值,不同阈值对数据规模影响很大 📌。阈值太高可能漏掉稍有改动的重复,太低则可能误删主题相近但措辞不同的内容(误伤多样性)。MinHash计算相对复杂,签名长度和哈希函数数目会影响准确率和性能。对于非常短的文本(如一句话),MinHash不太稳定,因为shingle集合很小,计算的Jaccard相似可能不可靠。实现上需要较多内存存储签名,LSH近似匹配也有一定概率误判。另外,对中文长文档的局部重复(如长文档的一部分与另一文档重复),MinHash如果在文档级计算,有可能因为整篇不是高度相似而忽略了局部拷贝现象(这种情况需要切分成段落/句子处理)。

中文语料效果:实践证明MinHash对中文网页、新闻等改写转载现象效果好。例如Baichuan2预训练语料就采用了LSH特征(相当于MinHash)结合Embedding来做去重聚类📌。对于论坛帖子这种长度中等且话题集中的文本,MinHash能发现抄袭或转载的帖子。对长篇百科,可通过段落级MinHash检测不同条目间重复段落 📌。总的来说,MinHash在中文语料去重中属于主力方案,能较好平衡查全率和查准率,在TB级数据去重中被广泛应用 📌

2.3 SimHash(相似哈希)去重

方法说明:SimHash是Google提出的用于海量网页去重的高效算法 📌。它将一段文本通过特征加权和哈希压缩生成一个64位(或128位)二进制指纹,使得相似文本的指纹在汉明空间距离很近

判断两文本是否近重复,只需比较SimHash指纹的汉明距离是否低于阈值(通常设定如3位以内) 📌。SimHash本质上也是一种局部敏感哈希,但不同于MinHash基于集合重叠度,SimHash更像计算一个文本的整体语义指纹

LLM-文章相似度去重(DLC)

hamming_distance是两个SimHash值之间的汉明距离的阈值,用于决定是否应该将两个文档视为 “几乎重复”(即相似)。例如:假设有两个SimHash,h值A和B,如果它们之间的汉明距离(即A与B中不同bit的数量)小于或等于hamming_distance,那么A和B将被认为是相似的。较小的hamming_d istance值会导致只有高度相似的文档被认为是重复的,可能导致较多的重复文档未被识别。较大的hamming_distance值增加了误报的可能性,但同时较好地 识别了相似的文档。典型的汉明距离值可以是3、4或5,视具体用途而定5

适用性:SimHash非常适合超大规模文本快速去重,在搜索引擎网页去重中有成功应用。对中文语料,SimHash需要首先将文本解析为一组特征词(可用分词+TF-IDF选取重要词),然后对每个词取哈希并叠加权重得到最终签名 📌。一些实现也直接用字符gram哈希。对于篇幅较长、内容相对丰富的中文文本,SimHash指纹能较稳定地表示内容特征。对于短文本,冲突几率增大,效果相对变差。SimHash特别擅长发现几乎相同但稍有差异的文本,对细微修改很敏感。

优点计算效率极高,每篇文本压缩成固定比特串,比较时复杂度低且支持位运算加速。在亿级文档规模下,SimHash可以快速找到汉明距离<=3的候选近重复文档对 📌。存储空间占用小,每文档只需64位存储。对中文场景,SimHash能够很好地发现那些人工很难发现的重复,比如一篇文章插入了几个字或者同义改写,SimHash指纹仍会非常接近。一些国产平台提供了SimHash去重组件,用窗口切分+SimHash计算文本相似度📌。典型参数如窗口长度6,汉明距离阈值3~5可以平衡误报漏报📌。SimHash已经成为中文网页去重的标准方案之一📌

缺点:SimHash虽然高效,但也有误判漏判的风险:汉明距离阈值的选择很关键。阈值过小会漏掉稍有差异的重复文档,过大又可能把主题相近但内容不同的文档误认为重复 📌。另外SimHash倾向于整篇内容整体相似,对于一篇长文中嵌入另一篇的大段内容的情况,SimHash指纹可能被其他部分干扰而不足够接近(因为它混合了全篇特征)。为此有时需要对长文按块计算SimHash。还有,当文本很短或者特征很少时(如只有一句话),SimHash指纹可能不稳定或失去意义。在中文中,如果文本长度<几十字,SimHash的效果不如直接精确匹配或embedding相似度。总体来说SimHash更适用于篇章级重复检测,对细粒度重复需要配合其他方法。

中文语料效果:在中文网页新闻去重中,SimHash表现良好,可检测出不同媒体发布的同一新闻(即使标题或一句话有所改动)。很多开源中文爬虫处理流程都实现了SimHash做去重📌。对于社交帖子,如果帖子稍有修改转发,SimHash也能识别。但如果是讨论同一事件的不同帖子(内容不完全相同),SimHash可能误判为相似度高,需要结合阈值和人工规则加以避免。总体而言,SimHash在应对数据量极大、要求高效率的场景(如搜索索引去重、通用预训练数据去重)中,非常有价值。

2.4 基于向量嵌入的相似度去重

方法说明:该方法利用文本向量表示来计算语义相似度,从而发现重复。可以采用传统的TF-IDF向量或者预训练模型的句向量表示,将每段文本映射到一个高维向量空间,然后通过计算余弦相似度或距离判断是否重复 📌。阈值设定如相似度>0.8则视为重复 📌。近期常用的是 句子BERT/SimCSE等embedding 获取文本语义向量,再用近邻搜索找出高相似度文本对。

适用性:向量相似度法适用于语义层面相近的文本去重,特别是可以识别不同表述但意义相同的情形。这对中英文混杂或同义改写的中文文本尤其有效。例如一句中文可以有多种说法,词表面不同但embedding可能接近。使用embedding还能跨越一些表述差异,如主动被动句转换等。在中文语料中,如果想去除语义重复(不仅是字面重复),embedding方法是必要的工具。同时该方法对短文本也相对有效,传统哈希/MinHash对于短文本往往无法发挥,但语义向量可以捕捉短句含义的相似性。

优点:能够发现语义等价或高度相似的句子,即使用词不同。例如“我很高兴”和“我非常开心”虽然字面不同,但语义向量会很接近,余弦相似度高,可以被识别为重复(视任务需要可以当作重复或保留)。相比基于n-gram的哈希,向量方法对同义词替换、语序变化具有鲁棒性,可以提升去重的召回率。在医疗、法律等领域,不同表述的相同知识点可能重复,embedding能捕获这些。技术上,借助向量检索库(如FAISS)可以高效地在大量向量中找近邻,逐渐可扩展到上亿级文本。特别是中文预训练模型(如SimCSE中文模型)能提供良好语义表示,适合中文场景。

缺点计算成本高。获取高质量embedding需要加载较大模型,对于十亿条语料逐条编码代价巨大。同时,相似度比较在海量向量间也非常耗费资源,需借助近似搜索且牺牲部分准确性。此外,语义相似不等于内容重复——可能两个文本只是话题相关但内容并不重复,过于依赖embedding可能误伤语义相近但各有信息的内容。例如两篇讨论同一事件的新闻报道,观点类似但措辞不同,算语义接近但不应当合并为重复。为了避免此问题,通常将embedding方法用于句子级去重或辅助人工规则,而不是盲目删除所有高相似语句。另一个问题是,embedding可能对细微差别不敏感,例如一段话中否定词的有无对语义向量影响小,但实际含义相反,直接根据高相似度删除可能错删关键信息。

中文语料效果:在中文问答对中,如果问法不同但问题实质相同,embedding相似度能将它们匹配,从而合并答案,减少重复问答。对于论坛帖,embedding能找出内容几乎一样的帖子(即使标题略不同)。在大规模预训练数据处理中,通常会结合embedding进行句子级去重,以除掉重复句子 📌或段落。同时,像Baichuan2这样的模型训练也使用稠密Embedding特征进行文档聚类去重 📌。总之,embedding方法提升了中文去重的语义层次,但需要谨慎设定阈值和结合其他方法,以平衡数据多样性和重复消除。

2.5 句子聚类(重复片段聚类)去重

方法说明:句子聚类法是细粒度去重的一种思路,将文本拆分为句子或短片段,通过聚类或频次统计发现重复片段,然后相应处理。这可看作embedding相似度法的应用延伸:先对所有句子向量化,再用聚类算法(如DBSCAN、层次聚类)将高度相似的句子分在一组,视为重复片。然后可以选择保留一条代表句,其余删除,或者对整篇文档若干句子重复的判定删除文档。

适用性:适合用于消除公用模板常见句子的影响。例如新闻正文里常附上一两句相同背景描述,不同文章之间这些句子相同但其余部分不同。如果只做文档级去重会因为其它不同内容而保留下来,而句子级聚类可发现这些高频重复句,进行剔除或标记。对于中文数据,这种方法尤其适合处理模板化内容(如版权声明、固定问候语)和评语类语料(大量相似短评)。句子聚类也可以应用在跨文档片段去重,例如论文引用的相同段落、大段引用的名言等。

优点:粒度细,可发现局部重复。能在不完全删除整篇文档的情况下,清理掉其中重复率高的部分,从而既减少了冗余又保留有用信息。例如对爬取的网页文章,可以sentence级别比对,若一篇文章大部分句子都在另一篇中出现,则判定它是转载删除;如果只有个别句子重复,则只删除这些句子即可 📌。 这种精细去重提高了数据集的纯净度和多样性。并且,句子聚类可用于评估重复程度,为每篇文档打一个“重复内容比例”分数,作为过滤低质量的依据📌

缺点:实现复杂,计算量大。需要存储和比较所有句子片段的表示,数据量会比文档级方法膨胀数倍。完全句子级的重复删除可能打乱文章原有结构和上下文,在预训练语料中直接删除句子可能引入不连贯的问题 📌。一些团队选择句子级去重时,会整段整段地处理而非任意删除句子,以免模型训练时遇到不连贯文本。此外,句子聚类主要针对高度相同的句子有效,无法解决同义改写(这需要embedding语义而非聚类表面)。最后,对于内容创作类数据,过度删除常用句式可能导致模型学习不到这些常见表达

中文语料效果:中文网页中的“转载请注明出处”“本文由...提供”这类通用声明,可以通过句子聚类识别出成千上万次出现的相同句子,一并清理掉。又如中文维基百科条目中很多有标准格式模板,句子聚类也能剔除这些模板句。对社交媒体,有些流行语句被大量引用,聚类后可以选择只保留一两次,提高语料多样性。国内的一些数据清洗流程提出句子级去重和文档级去重结合的策略 📌,即先在细粒度发现重复片段,再决定是否删除整个文档或部分内容,以最大程度保持内容完整性。

表1:常见文本去重方法比较

方法 适用场景(中文) 优势 劣势
哈希指纹(MD5等) 完全相同文本的快速过滤;微博转发等短文本 精确可靠,速度快 📌;实现简单 仅检测100%相同,无法发现近似改写
MinHash + LSH 海量网页、新闻改写稿;跨数据源重复 可捕捉高重叠近重复 📌;可并行扩展 需调相似度阈值 ([LLM预训练
SimHash 大规模网页去重;长文本轻微改动 指纹短效率高;能发现细微修改重复
📌
存在哈希冲突和误判;对局部嵌入重复不敏感
向量余弦相似度 语义改写;同义句检测;跨语言重复 语义级识别重复,召回高;可识别措辞差异 计算成本高;易误删语义相关但内容不同的文本
句子聚类去重 模板句清理;局部引用重复 粒度细,能剔除局部冗余
📌
实现复杂耗时;可能破坏文档连贯性
📌

注:实际清洗中常将多种方法结合使用。例如,先用哈希排除完全重复,再用SimHash/MinHash检测高度相似文本,最后用embedding或句子级方法精细处理 📌。这样组合可以发挥各法所长,提高去重的精准度召回率

3. 各类数据脱敏处理方式比较(侧重中文效果)

训练数据脱敏是指对文本中的敏感信息(如个人身份信息,受法规或隐私要求保护的信息)进行去除或替换,以防止模型记忆和泄露这些内容 📌。针对中文语料的特点,常用脱敏方法包括基于实体识别的替换、正则规则脱敏、语义保留替换以及使用微调模型自动脱敏等。下面分别介绍并比较它们在中文处理中的效果。

3.1 基于实体识别的替换

方法说明:利用命名实体识别(NER)技术从文本中检测出人名、地名、机构名等敏感实体,然后将这些实体替换为泛化或匿名化形式。例如识别出人名后用某符号或通用名称代替(如“张三”替换为“某人”),识别出具体地址后用模糊地址代替等。

中文处理:中文NER模型能够识别出大部分人名、地名和组织名,但对个人隐私类型还需定制。例如中文姓名通常是2-3字,可以通过NER或词典匹配找到;手机号码、身份证号等可以视为数字串,不属于传统NER类别,需要正则处理(见3.2)。对于中文文本,常用开源工具如HanLPLTP或HuggingFace上的中文NER模型,可以较准确地标注出人名等实体。之后可以选择用统一标记(如)替换,或用随机生成的假名替换,以保持句子通顺。

优点:NER替换法有较高的精准度针对定义明确的实体类别。对中国人名地名库比较齐全,识别率高。替换后的文本上下文结构不变,仅敏感词替换为同类占位,不影响模型学习语言规律。例如,将“李华出生于北京”脱敏为“某人出生于某地”,语义依然通顺且模型无法得知具体是谁 📌。实体识别还能避免过度脱敏——只处理敏感实体,不误删正常内容,信息保留度好。许多数据脱敏流程把NER作为第一步,用来处理姓名、地名、机构等常见敏感信息。

缺点覆盖范围有限。NER模型通常识别实体类型有限,个人隐私信息诸如手机号、银行卡号、邮箱等并非命名实体,NER无法直接识别,需要结合正则。即使在人名方面,中文NER对生僻姓名、绰号等可能漏掉。另外有些敏感信息隐含在文本中而非显式实体(如“我表哥”指代了亲属关系身份)NER也识别不了。对于上下文相关的敏感信息(如连续几句描述同一人,但只第一次出现提到名字),后续代词其实也是敏感指代,需要全局处理而NER逐句识别难以解决。这些局限要求我们将NER与规则、上下文分析结合。最后,NER模型本身可能出错,导致误替换或漏替换。例如把普通名词当作姓名错误替换,会影响语义完整性。

3.2 基于正则的脱敏(规则脱敏)

方法说明:利用预先设定的模式匹配(正则表达式)\来检索文本中的敏感信息格式,并进行掩盖或替换。这种方法对**结构化敏感数据**特别有效,例如电话号码(11位数字以1开头)、身份证号(18位含特定校验规则)、邮箱地址(包含@)等。有明确模式即可通过regex找到并处理。

中文处理:中文环境下常见需要正则匹配的有:手机号码(1[3-9]\d{9}),身份证号(\d{17}[\dXx]),银行卡号(一般16~19位数字),邮箱(邮箱名@域名),IP地址,车牌号等。这些敏感项几乎都依赖正则才能精确定位 📌。此外,一些特定关键词(如身份证、电话等字样及其后的信息)也可以作为模式处理。在纯中文文本中,数字串或者混合串很显眼,正则方法效果理想。处理时通常将匹配到的内容替换为掩码符号(如全用*表示),或根据需要保留部分位数显示、其余脱敏。例如显示手机号后四位,其它以星号替代。

优点简单直接,针对格式固定的信息精确度近乎100%。对电话、证件号码这类高敏感度信息,正则是最可靠的脱敏方式 📌。替换结果可控,比如可以部分保留信息以供验证,而不暴露完整内容(这在训练语料一般不需要保留,全部掩盖即可)。正则脱敏速度快,可批量处理大文本,对中文和英文数字混排环境都适用。实现成本低,只需维护一套正则规则列表即可覆盖常见敏感字段。因此在工程实践中,正则过滤被认为是“没有奇技淫巧,老老实实写正则”即可 📌

缺点依赖预定义规则,无法发现未知模式的敏感信息。对于没有明显格式的敏感信息(如某人自述“我住在海淀区恩济里小区”包含具体住址,但没有特殊标记),正则很难涵盖。并且正则可能产生误匹配:例如一串11位数字不一定是手机号,也可能是商品编号,若简单脱敏会误伤正常数据。因此需要结合上下文或设置白名单避免错删。此外,正则只能处理字符串模式,对上下文依赖的信息(比如提及某人两次,第二次用“他”指代,正则无法关联)无能为力。最后,正则规则需要不断维护更新以适应新出现的敏感形式,对于大规模语料可能挂一漏万,需要配合人工抽检。

3.3 语义保持替换(仿真脱敏)

方法说明:在脱敏时尽量保留原文本语义和格式,仅将敏感部分替换为虚构但合理的值。不同于简单的掩码或泛化处理,语义保持替换会用看似真实的信息取代。例如将真实姓名“张伟”替换为随机生成的常见姓名“李静”,电话号码换成同样格式的随机号码,地址改为同一城市的另一个街道。这种方法确保文本读起来依然像真实的,语义不变,只是涉及个人身份的具体值变了。

中文处理:实现语义保持,需要相应的伪数据生成库或字典。对于中文人名,可以准备一个常见姓名库随机选取;地址可以拆分省市后替换街道名;日期、身份证等可以用合规的随机值。已有工具如Faker库(支持生成中英文名、地址等)或定制生成器。中文的难点是保证格式和习惯:如人名保持双字姓双字名结构、地址用正确的区县名称等。一个例子:原文“张三(身份证440981...)在北京海淀买了一套房。”脱敏替换为“李四(身份证110105...)在北京朝阳买了一套房。”——人物和身份证换了,但人物仍是常见姓名,地点仍在北京,语义场景未变。

优点:脱敏后文本可读性和真实性强,最大程度不影响下游模型学习正常语言和常识。例如模型仍能从地址语料中学到真实地址的格式、各省市区搭配,而不会因为全部变成“某地”丧失地名分布知识。这对一些垂类语料(如医疗记录中日期、医院名替换但仍保持真实格式)尤为重要,模型可学习医疗记录的写作模式而无隐私风险。此外,语义仿真替换可以避免信息丢失:简单掩盖可能丢掉年龄、地理等有价值特征,而用随机值替换则保留了这些字段对于上下文的意义。例如保留年龄范围:“32岁”替换成“34岁”,对统计分布几乎无影响。总体来说,此法在脱敏与数据质量间取得较好平衡。

缺点:实现复杂度高,需要准备生成库和规则确保替换合理不出错。生成的随机信息必须不存在关联,否则有泄露风险(如不能用真实存在的身份证号)。还要考虑一致性,例如同一人在文章中多次出现,替换后要保持前后一致,否则文档变得不连贯甚至自相矛盾。做到这一点需要有实体链指能力,简单替换每处会导致“一人多名”的情况。还有潜在问题是,随机替换可能改变隐含语义:如将“张三”换成“李四”无大碍,但如果把“清华大学”换成“小学”,就破坏了原意。因此通常只对身份标识类信息做同类型替换,不改变其类别和大致意义。尽管如此,仍需仔细验证替换后的文本语义未受不良影响。与其他方法相比,语义保留替换耗时长、难度大,一般在对数据质量要求极高时采用。

3.4 微调模型自动脱敏

方法说明:训练或使用一个模型,对输入文本进行自动的敏感信息识别和编辑,生成脱敏后的输出。可以是分类标注模型(先识别标注再按标签替换),也可以是序列到序列模型直接输出已经脱敏的文本。微调模型通常基于现有的NLP模型(如BERT、GPT等)在脱敏数据对上训练,使其学会隐去或替换敏感内容。

中文处理:对于中文,可构建包含隐私信息及对应脱敏后文本的训练集(可能结合规则和人工标注),微调一个Transformer模型来执行“隐私消除”任务。例如输入一句含身份证号码的句子,模型输出去掉号码的句子。或者让模型学习用标记人名等等。亦或采用生成式模型,在训练时以含敏感信息的文本为源,目标是替换了敏感词的文本。微调好的模型可以部署在管道中自动处理大批语料。还有一种不需要自己训练的方法,是利用现有的大模型填充/改写能力,通过提示让ChatGPT之类模型去除输入中的PII。但考虑到隐私和成本,一般内部微调模型更可取。

优点:模型方法灵活上下文感知。它不局限于死板格式,能根据句子含义判断哪些内容敏感。比如一句“我嫂子刚生了孩子”没有直接PII,但模型若学会隐私定义,可能会标记出这涉及家庭成员信息。如果训练数据充分,模型可以发现许多规则难以覆盖的隐私(隐含敏感信息)并正确处理。此外,模型能保持文本连贯,避免不必要的删减:因为它生成输出时可学习只改动必要部分。对复杂场景(如医疗文本包含病人信息和医学数据混杂),模型脱敏往往比纯规则更可靠。总体上,微调模型脱敏可以大幅减少人工制定规则的工作,在不断演进的新数据上有更强适应性。

缺点:需要大量标注或合成的数据来训练,成本较高。训练好的模型效果依赖数据分布,可能对罕见类型隐私无识别能力。模型也不是百分之百准确,仍可能出现漏网(未识别的敏感信息)或错删(误将正常内容当隐私删除)。在中文场景下,复杂的语义和隐喻可能导致模型判断失误。另外,模型泛化有风险:如果遇到与训练不一样的格式,可能无法识别。例如训练数据里都是明确身份证号格式,但实际文本中出现护照号,模型可能不认识。相比规则法的可控性,模型输出具有不确定性,需要严格评估验证。不当的训练还可能导致模型过度脱敏(把所有专有名词都去掉)或风格改变。因此,通常模型脱敏会与规则结合,即在模型输出基础上再做规则检查,确保敏感信息清除干净且内容合理。

表2:数据脱敏方法对比

脱敏方式 中文处理特点 优点 劣势
实体识别替换 用NER识别人名地名等后替换 精准定位常见实体,语义连贯
📌
覆盖有限,漏掉非实体敏感信息,依赖模型准确度
正则规则脱敏 匹配手机号、身份证等固定模式 针对结构化敏感数据准确高效
📌
需维护规则库,难发现未知模式,可能误匹配
语义保留替换 用随机假信息替换,保持文本格式 保留文本可读性和结构,信息损失小 实现复杂,需生成有效替换,保持前后一致
微调模型脱敏 训练模型自动识别并消除敏感内容 灵活智能,可处理复杂隐私,减少人工规则 需大量训练数据,有漏检或误删风险,输出难控

说明:实际工程中常结合多种脱敏手段。例如规则+NER结合可提高覆盖率:正则先脱敏手机号等,NER再识别人名地名 📌。对高安全要求的数据,可能多模型交叉验证确保不漏敏感信息。同时要权衡脱敏强度与语料质量,避免过度脱敏使数据失去意义。

4. 通用模型训练 vs 垂直领域模型训练:去重与脱敏要求差异

大模型训练有“通用预训练模型”和面向特定行业的“垂类模型”之分。两者在数据去重和脱敏的精度要求以及对信息完整性的侧重上有所不同:

  • 语料规模与重复容忍度:通用LLM通常训练于TB级别海量多源数据,严格去重十分必要,因为重复内容不仅占据资源,还可能导致模型过度记忆 ()。在通用模型中,会尽量去除一切可检测重复以提高语料多样性,甚至做到跨数据集去重(如从网络爬取数据中剔除维基百科已包含内容 📌)。垂直领域模型(如医疗、金融)可用数据相对有限,某些重复的信息(行业术语、标准描述)在所难免。此时去重策略会相对宽松,以免删除太多宝贵的领域知识。例如医疗病例中常见模板语句,如果数据量不大可能保留一些重复,以确保模型掌握规范表述。但对于高度程式化且无新信息的重复,也仍需剔除,以免模型输出千篇一律的回应。在数据量允许下,领域模型也应做去重,但阈值可稍微放宽或以内容块去重为主,而非严格句句不重复。
  • 去重粒度与精度:通用模型由于数据混合广,通常在文档级、段落级都执行去重 📌。例如新闻类数据集,可能设定相似度70%以上的直接删除 📌。垂类模型因为关心特定领域,有时宁可容忍一些重复也不删错有用信息。例如文化旅游领域,景点介绍可能多处出现类似历史段落,可以选择更精细的句子级去重,保留不同来源中独特的信息点,删除完全相同的句子而不整个删掉某篇文章。垂类场景可能要求分段去重以保留上下文完整性。举例来说,金融报告中标准的风险提示语句可以删除重复,但报告正文内容即使相似也要仔细判断再处理。此外,垂类模型训练往往对关键数据重复较敏感(如金融数字、医疗指标),这些部分若重复出现太多次可能引入偏倚,需要有选择地下采样或去重。
  • 脱敏严格度:通用LLM训练一般遵循各国隐私法律要求,需广泛脱敏所有PII。这包括人名、地址、联系方式、账号等一律处理,以防模型记忆后泄露 📌。因为通用模型面向公众,稍有隐私泄露就会带来风险,因而脱敏标准从严。垂直领域模型面对特定行业数据,脱敏要求取决于该领域的合规标准和数据性质:
    • 医疗:病人隐私最敏感,必须严格脱敏,如患者姓名、住址、病历号等绝不能出现,遵守医疗隐私法规(类似HIPAA要求)。医疗文本通常涉及大量个人健康数据,脱敏时既要严格又要不漏掉医疗关键信息。例如肿瘤病例中“李先生,50岁”需要去掉姓名但保留年龄和性别等,因为这些是医学内容,而姓名属于PII。所以医疗领域脱敏强调高精度,往往采用多层检查(规则+人工审核)来确保隐私零泄露。
    • 金融:涉及客户的交易记录、账户信息等,同样需要严控敏感信息(如账号、姓名)。此外金融还有合规要求,避免泄露公司内部信息。金融语料脱敏会注重数值类敏感,如银行卡号、交易流水号都要掩盖。但对一般的货币金额、股票代码这些非个人信息可以保留,因为模型需要学习财经内容。因此金融领域脱敏在个人数据上很严格,在公共财经数据上则允许保留。相较医疗,金融文本更结构化,易于规则脱敏,但也要注意诸如客户聊天记录里的人名、邮箱等。
    • 办公/通信:企业内部邮件、聊天记录训练模型时,脱敏重点是员工姓名、邮箱、IP等内部身份信息。另外可能包括商业机密关键词等(这属于保密而非隐私)。办公场景一般对脱敏要求高,以保护员工和公司隐私。但如果训练模型主要用于办公助手(如撰写邮件),则需要保留格式和礼貌用语,这就要求脱敏方式不能破坏这些要素。例如“张伟经理”可以脱敏成“X经理”以保留职位称谓格式。办公领域脱敏还考虑上下文一致,如邮件线程中同一人多封信,替换名称要一致。
    • 文化旅游:该领域数据多为公开景点介绍、游客评论等,通常个人敏感信息较少。可能需要脱敏的是游客在评论中留下的联系方式、照片中水印的姓名等少数情况。总体上文旅数据脱敏强度最低,更关注的是不泄露定位信息(如个人行程细节)和保护匿名性(评论者ID匿名)。因此在文旅语料中,可以保留大部分内容而不影响隐私。这类领域由于对隐私要求适中,可以在脱敏时更加保留原文风格,比如评论里的昵称可以用类似风格的假名替换而不是一律用“游客”。
  • 信息完整性:通用模型因为数据量巨大,脱敏和去重对总体信息覆盖影响不大,因此更倾向于严管重复和隐私,宁可多去掉一些内容,也要保证安全和多样性 📌。而垂直模型的数据宝贵,要求尽可能保留领域知识不受清洗影响。这体现在:
    • 去重方面,垂直领域更谨慎,要确保有价值的领域细节不被当作重复误删。例如法律领域两个案例文本相似,但细节不同,简单去重会丢失一个案例,需要人工或更高阈值来决定。
    • 脱敏方面,垂直领域在满足隐私合规前提下,会尽量保留业务有用的信息。如医疗记录中日期和医院名其实不要求删除(医院名是公用机构,不是个人隐私),反而对模型理解病程有用,应保留。这和通用模型直接去标识化不同,垂直数据可能需要更精细的策略,按信息类别决定保留或删除。
    • 此外,不同垂类对错误容忍度也不同。医疗/金融对隐私泄露零容忍,因此脱敏宁错杀不漏网;而文化旅游对少量未脱敏昵称可能相对宽松,因为影响不大。但通用模型由于公众关注,同样几乎零容忍任何PII。

综上,通用LLM的数据清洗追求“一刀切”的全面去重和脱敏策略,以安全性和多样性为重。而垂直领域模型则讲究定制化:根据领域平衡重复信息去除的力度和重要信息保留,制定相应隐私剥离方案。表现在实际流程上,垂类数据清洗通常更细致,有领域专家参与以确定什么可以删、什么必须留。

5. 开源工具与实践方案(Python技术栈)

为方便应用上述方法,这里按去重和脱敏分别推荐一些Python生态中的实用开源工具、算法库及实践流程:

去重工具与库:

  • 文本指纹哈希:直接使用Python内置hashlib计算MD5/SHA-1等作为指纹。对于超大数据,可考虑Apache Spark的dropDuplicates或Hadoop MapReduce实现分布式精确去重。另一种是利用Bloom Filter快速过滤已见过的哈希,Python的pybloombloom-filter库可用 📌

  • MinHash & LSH:Python下经典库是datasketch,提供MinHash类和LSH索引支持,可方便地对文本shingle集合生成MinHash签名并插入LSH以查询近似重复 📌。还有专业工具包text-dedup(Chenghao Mou 等开发)集成了MinHash LSH并支持Spark分布式,用于TB级语料去重 📌。在具体实践中,可将每篇文档切成n字gram集合,用datasketch计算MinHash,再通过LSH检索相似文档对,比对相似度阈值以决定删除 📌

  • SimHash:有成熟的Python实现如simhash库 (leonsim) (simhash · PyPI)。使用时先对文本进行中文分词或取特征词,然后调用simhash生成64位签名。对于大数据量的比对,可以将签名按照分块法建立索引(比如切成4段,每段作为键存储签名列表 📌,对每个新文本的签名逐段查找Hamming距离<=3的候选,再逐一精确验证汉明距离。这种分块+签名的方法很多开源实现已经包含。阿里云PAI平台也提供了SimHash去重组件,内部参数如窗口大小window_size和汉明距离threshold可调。📌

  • Embedding相似度:可使用Hugging FaceSentence Transformers库,里面有中文预训练的句向量模型(比如paraphrase-multilingual-MiniLM适用于中文)。利用该库对所有文本编码为向量(建议批量处理),然后借助Faiss库构建近似最近邻索引实现高效相似检索。如果数据量中等(<=百万条),也可以直接用sklearn的cosine_similarity或scipy的KDTree逐对计算阈值筛选 📌。此外,国内开源的text2vec亦提供了中文句向量和余弦相似度计算功能 📌。embedding法常与阈值配合,比如设定余弦相似度>0.8则判为重复 📌

  • 句子聚类:在有了句向量表示后,可采用sklearn的聚类算法(如DBSCAN基于距离阈值聚类,或AgglomerativeClustering层次聚类)来分组相似句。DBSCAN非常适合找密集重复簇:设定ε为相似度距离上限(如余弦距离<0.1 即相似度>0.9),MinPts=2,即可聚出出现两次以上的相同/极相似句群。也可以用NLTK等统计句子频次,对于完全相同句直接计数筛选。另一实用工具是text-dedup前述包中包含的Suffix Array子串去重方法 📌,可用于发现长文档间重复的句段。这对跨文档的部分重复很有效,适合和句子聚类结合使用。

脱敏工具与库:

  • NER识别工具:推荐使用HanLP(哈工大开源库,支持中文人名、地名、机构名等识别),或Stanza(StanfordNLP)的中文模型、spaCy结合中文模型等。在Python中,通过调用这些库对文本进行分词和NER标注,然后对标注为PERSON, ORG, GPE等实体的片段替换或移除。例如HanLP:HanLP.named_entities(text)得到实体列表后遍历替换。HuggingFace上也有现成中文NER模型(如bert-base-chinese-finetuned-ner),可用Transformer pipeline快速识别人名等。
  • 正则脱敏:Python自带re模块即足够强大。可编写一组正则模式,如:手机:\b1[3-9]\d{9}\b,身份证:\b\d{17}[0-9Xx]\b,邮箱:[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,} 等。在清洗脚本中用re.sub函数进行替换,例如:re.sub(pattern_phone, "<PHONE>", text)。为了方便管理,可以将所有模式放在字典中批量处理。另外,像FlashText库可以高效地根据关键词(非正则)替换,适合替换固定的敏感词列表。需要注意的是正则要反复测试避免过度匹配,典型做法是构造测试集验证每条规则匹配是否准确。
  • 语义保留替换工具:可以使用faker库📌来生成虚拟个人信息。Faker支持生成中文姓名(fake.name())、地址(fake.address())、身份证号等。不过faker中国地址可能不够真实,可自行准备字典更换。另一工具是Desensitized📌,这是国人开发的专注脱敏的库,支持多种脱敏策略,包括替换和遮盖,具有类型感知能力(如自动识别字符串中像手机号的片段脱敏)📌。也可以编写自定义替换函数,例如检测出姓名后调用faker随机生成新姓名代替。确保同一实体重复出现时,用相同替换值,这可通过在替换前建立实体ID映射字典实现。
  • 模型脱敏方案:如果数据量和标注允许,可以微调一个Transformer模型。使用Hugging Face的Transformers库,选择如BERT-base中文,在自制的“含敏感->脱敏”平行语料上做Mask Language Model或Seq2Seq训练。训练完成后,用该模型批量预测文本的脱敏版。微软的Presidio工具也是值得参考的框架:虽主要针对英文,但它提供了可扩展的PII检测器和匿名化器,可接入自定义的中文识别器 📌。Presidio的思想是先识别后替换,识别部分可以插件式替换成中文NER和regex结合,替换部分可以用内置的faker生成器。对于无需训练的简单模型方法,可以尝试使用开源的大语言模型通过prompt来脱敏,比如用ChatGLM等中文LLM,提示其“去除输入中的所有个人信息”。不过要小心验证输出,不能完全信赖零次提示,需要人工抽查。

实践流程

  • 在实际项目中,常把去重脱敏串联在数据清洗流水线中。推荐的顺序是:脱敏先于去重或交叉进行。因为某些重复可能在脱敏后才显现(例如两条数据只有姓名不同,其余相同,脱敏掉姓名后变得完全相同,这时才能去重)。实践中可先做明显PII的替换,然后执行去重,最后再对剩余数据做细致的脱敏清理。
  • 大规模数据处理可采用分布式架构。例如使用Spark:写Spark UDF函数应用正则和NER进行脱敏,然后用Spark对数据集按照hash分区做去重(或者借助上面的text-dedup Spark版) 📌。对于超大语料库,还需考虑分块处理:例如将数据按来源或类别分片,分别去重后再做交叉去重 📌以避免内存爆炸。
  • 建立日志和抽样审计机制。无论去重还是脱敏,都应该抽取部分处理前后的文本进行核查,确保没有错误删除关键内容或残留敏感信息 📌。特别是脱敏,要有测试用例覆盖各种边缘情况(不同格式的身份证、罕见姓氏等)。
  • 工具组合:很多开源工具可以组合形成完整解决方案。例如,用HanLP做NER标注,再用Desensitized库按照标注结果进行定制替换;用datasketch LSH找出相似文档对,再用simhash验证精细度;用faker生成替换值,再用Presidio框架应用这些替换。根据项目需要选择恰当组件能够事半功倍。

通过以上工具和流程的配合,我们可以高效地对中文及多语言语料进行去重和脱敏,产出高质量又合规安全的大模型训练数据集📌 📌。在实践中持续优化规则和模型,也是保证清洗效果、满足不同训练目标需求的关键。

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward