news 2026/5/14 5:22:08

Doccano自动标注实战:我用它3天搞定了一个NER项目的数据标注

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Doccano自动标注实战:我用它3天搞定了一个NER项目的数据标注

Doccano自动标注实战:我用它3天搞定了一个NER项目的数据标注

1. 项目背景与挑战

上个月接到了一个从新闻文本中抽取公司名和职位的NER任务,标注量约5000条。作为独立开发者,既没有专业标注团队,也没有充足预算购买商业标注服务。传统人工标注效率太低,而完全依赖预训练模型又担心准确率。经过技术选型,最终决定采用Doccano+轻量级模型的半自动方案,没想到3天就完成了全部工作。

这个方案的核心优势在于:

  • 80%标注工作由模型自动完成,人工仅需校验和修正
  • Doccano的协同功能支持多人并行校验
  • 全流程可视化,标注进度和质量实时可控

关键决策点:选择UIE模型而非spaCy,因为前者支持zero-shot自定义实体类型,更适合本项目快速启动

2. 环境搭建与数据准备

2.1 快速部署Doccano 1.6.2

在Ubuntu 20.04服务器上部署仅需三步:

# 创建Python3.8虚拟环境 python -m venv doccano_env source doccano_env/bin/activate # 安装指定版本 pip install doccano==1.6.2 # 初始化服务 doccano init # 设置管理员账号 doccano webserver --port 8000 & # 后台运行 doccano task & # 启动任务队列

