DoTAT迭代标注(Epoch)机制揭秘:复用已有标注,多轮标注不再从零开始
【免费下载链接】MarkToolDoTAT 是一款基于web、面向领域的通用文本标注工具,支持大规模实体标注、关系标注、事件标注、文本分类、基于字典匹配和正则匹配的自动标注以及用于实现归一化的标准名标注,同时也支持迭代标注、嵌套实体标注和嵌套事件标注。标注规范可自定义且同类型任务中可“一次创建多次复用”。通过分级实体集合扩大了实体类型的规模,并设计了全新高效的标注方式,提升了用户体验和标注效率。此外,本工具增加了审核环节,可对多人的标注结果进行一致性检验、自动合并和手动调整,提高了标注结果的准确率。项目地址: https://gitcode.com/gh_mirrors/ma/MarkTool
DoTAT 是一款基于 Web 的领域通用文本标注工具,支持大规模实体标注、关系标注、事件标注和文本分类。它的Epoch(轮次)机制正是为「迭代标注」而设计:每一轮标注都会被分配成一个独立的 Epoch,第二轮开始时可以直接复用上一轮已有的标注结果,标注员只需要做修正和增补,而不是从零开始。今天我们就来完整拆解这套机制的前后端实现。🔍
一、Epoch 是什么:把多轮标注切成「轮次」
在传统标注流程中,同一个文档往往要经历多轮处理:
- 迭代优化:模型训练后发现误标,需要人工回炉重标;
- 多人一致性检验:多人各自标一遍,再核对分歧;
- 规范更新:标注规范修订后,旧数据需要按新规范复审。
DoTAT 把「一次分配给一组标注员的标注工作」抽象为一个Epoch(轮次)。每个 Epoch 拥有:
| 组成 | 说明 |
|---|---|
| 任务文档集合 | 本轮要标注的文档 |
| 标注员/审核员 | 本轮参与的人员分配 |
| 标注进度 | 已标注条数、总条数、进度百分比 |
| 标注结果记录 | 本轮产生的实体、关系、事件、分类等结果 |
也就是说,Epoch 是 DoTAT 中「任务 + 人员 + 结果」的最小管理单元,多轮标注就是多个 Epoch 的叠加。🧩
二、管理员端:一键分配,快速创建 Epoch
创建 Epoch 的动作发生在「新建任务」的向导流程里。管理员依次完成:填写任务信息 → 上传文档 → 上传字典/正则(可选)→指定标注员与审核员并提交分配。最后一步提交时代码会发起fenpeiepoch(分配 Epoch)请求,把本轮的人员配置写入该任务的 Epoch 接口:
- 前端流程入口:src/views/taskManagement/newTask.vue
- 状态层封装:src/store/modules/project.js
- 接口定义:
POST /api/projects/{projectid}/epoches/,见 src/api/project.js
分配完成后,管理员可以在任务详情页看到每位标注员、每个轮次的进度表格(列名就是「轮次」+ 进度条),实时掌握多轮标注的推进情况:
- 进度展示页面:src/views/taskManagement/taskDetails.vue
- 查询某项目全部 Epoch 的接口:
GET /api/projects/{id}/epoches/,见 src/api/project.js
💡 小技巧:Epoch 的创建与任务向导强绑定,一次分配即生成一个轮次,避免了「手动建轮次、再挂人」的繁琐操作。
三、标注员端:任务总览,带着 epochid 进入标注
标注员登录后进入的是「标注任务总览」页面。页面把该标注员名下的所有 Epoch 以表格形式列出:任务 ID、任务名称、任务状态、已标注条数、总标注条数、任务进度,并配有醒目的「标注」按钮。
关键逻辑在两处源码中:
拉取自己的轮次列表:页面通过
user/getEpoch请求GET /api/annotators/{userid}/epoches/,拿到分配给自己的所有 Epoch,并回填任务名称与模板类型。- 总览页面:src/views/label/index.vue
- 接口定义:src/api/user.js
携带 epochid 跳转标注页:点击「标注」时,路由 query 中带上
epochid(即当前轮次 ID);标注页读取该参数后,调用GET /api/annotators/epoches/{epochid}/docs/只加载本轮 Epoch 内的文档,从而保证「本轮只标本轮的文档」。- 跳转逻辑:src/views/label/index.vue
- 标注页解析 epochid:src/views/label/labeling.vue
整个过程中,epochid像一条主线贯穿「总览 → 文档列表 → 标注 → 结果提交」,前端状态也在 src/store/modules/user.js 中以SET_EPOCHID形式全局保存,供标注、提交等环节随时取用。
四、复用核心揭秘:第二轮标注到底复用了什么?
这是 Epoch 机制最有价值的部分。DoTAT 为每个 Epoch 单独记录其标注结果,提供了按轮次查询标注结果的接口:
POST /api/projects/epoches/{epochid}/docs/annotationResults/- 接口定义:src/api/project.js
- 状态层封装
getannres:src/store/modules/project.js
基于这个能力,第二轮标注的实际工作流是:
- 新 Epoch 创建后,文档进入标注员的任务总览;
- 打开文档时,系统可以调出上一轮 Epoch 中该文档已有的人为标注结果作为底稿;
- 标注员在已有实体、关系、事件的基础上修正、删除错误标注、补充新标注;
- 本轮结果写入新 Epoch 自己的结果记录,历史轮次原样保留。
带来的直接收益:
- ⏱️效率提升:只需处理分歧与新增,不再逐字逐句从零标注;
- 📜可追溯:每一轮的结果独立存档,随时可以回溯「这个实体是哪一轮加的、谁改的」;
- 🔄可迭代:规范更新、模型反馈修正等场景天然适配,一轮一存档。
五、审核员的 Epoch:从多人标注到一致结果
Epoch 不只服务标注员,也服务审核员。审核端同样按轮次取数:
- 审核员轮次列表:
GET /api/reviewers/{reviewerid}/epoches/ - 轮次内文档列表:
GET /api/reviewers/epoches/{epochid}/docs/ - 接口定义:src/api/reviewer.js
- 审核轮次状态管理:src/store/modules/reviewer.js
- 审核入口页面:src/views/review/index.vue
审核员在某个 Epoch 内对比多人标注结果,通过一致性检验 + 自动合并 + 手动调整产出该轮的最终标注。这意味着:一轮(Epoch)= 一组多人标注 + 一次审核收敛,多轮迭代下来,数据质量逐轮提升,形成完整的「标注 → 审核 → 再标注」闭环。✅
六、Epoch 机制相关文件速查表
| 环节 | 文件路径 | 说明 |
|---|---|---|
| 任务创建与 Epoch 分配 | src/views/taskManagement/newTask.vue | 新建任务向导,提交人员分配 |
| Epoch 接口层 | src/api/project.js | 创建/查询 Epoch、查询标注结果 |
| 项目状态管理 | src/store/modules/project.js | fenpeiepoch、getannres封装 |
| 标注任务总览 | src/views/label/index.vue | 标注员轮次列表与跳转 |
| 标注工作台 | src/views/label/labeling.vue | 解析 epochid 加载本轮文档 |
| 标注员接口 | src/api/user.js | 我的轮次、轮次文档 |
| 用户状态管理 | src/store/modules/user.js | 全局保存当前 epochid |
| 审核轮次 | src/views/review/index.vue / src/store/modules/reviewer.js | 审核员轮次与文档取数 |
| 任务进度查看 | src/views/taskManagement/taskDetails.vue | 按标注员、轮次展示进度 |
写在最后
DoTAT 的 Epoch 机制把「多轮标注」这件复杂的事,收敛成了三个简单动作:分配生成轮次、轮次内复用结果、审核后收敛数据。对标注团队而言,它省去了重复劳动和版本混乱;对数据而言,每一轮都有据可查。如果你正在搭建大规模、多轮次的文本标注流水线,这套「一次分配、多轮复用」的设计思路非常值得借鉴。🚀
【免费下载链接】MarkToolDoTAT 是一款基于web、面向领域的通用文本标注工具,支持大规模实体标注、关系标注、事件标注、文本分类、基于字典匹配和正则匹配的自动标注以及用于实现归一化的标准名标注,同时也支持迭代标注、嵌套实体标注和嵌套事件标注。标注规范可自定义且同类型任务中可“一次创建多次复用”。通过分级实体集合扩大了实体类型的规模,并设计了全新高效的标注方式,提升了用户体验和标注效率。此外,本工具增加了审核环节,可对多人的标注结果进行一致性检验、自动合并和手动调整,提高了标注结果的准确率。项目地址: https://gitcode.com/gh_mirrors/ma/MarkTool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考