两者不是同一个信号:空值通常表示“没有可分词的内容或没有命中”,零值通常表示“有内容,但某个计数维度的结果是0”。在单个样本上,这两种返回看起来都像“没结果”;一旦规模化处理,把它们混为一谈就会导致误判。判断方法不是猜,而是回到输入、输出字段和调用上下文,看该位置返回的到底是“缺失”还是“计数值”。
分词工具的输出一般包含分词结果、词条列表、词频或位置信息等字段。要区分空值和零值,第一步不是看词条数量,而是看哪个字段为空、哪个字段为0。
null,通常说明该次调用没有产生可用的分词结果,可能是输入为空、编码异常或调用未成功。0,说明分词过程产生了结果,只是该维度计数为零,例如某类词性数量为零。这一步的实际动作是:把响应中的字段逐一列出,标出哪些是缺失、哪些是数值0。这个动作的结果会直接决定下一步——缺失字段要查输入和调用链,数值0要查统计口径和过滤规则。两者排查方向不同,不能共用同一套处理逻辑。
单看输出有时不够,需要结合输入判断。假设一段文本经过清洗后只剩标点或空白字符,分词工具返回空列表,这属于输入侧导致的空值。假设一段正常中文文本返回了词条,但某个词频统计为0,这属于统计侧产生的零值。
可以建立一个简单的对照:
这里的关键取舍是:保留原始输入快照,还是只保留输出结果。如果只保留输出,后续无法反推空值来自输入还是处理逻辑;如果保留输入快照,排查成本会上升,但能避免把“输入为空”误判成“工具失效”。在规模化场景下,建议至少对异常样本保留输入摘要,而不是对所有样本全量留存。
在少量样本上,你可能会发现“空值就是没结果,零值就是计数为零”,于是把它写成统一判断规则。但规模化后,例外往往来自三类情况:
null表示未计算,有的用0表示未计算,语义并不统一。因此,个别样本上成立的判断,不能直接照搬到全量。实际动作是:先抽样确认该工具对空值和零值的字段约定,再决定是否把规则写入批处理逻辑。如果跳过这一步,批处理可能把大量“未计算”当成“计数为零”,从而得出错误结论。
面对空值和零值混用,处理策略大致有三种,各自适用条件不同。
保留原值适用于:你需要保留工具原始语义,后续由人工或另一层逻辑判断。前提是下游能区分缺失和0,否则保留也会被误读。
改写为统一标记适用于:批处理流程只关心“是否有结果”,不关心具体计数。前提是你接受丢失“未计算”和“计数为零”之间的差异。改写动作本身会改变数据含义,必须记录改写规则。
退出该字段适用于:该字段在规模化后例外过多,继续使用会引入系统性误判。前提是你有其他字段可以替代,或者该维度并非决策必需。退出不是失败,而是承认该字段在当前口径下不可靠。
选择哪一种,取决于你的下游用途:如果下游是人工复核,保留原值更稳妥;如果下游是自动聚合,改写前必须先确认工具对空值和零值的定义。
假设某分词工具对一段文本返回词条列表,同时返回一个“专有名词数量”字段。样本A输入为空白,词条列表为空,专有名词数量为null;样本B输入为正常句子,词条列表非空,专有名词数量为0。如果批处理把两者都转成0,就会把“没有输入”和“有输入但没有专有名词”合并成同一类。后续统计“专有名词出现率”时,分母会包含本不该计入的空输入样本,结果被稀释。这个例子说明:区分空值和零值,不是为了字段好看,而是为了不让分母和分子混入不同性质的样本。
具体到你的工具,字段命名、默认值和异常返回方式需要以实际返回结果为准;不同工具之间不能直接套用同一套字段约定。先做小样本对照,再决定批处理规则,是成本最低的路径。