3.5 增值加工:数据标注与增强 本节摘要:标注给数据加上模型要学的信号,增强在存量数据上扩增有效样本。本节比较人工、预标注加复核、主动学习三种开工方式的成本质量三角,给出弱监督规则的代码实践与一致性检验,并划清合理增强与制造分布偏差的边界。 流水线走到最后一道增值加工。3.4 节的成品库里躺着干净的"原料态"数据——有正文、有字段、有版本,但很多任务还缺两样东西:标签(情感是正是负、这段话属于哪个主题)与规模(某些类别样本太少,训练不动)。标注与增强就是补这两样的工序。 标注的三种开工方式 先看一组会改变决策的成本直觉:纯人工标注一条评论的情感,成本低到可以忽略,但乘上十万条就是几个人月;
本节摘要:标注给数据加上模型要学的信号,增强在存量数据上扩增有效样本。本节比较人工、预标注加复核、主动学习三种开工方式的成本质量三角,给出弱监督规则的代码实践与一致性检验,并划清合理增强与制造分布偏差的边界。
流水线走到最后一道增值加工。3.4 节的成品库里躺着干净的"原料态"数据——有正文、有字段、有版本,但很多任务还缺两样东西:标签(情感是正是负、这段话属于哪个主题)与规模(某些类别样本太少,训练不动)。标注与增强就是补这两样的工序。
先看一组会改变决策的成本直觉:纯人工标注一条评论的情感,成本低到可以忽略,但乘上十万条就是几个人月;模型预标注加人工复核能把人工量压到三成,代价是引入模型偏见——预标注模型的错误会被标注员顺水推舟地接受;主动学习只把"模型最没把握"的样本送人工,单位标注量的信息收益最高,代价是流程复杂、要有人维护训练闭环。三种方式不是三选一,而是按任务阶段组合:冷启动用弱监督规则打底,上量用预标注加复核,精修用主动学习。

冷启动阶段最实用的武器是弱监督——用领域知识写规则打初标,再抽检校准。规则标注器写成独立函数,方便逐条评估精度:
from dataclasses import dataclass @dataclass class RuleLabeler: rules: list # (标签, 关键词组) 列表,命中即标注 default: str = "unknown" def label(self, text: str) -> str: for tag, keywords in self.rules: if any(k in text for k in keywords): return tag return self.default labeler = RuleLabeler(rules=[ ("正面", ["很好", "满意", "回购", "推荐", "超出预期"]), ("负面", ["差评", "退货", "失望", "质量差", "客服敷衍"]), ]) samples = ["用了一周非常满意,会回购", "质量差,已经申请退货", "包装还行"] for s in samples: print(s, "->", labeler.label(s)) # 输出: # 用了一周非常满意,会回购 -> 正面 # 质量差,已经申请退货 -> 负面 # 包装还行 -> unknown def audit_precision(labeled: list[tuple[str, str]], gold: dict[str, str]) -> float: """抽检校准:与人工金标比对规则精度""" hit = sum(1 for text, pred in labeled if pred != "unknown" and gold.get(text) == pred) total = sum(1 for _, pred in labeled if pred != "unknown") return hit / total if total else 0.0 gold = {"用了一周非常满意,会回购": "正面", "质量差,已经申请退货": "负面"} print(f"规则精度: {audit_precision([(s, labeler.label(s)) for s in samples], gold):.0%}") # 输出:规则精度: 100%(样本太少仅作演示,实战抽五百条以上)
unknown 是设计出来的第三态:规则没把握就弃权,宁少勿错。被弃权的样本流去预标注或人工通道,不硬塞进训练集。
标注质量不能靠自觉,靠背靠背一致性检验。两名标注员对同一批样本独立打标,算一致性系数,低于阈值说明标注指南有歧义:
def cohen_kappa(a: list[str], b: list[str]) -> float: """标注一致性:剔除随机吻合后的真实一致程度""" assert len(a) == len(b) n = len(a) labels = sorted(set(a) | set(b)) p_o = sum(1 for x, y in zip(a, b) if x == y) / n # 观察一致率 p_e = sum( (a.count(l) / n) * (b.count(l) / n) for l in labels # 随机一致期望 ) return (p_o - p_e) / (1 - p_e) if p_e < 1 else 1.0 ann_a = ["正面", "负面", "正面", "中性", "负面", "正面", "中性", "正面"] ann_b = ["正面", "负面", "正面", "负面", "负面", "正面", "正面", "正面"] k = cohen_kappa(ann_a, ann_b) print(f"一致性系数: {k:.2f}") # 输出:一致性系数: 0.55 # 解读:低于0.6,两人在中性负面边界分歧大,标注指南需要补充边界案例后重标
0.55 的系数给出了明确的行动指令:不是换人,是修指南。把两人在"中性还是负面"上的分歧案例写进标注文档,附上仲裁结论,重新小批量试标——这个循环转起来,标注质量的护城河才算动工。
增强手段本身不难:同义改写、回译、欠采样热门类别、过采样长尾类别。难的是守住两条边界。第一,标签保持:情感改写不能把"失望"改成中性句式,改写管线要过 3.3 节那类抽检。第二,分布监督:增强后重跑 3.1 节的分布约束检查,某个类别从一成被过采样到四成,训练分布就漂了——模型会过度拟合被灌水的类别。测试集则永远不参与增强,评测口径一旦污染,所有指标失去意义。
预标注加复核省了人力,也带来两个惯性故障。故障一:复核员顺着模型走——预标注模型的错误被顺水推舟地接受。识别办法是把若干"已知正确答案"的样本混入复核批次,如果复核员连这些都不改、照单全收,说明复核已流于形式;处置是把抽检命中率计入复核环节的质检指标,而不是只考核速度。故障二:规则标注器悄悄过时——语料里新出现"避雷""踩坑"这类新负面词,旧规则认不出,unknown 比例的周环比上升就是信号;把 unknown 率做成看板指标,超过基线即触发规则库更新。两个故障的共同解法是给标注工序配一块小仪表盘:unknown 率、抽检命中率、一致性系数三个数在线,标注质量的退化就藏不住。
增值加工收工,质检流水线全线贯通:需求定单、货源评审、三层清洗、三层仓储、标注增强。下一章数据出库,派往四条 AI 专线——先从体量最大的文本专线开始。