第二章:数据标注与准备——标注规范制定、常见标注工具、数据格式与质量评估
数据标注,说白了就是给文本“贴标签”。
我见过太多团队,模型选得再好,算法调得再花哨,最后都栽在数据上。为什么?因为标注质量不过关。你想想看,模型学的是标注员给的数据,如果标注本身就有问题,那模型能学出什么好东西?
这一章,我们就来聊聊数据标注与准备的几个核心环节。我会结合我踩过的坑,给你讲清楚。
2.1 标注规范制定:别让标注员猜你的心思
标注规范,就是你和标注员之间的“合同”。
我刚开始做关系抽取时,犯过一个低级错误。我给了标注员一份很简短的规范,大概就两页纸。结果呢?标注员把“张三的妻子是李四”标成了“人物-夫妻”关系,而把“张三和李四是夫妻”标成了“人物-配偶”关系。同一个意思,两种标签,模型直接懵了。
所以,规范一定要细。细到什么程度?
- 实体类型定义要明确:比如“人物”实体,要不要包含“张三的父亲”这种复合实体?我建议不包含,只标最小粒度的实体。
- 关系类型定义要互斥:比如“夫妻”和“配偶”只能选一个。别让标注员纠结。
- 边界情况要举例:比如“苹果公司”和“苹果手机”,前者是组织,后者是产品。不举例,标注员很容易标错。
- 否定与歧义处理:比如“张三没有和李四结婚”,这里的关系是“否定”,还是“无关系”?我一般会单独加一个“否定关系”标签。
核心原则:标注规范要能回答标注员的任何疑问。如果标注员需要频繁来问你,说明规范不够细。
2.2 常见标注工具:LabelStudio vs BRAT
工具选得好,效率翻倍。我主要用过两款:LabelStudio 和 BRAT。
2.2.1 LabelStudio
LabelStudio 是我现在的主力工具。为什么?因为它灵活。
- 支持多种标注类型:文本分类、序列标注、关系抽取,一个工具全搞定。
- 界面友好:拖拽式操作,标注员上手快。
- 可定制:你可以自己写配置,定义标签、关系、甚至快捷键。
- 支持协作:多人同时标注,还能做一致性检查。
举个例子,配置一个关系抽取任务,你只需要写一个简单的 XML 配置:
<View>
<Labels name="entity" toName="text">
<Label value="人物" background="red"/>
<Label value="组织" background="blue"/>
</Labels>
<Relations>
<Relation value="工作于"/>
<Relation value="出生于"/>
</Relations>
<Text name="text" value="$text"/>
</View>
嗯,就这么简单。标注员在界面上选中实体,再拉一条线连起来,就能标关系了。
2.2.2 BRAT
BRAT 是老牌工具了。我早期项目用过它。
- 轻量级:部署简单,一个 Python 脚本就能跑起来。
- 标注速度快:快捷键丰富,熟练后效率很高。
- 可视化好:标注结果一目了然。
但 BRAT 有个硬伤:不支持多人协作。你想想看,一个项目几百份文档,一个人标到猴年马月?而且 BRAT 的配置比较麻烦,需要写 .ann 文件格式。
我的建议:小团队(1-2人)可以用 BRAT,快速验证。大团队(3人以上)直接上 LabelStudio,省心。
2.3 数据格式:BIO 与 BILOU
标注完的数据,总要存成某种格式。最常用的就是 BIO 和 BILOU。
2.3.1 BIO 格式
BIO 是“Begin, Inside, Outside”的缩写。说白了,就是给每个字打一个标签。
- B-实体类型:实体的第一个字
- I-实体类型:实体的中间字或结尾字
- O:非实体
举个例子,句子“张三在北京工作”,标注后是这样的:
张 B-人物
三 I-人物
在 O
北 B-地点
京 I-地点
工 O
作 O
BIO 格式简单直观,但有个小问题:无法区分相邻的相同类型实体。比如“张三李四”,如果都是人物,BIO 会标成:
张 B-人物
三 I-人物
李 I-人物
四 I-人物
你看,模型会以为“张三李四”是一个实体。这就是 BIO 的局限。
2.3.2 BILOU 格式
BILOU 是 BIO 的升级版。它多了两个标签:
- L-实体类型:实体的最后一个字
- U-实体类型:单个字的实体
还是那个例子,“张三李四”用 BILOU 标:
张 B-人物
三 L-人物
李 B-人物
四 L-人物
这样模型就能清楚知道,这是两个独立的实体。我个人的经验是:如果实体长度变化大,或者经常出现单字实体,用 BILOU 更稳妥。
| 格式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| BIO | 简单、易实现 | 无法区分相邻同类型实体 | 实体类型少、长度固定 |
| BILOU | 能区分相邻实体、信息更丰富 | 标签数量多、模型复杂度略高 | 实体类型多、长度变化大 |
2.4 数据质量评估:别让垃圾数据毁了模型
数据标完了,不代表就能直接用了。你得先评估质量。
我曾经接手过一个项目,标注员标了 1 万条数据,我直接拿去训练模型,结果 F1 只有 0.3。后来一查,标注错误率高达 40%。嗯,从那以后,我养成了一个习惯:先评估,再训练。
评估数据质量,我一般看三个指标:
- 标注一致性:同一份数据,让两个标注员分别标,然后算他们的标注结果有多一致。常用指标是 Cohen's Kappa 系数。一般要求 Kappa > 0.8。
- 标注准确率:抽一部分数据,让专家重新标一遍,然后对比。准确率一般要求 > 95%。
- 标注覆盖率:看看有没有漏标的实体或关系。比如句子中明明有“张三”,但标注员没标出来。
注意:标注一致性低,说明规范有问题。标注准确率低,说明标注员能力不足。覆盖率低,说明标注员偷懒了。这三个问题,要分别处理。
评估完之后,我通常会做两件事:
- 反馈给标注员:把错误案例整理出来,开个短会,讲清楚为什么错。
- 重新标注:对于一致性低的数据,让标注员重新标,或者由专家仲裁。
只有经过质量评估的数据,才值得喂给模型。别嫌麻烦,这一步省了,后面模型调参的时间会加倍还给你。
一句话总结:标注规范要细,工具要顺手,格式要选对,质量要把关。数据准备好了,模型就成功了一半。