ARTICLE DETAIL

资讯详情

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

Data-Juicer general_field_filter 通用字段过滤算子:表达式语法、AST 求值原理与实战配置

Data-Juicer general_field_filter 通用字段过滤算子:表达式语法、AST 求值原理与实战配置 人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载导读general_field_filter是 Data-Juicer 提供的一款CPU 型tag: cpu过滤算子filter其核心能力是用一段类似 Python 的字符串表达式支持and/or逻辑与链式比较对每个样本的任意字段进行求值只保留满足条件的样本。本文围绕 docs/operators/filter/general_field_filter.md 展开完整覆盖该算子的参数配置、表达式语法、求值规则、缺失字段处理与 stats 缓存机制并结合 data_juicer/ops/filter/general_field_filter.py 的源码实现与 tests/ops/filter/test_general_field_filter.py 的测试用例进行底层原理剖析。读完本文你将掌握如何用一行配置完成“数值区间 逻辑组合 嵌套 meta 字段 成员关系判断”的通用过滤并理解 Data-Juicer 过滤算子的“先统计后过滤”两阶段执行机制。一、算子定位与适用场景1.1 它是谁注册名与类型算子类型filter过滤算子保留满足条件的样本丢弃不满足的样本标签cpu纯 CPU 计算不依赖 GPU适合大规模数据流水线中低成本、无模型的规则过滤注册名general_field_filter通过OPERATORS.register_module(OP_NAME)注册进 Data-Juicer 的算子注册表见 data_juicer/ops/filter/general_field_filter.py因此可以在配置文件的process列表中直接以该名字声明使用。完整算子列表可在 docs/Operators.md 中查看全部算子并按需返回。1.2 用它解决什么问题与 Data-Juicer 中大多数“专用过滤算子”如按文本长度、语言、重复率、图像宽高比等单一维度过滤不同general_field_filter是面向任意字段的通用规则过滤。典型的应用场景包括按样本的任意数值字段做区间过滤例如10 num 30多个字段组合过滤例如num 10 and flag True按嵌套的__dj__meta__元数据字段过滤例如__dj__meta__.a 2用in / not in做白名单/黑名单过滤例如lang in [en, zh] and domain not in (spam, ads)。这使它可以充当数据流水线中的“通用闸门”把其它 mapper/filter 产生的统计字段、元数据字段再按自定义规则二次筛选而无需新增代码。二、参数配置详解2.1 参数表继承自原文档补充说明参数名类型默认值说明filter_conditionstr过滤条件字符串支持逻辑运算符and/or与链式比较。例如10 num 30 and text ! nothing here and __dj__meta__.a 3args—透传给基类Filter的额外位置参数kwargs—透传给基类Filter的额外关键字参数如text_key、num_proc、batch_size等通用算子参数2.2 参数在源码中的处理逻辑在 data_juicer/ops/filter/general_field_filter.py 的__init__中可以看到两个关键行为字符串规范化self.filter_condition filter_condition.strip()首尾空白会被去掉编译期语法校验只要条件非空就会执行self.ast_tree ast.parse(filter_condition, modeeval)将表达式编译为 AST抽象语法树。如果表达式语法非法会抛出ValueError: Invalid filter condition: ...。这意味着语法错误在算子构造阶段就会被立即发现而不是等到处理数据时才报错。2.3 在配置文件中的声明方式在 data_juicer/config/config_all.yaml 中给出了该算子的完整配置模板process: - general_field_filter: # Filter to keep samples based on a general field filter condition. filter_condition: # The filter condition as a string. It can include logical operators (and/or) and chain comparisons.实际使用时把filter_condition填上表达式即可例如process: - general_field_filter: filter_condition: 10 num 30 and text ! nothing here and __dj__meta__.a 3三、表达式语法支持哪些写法filter_condition不是普通字符串匹配而是经过ast.parse(..., modeeval)解析的安全 Python 表达式子集。结合 data_juicer/ops/filter/general_field_filter.py 的ExpressionTransformer实现可以确认以下语法能力3.1 比较运算符运算符含义源码映射大于ast.Gt小于ast.Lt等于ast.Eq!不等于ast.NotEq大于等于ast.GtE小于等于ast.LtEin属于ast.Innot in不属于ast.NotIn3.2 逻辑运算符与括号and所有子条件同时为真才为真all(values)or任一子条件为真即为真any(values)支持括号改变优先级例如(num 10 or num 20) and flag True见 tests/ops/filter/test_general_field_filter.py 的test_complex_condition。3.3 链式比较支持 Python 风格的链式比较如10 num 20。在 visit_Compare 中链式比较被拆成两两比较并顺序短路一旦某一步不满足立即返回False不再继续求值。3.4 字段引用与字面量顶层字段直接用字段名引用如num、text、flag对应visit_Name中的self.sample.get(node.id)stats 字段__dj__stats__.key前缀引用对应Fields.stats例如读取某算子写入的统计值meta 字段__dj__meta__.key前缀引用对应Fields.meta例如__dj__meta__.a见visit_Name中prefix Fields.meta的分支字面量数字、字符串、布尔值、None以及列表[...]、元组(...)、集合{...}字面量分别由visit_Constant/visit_List/visit_Tuple/visit_Set支持。注意visit_Name中若出现带点的标识符且前缀不是__dj__stats__或__dj__meta__会抛出ValueError: Unsupported prefix任何未支持的 AST 节点类型如函数调用、算术运算会在generic_visit中抛出ValueError: Unsupported node type。因此表达式只支持“比较 逻辑 成员关系”这一受控子集不会执行任意 Python 代码这正是其在数据流水线中安全可用的原因。3.5 官方示例中的典型写法10 num 30 and text ! nothing here and __dj__meta__.a 3该示例同时演示了链式数值比较、字符串不等于比较、以及嵌套 meta 字段引用三种能力。四、执行机制两阶段过滤与 stats 缓存4.1 Data-Juicer Filter 的标准执行流程所有 filter 算子都继承自 data_juicer/ops/base_op.py 中的Filter基类其run方法见 base_op.py采用两阶段机制compute_stats 阶段dataset.map(self.compute_stats, ...)为每个样本计算统计量并写入__dj__stats__字段process 阶段dataset.filter(self.process, ...)根据统计结果产出布尔值决定样本去留。因此general_field_filter将compute_stats_single与process_single分开实现。4.2 求值写入 statscompute_stats_single源码 general_field_filter.py 的关键逻辑def compute_stats_single(self, sample, contextFalse): if ( not self.filter_condition or self.filter_condition or StatsKeys.general_field_filter_condition in sample[Fields.stats] ): return sample transformer ExpressionTransformer(sample) result transformer.transform(self.ast_tree) sample[Fields.stats][StatsKeys.general_field_filter_condition] result return sample这里有三个值得注意的设计空条件短路条件为空字符串时不做任何求值直接返回原样本对应测试test_empty_condition空条件下所有样本都被保留已计算短路幂等如果__dj__stats__中已经存在键general_field_filter_condition则跳过求值——这与文档所述“如果过滤条件为空或已经计算过则不会重新评估样本”一致保证重复调用不会重复计算也便于多算子流水线复用结果写入 stats求值得到的布尔结果被记录在StatsKeys.general_field_filter_condition常量定义见 data_juicer/utils/constant.py可供后续算子或stats_export_path导出分析使用。4.3 决策过滤process_single源码 general_field_filter.py 的实现非常简洁def process_single(self, sample: Dict) - bool: return sample.get(Fields.stats, {}).get(StatsKeys.general_field_filter_condition, True)即返回 stats 中记录的布尔值若没有记录例如条件为空默认返回True全部保留。4.4 缺失字段与 None 的语义这是该算子最容易踩坑、也最值得掌握的行为。在visit_Comparegeneral_field_filter.py中有明确的缺失值处理规则字段不存在或值为None时普通比较 ! 一律视为不满足返回Falsein且左操作数缺失返回False如tag in allowed_tags中tag缺失则被排除not in且左操作数缺失返回True如tag not in allowed_tags中tag缺失则被保留in / not in的右操作数容器缺失同样按上述规则处理。这些行为都有对应测试验证test_field_missingnum字段缺失的样本被自动排除、test_membership_missing_operand、test_notin_missing_operand见 tests/ops/filter/test_general_field_filter.py。五、效果演示与测试用例详解以下演示均源自 docs/operators/filter/general_field_filter.md 与对应单元测试并补充了源码层的解释。5.1 test_simple_comparison简单链式比较配置GeneralFieldFilter(filter_condition10 num 20)输入三条样本样本textnumSample 1sample15Sample 2sample215Sample 3sample325输出仅保留sample2num15 落在区间内并在__dj__stats__中写入general_field_filter_condition: True。对应测试见 test_general_field_filter.py。原理链式比较10 num 20被解析为两层ast.Compare先算10 15True再把15作为左操作数算15 20True两段都成立才返回 True。5.2 test_field_missing缺失字段自动排除配置GeneralFieldFilter(filter_conditionnum 5)输入三条样本其中 Sample 2 完全没有num字段样本textnumSample 1sample15Sample 2sample2缺失Sample 3sample325输出仅保留sample1。缺失num字段的 Sample 2 自动被排除因为visit_Compare对缺失左操作数的普通比较返回False。对应测试见 test_general_field_filter.py。5.3 更多测试覆盖的能力矩阵单元测试文件还覆盖了以下能力可作为表达式写法的最佳实践参考见 tests/ops/filter/test_general_field_filter.py测试名表达式示例验证的能力test_logical_andnum 10 and flag True逻辑与组合test_logical_ornum 10 or num 20逻辑或组合test_membership_with_literal_containerslang in [en, zh] and domain not in (spam, ads)列表/元组字面量的成员关系test_membership_with_sample_field_and_stringtag in allowed_tags and bad not in text容器来自样本字段 字符串子串判断test_membership_with_set_literallang in {en, zh}集合字面量test_nested_field__dj__meta__.a 2嵌套 meta 字段test_combined_conditions10 num 20 and __dj__meta__.a 2链式比较 嵌套字段 逻辑组合test_invalid_conditioninvalid syntax语法错误在构造期抛ValueErrortest_empty_condition空条件全部保留test_complex_condition(num 10 or num 20) and flag True and text!sample3括号优先级 多条件组合提示bad not in text这类写法实际执行的是 Python 的子串包含判断str not in str可用于快速排除含敏感词的文本而tag in allowed_tags则是成员关系判断字段值是否在容器内两种in的语义由操作数类型自然决定。六、实战集成建议6.1 与流水线配置结合将general_field_filter放入process列表即可参与 process_data.py 驱动的数据加工流水线例如在其它 mapper 产出__dj__meta__字段后用它对元数据做二次把关process: - some_mapper_op: # 前置算子写入 __dj__meta__.xxx ... - general_field_filter: filter_condition: __dj__meta__.quality_score 0.8 and text not in (, NA)6.2 性能与语义注意点构造期即校验表达式语法错误会在算子初始化时立即抛出ValueError应尽量在配置阶段用简单脚本先行验证表达式可被ast.parse只支持受控子集不要尝试函数调用、算术表达式如num * 2 10或切片等ExpressionTransformer.generic_visit会对未支持的节点抛ValueError缺失字段语义对普通比较缺失字段默认“不满足”被过滤对not in缺失字段默认“满足”被保留。设计条件时务必考虑字段缺失情况必要时先经 mapper 补全字段stats 幂等复用因为结果会写入__dj__stats__.general_field_filter_condition且已计算即跳过同一流水线中重复声明该算子不会造成重复计算也便于通过stats_export_path见 base_op.py导出统计、复盘过滤比例。七、相关资源算子文档docs/operators/filter/general_field_filter.md算子源码data_juicer/ops/filter/general_field_filter.py单元测试tests/ops/filter/test_general_field_filter.py算子列表索引docs/Operators.md全量配置模板data_juicer/config/config_all.yamlgeneral_field_filter声明见 L903-L904Filter 基类执行流程data_juicer/ops/base_op.py两阶段compute_stats/process机制见 L912-L944统计键常量定义data_juicer/utils/constant.pygeneral_field_filter_condition见 L421-L422赞分享人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载相关推荐Reactotron 桌面应用 3.x 演进全解析从 Timeline 深度搜索到 MCP 与敏感数据脱敏Reactotron 桌面应用 3.x 演进全解析从 Timeline 深度搜索到 MCP 与敏感数据脱敏 Reactotron 是一款用于检视 React人工智能大模型数据工程数据清洗数据增强数据质检Nix 存储层Nix Store完全解析Store Object、Store Path、Derivation 与 Build TraceNix 存储层Nix Store完全解析Store Object、Store Path、Derivation 与 Build Trace 导读 Nix 存人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 视频时长过滤算子video_duration_filter深度解析参数配置、实现原理与实战用法Data Juicer 视频时长过滤算子video_duration_filter深度解析参数配置、实现原理与实战用法 视频时长是视频数据质量清洗中最基础人工智能大模型数据工程数据清洗数据增强数据质检上一篇一条命令搞定中国省市区街道 sql/json 数据从克隆到入库指南下一篇北理工论文附录编号BIThesis模板字母编号设置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表