常见踩坑点:

  • 端口冲突导致服务无法启动(建议先用netstat -tulnp检查)
  • 未安装SQLite3开发库导致数据库初始化失败(Ubuntu需apt install libsqlite3-dev

2.2 原始数据处理技巧

新闻数据往往包含大量HTML标签和特殊字符,需要预处理:

import re from bs4 import BeautifulSoup def clean_text(text): # 去除HTML标签 text = BeautifulSoup(text, 'html.parser').get_text() # 合并连续空格 text = re.sub(r'\s+', ' ', text) # 过滤特殊字符 return text.encode('ascii', 'ignore').decode().strip()

预处理后的数据按每行一条文本的格式保存为news_data.txt,方便后续导入。

3. 自动标注系统搭建

3.1 模型选型对比

模型准确率推理速度显存占用定制难度
UIE-base78%15ms/条2.3GB★★☆☆☆
spaCy-zh65%8ms/条1.1GB★★★★☆
BERT-CRF82%45ms/条4.5GB★★★★★

最终选择UIE模型,因其在少样本场景下表现最佳:

from paddlenlp import Taskflow schema = ['公司名', '职位'] ie = Taskflow('information_extraction', schema=schema, device_id=0) # 使用GPU # 测试样例 text = "阿里巴巴CEO张勇宣布组织架构调整" print(ie(text)) # 输出: [{'公司名': [{'text': '阿里巴巴', 'start': 0, 'end': 4}], '职位': [{'text': 'CEO', 'start': 4, 'end': 7}]}]

3.2 自动化接口开发

使用FastAPI构建高性能标注接口:

from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class RequestData(BaseModel): text: str @app.post("/predict") async def predict(data: RequestData): result = ie(data.text) return { "entities": [ { "label": label, "start_offset": ent['start'], "end_offset": ent['end'], "text": ent['text'] } for label in result[0] for ent in result[0][label] ] }

启动服务:

uvicorn api:app --host 0.0.0.0 --port 5739

4. 标注流程优化实战

4.1 Doccano配置关键步骤

  1. 项目创建

    • 选择"Sequence Labeling"类型
    • 标签设置:公司名(蓝色)、职位(红色)
  2. 自动标注集成

    // REST接口配置 { "url": "http://your_server_ip:5739/predict", "method": "POST", "headers": {"Content-Type": "application/json"}, "body": {"text": "{{text}}"} }
  3. 标签映射

    • 接口返回的公司名→ Doccano标签公司名
    • 接口返回的职位→ Doccano标签职位

4.2 效率提升技巧

第一天:完成2000条自动标注

  • 发现模型对缩写公司名识别差(如"阿里"→"阿里巴巴")
  • 解决方案:在接口层添加别名映射表
company_alias = { "阿里": "阿里巴巴", "腾讯": "腾讯控股", # ... } def normalize_company(name): return company_alias.get(name, name)

第二天:团队协作校验

  • 3人同时工作,通过Doccano的"Assign"功能分配任务
  • 使用Comments功能标记有争议的标注

第三天:质量检查与导出

  • 随机抽样500条检查,准确率达到92%
  • 导出格式选择JSONL,包含原始文本和标注span

5. 关键问题与解决方案

5.1 典型错误案例

  1. 复合职位识别

    • 错误示例:"高级产品经理"被拆分为"高级"和"产品经理"
    • 修复方法:在UIE的schema中添加复合职位类别
  2. 公司名包含职位

    • 错误示例:"腾讯研究院"被误标为公司名
    • 解决方案:添加否定词表过滤

5.2 性能优化

当处理长文本时(>1000字),UIE速度明显下降。采用分块处理策略:

def chunk_text(text, max_len=500): sentences = text.split('。') chunks = [] current_chunk = "" for sent in sentences: if len(current_chunk) + len(sent) < max_len: current_chunk += sent + "。" else: chunks.append(current_chunk) current_chunk = sent + "。" if current_chunk: chunks.append(current_chunk) return chunks

6. 项目成果与经验

最终获得的标注数据质量:

  • 准确率:91.2%(人工评估)
  • 覆盖率:88.7%(相比纯人工标注)

成本对比:

方式耗时人力成本工具成本
纯人工2周¥6000¥0
本方案3天¥1500¥300

几个实用建议:

  1. 自动标注前先人工标注100条作为模型微调数据
  2. 设置明确的标注规范文档(特别是边界案例)
  3. 定期导出数据备份,防止意外丢失
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 5:13:46

嵌入式与硬件设计前沿:IIoT、FIDO、TSN与GaN无线充电实战解析

1. 项目概述&#xff1a;一场面向硬件工程师的在线技术盛宴如果你是一名嵌入式系统开发者、汽车电子工程师&#xff0c;或者正在为你的智能硬件产品寻找无线充电方案&#xff0c;那么最近一段时间密集出现的线上技术研讨会&#xff0c;绝对值得你花时间关注。这不是泛泛而谈的理…

作者头像 李华
网站建设 2026/5/14 5:13:45

理发店预约系统开源项目Shearcraft-Booking部署与架构解析

1. 项目概述&#xff1a;一个面向理发店的在线预约系统最近在帮一个开理发店的朋友折腾线上预约的事情&#xff0c;发现很多中小型理发店、美发沙龙&#xff0c;甚至是个体发型师&#xff0c;都还在用微信接龙、电话预约或者直接在日历本上画叉叉的老办法。客户体验差不说&…

作者头像 李华
网站建设 2026/5/14 5:13:04

基于ChatGPT与Mattermost构建企业级智能问答机器人:从RAG到生产部署

1. 项目概述&#xff1a;一个连接ChatGPT与Mattermost的智能机器人最近在折腾团队协作工具&#xff0c;发现很多团队还在用传统的群聊方式处理一些重复性的问答&#xff0c;比如新同事问“公司的报销流程是什么&#xff1f;”或者开发同学问“上周发布的API文档在哪里&#xff…

作者头像 李华
网站建设 2026/5/14 5:13:04

技术教育如何从工具操作转向思维培养:批判性思维与工程实践融合

1. 项目概述&#xff1a;一场关于技术教育未来的深度对话最近翻看一些老资料&#xff0c;又看到了EE Times在2012年那篇关于“重建美国”系列的文章&#xff0c;核心是探讨批判性思维技能的必要性。虽然时间过去十多年&#xff0c;但里面一位工程师韦恩拉斯特&#xff08;Wayne…

作者头像 李华
网站建设 2026/5/14 5:12:04

Win11+Ubuntu 22.04双系统安装保姆级教程:从分区到ROS2环境配置全记录

Win11与Ubuntu 22.04双系统全流程配置指南&#xff1a;从分区到ROS2开发环境搭建 当开发者需要在本地机器上同时运行Windows生产力工具和Linux开发环境时&#xff0c;双系统方案往往是最可靠的选择。不同于虚拟机可能存在的性能损耗和容器方案的功能限制&#xff0c;物理机上的…

作者头像 李华
网站建设 2026/5/14 5:08:07

educoder--网络实验--Wireshark实战:NAT地址转换全流程解析

1. 初识NAT&#xff1a;为什么我们需要地址转换&#xff1f; 想象一下你家的门牌号。小区里每家都有独立门牌&#xff0c;但整个小区对外可能只有一个大门地址。NAT&#xff08;网络地址转换&#xff09;就是互联网世界的"小区管理员"&#xff0c;它让多台设备共享一…

作者头像 李华