ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Data-Juicer word_repetition_filter 算子详解:基于词级 n-gram 重复率的文本质量过滤

Data-Juicer word_repetition_filter 算子详解:基于词级 n-gram 重复率的文本质量过滤 人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载导读word_repetition_filter是 Data-Juicer 中一个针对纯文本的 CPU 级 filter 算子用于剔除词级 n-gram 重复率过高或过低的低质量样本例如“复读机式”文本、无意义乱码以及由模板拼接产生的病态重复。本文基于该算子的官方文档结合仓库源码算子实现、单元测试与公共工具函数完整讲解其全部可配置参数、word_rep_ratio指标的计算原理、中英文场景的实战用法以及它与算子融合Operator Fusion机制的对接方式。读完本文你将能够独立在 Data-Juicer 配置或代码中正确使用该算子并能根据业务数据特点调优rep_len与min_ratio/max_ratio阈值。一、算子定位与核心思想word_repetition_filter属于 Data-Juicer 的filter过滤器类型算子标签为cpu, text即纯 CPU、纯文本处理无需 GPU 资源。它在 Data-Juicer 中的注册名为word_repetition_filter对应源码中的OP_NAME word_repetition_filter见 word_repetition_filter.py。其核心任务可用一句话概括计算每个样本的词级 n-gram 重复比率word_rep_ratio只保留比率落在[min_ratio, max_ratio]区间内的样本区间之外一律过滤。这一思想与字符级重复过滤的character_repetition_filter互补后者在字符粒度上检测“aaaaaaaaa”这类字符堆砌前者则在单词粒度上检测“Sunday Sunday Sunday Sunday”这类词级复读两者常配合用于清洗爬虫文本、机器生成噪音和低质量对话数据。二、参数配置详解官方文档给出的完整参数表如下参数名类型默认值说明langstren样本语言用于选择分词模型。tokenizationboolFalse是否使用模型对文档进行分词。rep_lenAnnotated[int, Gt(gt0)]10词级 n-gram 的重复长度 n。min_ratiofloat0.0最小过滤比率样本的词级 n-gram 重复比率低于该值会被过滤。max_ratiofloat0.5最大过滤比率样本的词级 n-gram 重复比率超过该值会被过滤。args—额外参数。kwargs—额外参数。结合源码 word_repetition_filter.py各参数的实际作用如下langen或zh等语言标识。仅在tokenizationTrue时生效用于加载对应语言的 sentencepiece 分词模型tokenizationFalse时该参数不影响结果。tokenization是否启用分词模型。为True时算子内部通过prepare_model(model_typesentencepiece, langlang)见 model_utils.py准备模型并在统计阶段调用tokenizer.encode_as_pieces切分文本——这对中文这类没有天然空格分词的语言至关重要为False时按空白符切词。rep_lenn-gram 的窗口长度 npydantic.PositiveInt约束必须大于 0。默认10意味着默认考察 10 元词组的重复情况。n 越大检测到的重复越“长程、整段式”如整句模板复制n 越小越能捕捉“单词紧邻复读”现象如Sunday Sunday Sunday。在效果演示中rep_len3即为检测 3-gram 重复。min_ratio下界阈值默认0.0。比率低于该值的样本例如完全无重复的文本会被过滤。需要“必须有一定重复”的场景如检测短模板文本可上调此值。max_ratio上界阈值默认0.5。比率高于该值的样本即病态重复文本会被过滤。绝大多数场景靠这一项过滤复读垃圾。args/kwargs透传给基类Filter的额外参数例如 Data-Juicer 统一提供的batch_size批处理大小等。阈值比较采用闭区间语义保留条件为min_ratio word_rep_ratio max_ratio。实际比较由基类的get_keep_boolean完成它同时支持通过min_closed_interval/max_closed_interval/reversed_range等基类开关控制开闭与反向过滤见 base_op.py。三、word_rep_ratio的计算原理源码级拆解该算子的统计与过滤逻辑分别实现在compute_stats_batched与process_batched两个批量方法中_batched_op True核心计算流程如下。3.1 文本切词Tokenization在 compute_stats_batched 中对每个样本调用公共函数get_words_from_document见 helper_func.py若启用了分词模型则使用tokenizer.encode_as_pieces将文本切成子词/分词片段否则按空白符含换行\n与制表符\t切分得到单词列表。对于中文这种词与词之间无空格的文本若tokenizationFalse整句话会被切成极少数“超长词”n-gram 统计将失去意义因此中文场景务必开启tokenizationTrue见下文效果演示。3.2 词条精炼Refinement随后调用words_refinement见 helper_func.py对词列表做归一化lower_caseTrue全部转为小写使Sunday与sunday视为同一词strip_charsSPECIAL_CHARACTERS剥离标点、数字、空白等特殊字符SPECIAL_CHARACTERS的定义见 special_characters.py包含string.punctuation string.digits string.whitespace及若干全角/扩展字符并剔除空词。这一步是可逆性丧失的归一化操作但能显著提升重复检测的准确率——例如sunday,与sunday.会被统一为sunday。3.3 n-gram 频次统计与比率计算对精炼后的词列表以窗口大小n rep_len滑动生成词 n-gram并统计每个 n-gram 的出现频次freq_word_ngrams {} for i in range(len(words) - self.n 1): word_ngram .join(words[i : i self.n]) freq_word_ngrams[word_ngram] freq_word_ngrams.get(word_ngram, 0) 1随后计算核心指标freq_word_ngrams list(freq_word_ngrams.values()) rep_more_than_one [freq for freq in freq_word_ngrams if freq 1] total sum(freq_word_ngrams) word_rep_ratio (sum(rep_more_than_one) / total) if total ! 0 else 0.0即word_rep_ratio 出现次数大于 1 的所有 n-gram 的累计频次 / 所有 n-gram 的总频次。该比值越接近 1说明文本中重复性 n-gram 占绝对主导越接近 0说明文本几乎无重复。两个值得注意的边界行为当文本过短、不足以产生任何 n-gram即len(freq_word_ngrams) 0时比率直接置为0.0此时若min_ratio 0会被过滤统计结果写入样本的Fields.stats字段、键名为StatsKeys.word_rep_ratio且若该键已存在则跳过重算已计算过的统计可复用。3.4 过滤判定process_batched从 stats 中读取word_rep_ratio调用基类get_keep_boolean与min_ratio/max_ratio比较逐个样本产出True保留/False过滤标记return map( lambda stat: self.get_keep_boolean(stat[StatsKeys.word_rep_ratio], self.min_ratio, self.max_ratio), samples[Fields.stats], )整个过程无需模型推理除非开启分词仅做词频统计因此该算子计算开销极低适合在流水线早期大批量粗筛。四、效果演示官方测试用例4.1 英文用例test_en_case配置WordRepetitionFilter(rep_len3, min_ratio0.0, max_ratio0.2, batch_size2)即检测 3-gram 重复率保留比率在0.0 ~ 0.2之间的样本批大小 2。输入数据5 条样本文本Sample 1Today is Sunday Sunday Sunday Sunday Sunday and its a happy day!Sample 2Today is Sunday Sunday Sunday and its a happy day!Sample 3Today is Sund Sund Sund Sund Sund Sunda and its a happy day!Sample 4plusieurs èrdashhqbchd.ckd daccéder à ces wwwasdasd foncSample 5This proposed a novel proposed pretraining proposed pretraining.输出数据3 条样本文本Sample 2Today is Sunday Sunday Sunday and its a happy day!Sample 4plusieurs èrdashhqbchd.ckd daccéder à ces wwwasdasd foncSample 5This proposed a novel proposed pretraining proposed pretraining.解释算子基于词级 3-gram 重复率过滤样本保留比率在0.0 ~ 0.2之间的样本。Sample 1 中Sunday连写 5 次词级 3-gram 重复率远超0.2被过滤Sample 3 中Sund连写 6 次含长度近似的变体同样因重复率过高被过滤Sample 2、4、5 的 3-gram 重复率处于区间内予以保留——注意 Sample 5 虽有proposed pretraining反复出现但其整体 3-gram 重复率并未超过0.2因此不被误伤体现了“比率制”阈值对局部重复与整体质量的平衡。4.2 中文用例test_zh_case配置WordRepetitionFilter(langzh, tokenizationTrue, rep_len3, min_ratio0.0, max_ratio0.2, batch_size1)与英文用例的关键区别是langzhtokenizationTrue启用 sentencepiece 分词器把无空格的中文文本切成词片3-gram 重复检测才能生效。输入数据5 条样本文本Sample 1去除字母、数字、下划线占比过低或过高的代码Sample 2欢迎来到阿里巴巴巴巴巴巴巴巴Sample 3使用片段分词器对每个页面进行分词使用语言模型计算每个段落的困惑度得分Sample 4根据算子使用使用使用使用安装方案确定Sample 5基于前一步结果在同一个聚类中找出那些过长文档为假正例暂不进行滤除输出数据3 条样本文本Sample 1去除字母、数字、下划线占比过低或过高的代码Sample 3使用片段分词器对每个页面进行分词使用语言模型计算每个段落的困惑度得分Sample 5基于前一步结果在同一个聚类中找出那些过长文档为假正例暂不进行滤除解释该算子针对中文配置并启用分词过滤掉 3-gram 重复率不在0.0 ~ 0.2范围内的样本。Sample 2 的“巴巴巴巴巴巴”阿里巴巴被复读扩展与 Sample 4 的“使用使用使用使用”“使用”连续复读 5 次均为典型的中文词级复读文本分词后 3-gram 重复率远超上限被过滤Sample 1、3、5 为正常长文本即使局部存在“分词”“语言模型”等重复词组整体 3-gram 重复率仍处于区间内被保留。上述两个用例均与仓库单元测试 test_word_repetition_filter.py 中的test_en_case、test_zh_case完全一致可直接运行复现。五、与算子融合机制的对接该算子除了注册进OPERATORS外还通过INTER_WORDS.register_module(OP_NAME)注册为可融合算子见 word_repetition_filter.py。这意味着在 Data-Juicer 的算子融合Operator Fusion机制下它可与同属INTER_WORDS的其他文本类算子如 stopwords 过滤、特殊字符过滤等共享中间变量切词与精炼得到的words与refined_words会以特定键名如f{InterVars.words}-{model_key}-{text_key}缓存到样本的Fields.context中后续算子可直接读取复用避免对同一文本重复分词、重复精炼。从源码结构看这类共享极大降低了多文本算子串联时的重复计算开销是 Data-Juicer 对批处理流水线的重要性能优化。同时compute_stats_batched与process_batched的“统计-过滤”分离设计使该算子天然兼容 Data-Juicer 的先统一统计、后统一过滤执行模型并支持contextTrue时的上下文传递见 base_op.py。六、如何在项目中使用该算子可直接在 YAML 配置中按算子名启用例如process: - word_repetition_filter: lang: zh tokenization: true rep_len: 3 min_ratio: 0.0 max_ratio: 0.2 batch_size: 32也可以在 Python 代码中实例化使用并配合测试中展示的compute_stats→process两步调用完成过滤参照 test_word_repetition_filter.py 的_run_word_repetition_filter辅助方法。调参建议基于参数语义与源码行为清洗英文通用语料默认rep_len10, min_ratio0.0, max_ratio0.5即可作为安全基线清洗中文语料务必开启tokenizationTrue并指定langzh否则无空格分词会导致检测失效数据中存在短程单词复读如对话中的“是是是是”调小rep_len如 2~3并结合较小的max_ratio只想剔除“整段模板复制”型重复调大rep_len如 20使仅长程整段重复才会被计入若同时希望过滤完全无重复的碎片文本可上调min_ratio。相关链接算子源代码算子单元测试文本工具函数切词/精炼特殊字符定义基类 Filter 与阈值判定模型加载工具sentencepiece返回算子列表赞分享人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载相关推荐Data-Juicer 字符级 n-gram 重复率过滤算子 character_repetition_filter 深入解析与实战Data Juicer 字符级 n gram 重复率过滤算子 character_repetition_filter 深入解析与实战 导读 character_人工智能大模型数据工程数据清洗数据增强数据质检EUI Docusaurus 主题 2026 年演进实录交互、图标与 Demo 能力的全面升级EUI Docusaurus 主题 2026 年演进实录交互、图标与 Demo 能力的全面升级 本篇技术指南以 elastic/eui docusaurus人工智能大模型数据工程数据清洗数据增强数据质检Nix 构建过程全解从 Derivation 解析到输出收编的确定性构建机制Nix 构建过程全解从 Derivation 解析到输出收编的确定性构建机制 本文基于 Nix纯函数式包管理器官方手册 Building https://人工智能大模型数据工程数据清洗数据增强数据质检上一篇如何彻底释放惠普游戏本性能OmenSuperHub开源控制工具完整指南下一篇如何深度配置开源WeMod增强工具专业级使用解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表