NLP工具——doccano标注系统自动标注功能使用

  • 0. 简介
  • 1. doccano安装
  • 2. 创建标注任务
  • 3. 写一个命名实体识别的接口
  • 4. 添加自动标注功能
  • 5. 增加标注员用户
  • 6. 数据导出

0. 简介

本文以序列标注为例,介绍doccano标注系统中,自动标注功能的使用。doccano是一个轻量的开源数据标注平台,采用Django实现,其主要优点在于部署和使用十分简便,个人认为比brat要方便很多。并且它支持自动标注和多人协同标注。

官方地址:https://github.com/doccano/doccano

这个工具我最近刚刚上手,实现了基本功能,但是可能也有介绍的不够准确的地方,请指出。

1. doccano安装

doccano的安装十分简单,无论是在windows PC上还是在Linux服务器上,都只需要根据官方的指引按部就班地完成即可。我安装的版本为1.6.2,需要一个python3.7或以上的环境。

pip install doccano==1.6.2

然后在改环境下终端初始化doccano并且创建管理员用户。

doccano init
# 在这里设置管理员的账号密码
doccano createuser --username admin --password pass

然后起一个web服务:

# 这里的端口号可自定义,注意不要与已有端口冲突
doccano webserver --port 8000

然后保持这个终端,再打开一个新的终端,进入之前下载doccano的python环境,启动:

doccano task

如果是在windows PC上起的服务,则可以通过本机ip访问:
http://127.0.0.1:8000/
局域网下其他计算机可以通过访问创建服务的本机ip+port(8000)进入到该页面。

如果是在服务器上,则可以通过服务器地址访问,例如,服务器地址为111.222.33.44,则访问
http://111.222.33.44:8000/即可。后面会用111.222.33.44来举例子。

进入到以下界面,点击右上角登录,输入之前创建的管理员用户账号密码,即可登录到系统中。

2. 创建标注任务

这一部分不做详细的介绍,基本上跟着系统提示的点点点就可以实现,如果有不清楚的地方,也可以参考其他人写的博客。
在这里我们创建一个序列标注任务:

然后需要设置标签,导入数据集。

3. 写一个命名实体识别的接口

在这里以百度的UIE为例,因为UIE可以自定义label做zero-shot,并且提供了数据格式转换和finetune的脚本,对整个流程形成闭环比较方便。

利用UIE进行标注,首先我们需要一个UIE的环境,需要paddlepaddle,以及写接口的工具,在这里我用的是flask,如果你想用fastapi或者其他框架,也都是可以的。

pip install paddlepaddle==2.3.1
pip install paddlenlp==2.3.4
pip install flask

在服务所在的设备上创建一个api.py,然后写识别的接口。

from flask import Flask, request, jsonify
from paddlenlp import Taskflowapp = Flask(__name__)# 在这里定义你想要识别的实体类型
# UIE具有zero-shot能力,所以类型可以随便定义,但是识别的好坏不一定
schema = ['时间', '地点', '国家', '人物']# 第一运行时,联网状态下会自动下载模型
# device_id为gpu id,如果写-1则使用cpu
ie = Taskflow('information_extraction', schema=schema, device_id=-1)def convert(result):result = result[0]formatted_result = []for label, ents in result.items():for ent in ents:formatted_result.append({"label": label,"start_offset": ent['start'],"end_offset": ent['end']})return formatted_result@app.route('/', methods=['POST'])
def get_result():text = request.json['text']print(text)result = ie(text)formatted_result = convert(result)return jsonify(formatted_result)if __name__ == '__main__':# 这里写端口的时候一定要注意不要与已有的端口冲突# 这里的host并不是说访问的时候一定要写0.0.0.0,但是这里代码要写0.0.0.0,代表可以被本网络中所有的看到# 如果是其他机器访问你创建的服务,访问的时候要写你的ipapp.run(host='0.0.0.0', port=5739)

然后我们运行它:

python api.py

看到如下信息,说明接口成功

[2022-07-11 10:04:51,619] [    INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'C:\Users\Administrator\.paddlenlp\taskflow\information_extraction\uie-base'.
e[37m---    fused 0 elementwise_add with relu activatione[0m
e[37m---    fused 0 elementwise_add with tanh activatione[0m
e[37m---    fused 0 elementwise_add with leaky_relu activatione[0m
e[37m---    fused 0 elementwise_add with swish activatione[0m
e[37m---    fused 0 elementwise_add with hardswish activatione[0m
e[37m---    fused 0 elementwise_add with sqrt activatione[0m
e[37m---    fused 0 elementwise_add with abs activatione[0m
e[37m---    fused 0 elementwise_add with clip activatione[0m
e[37m---    fused 0 elementwise_add with gelu activatione[0m
e[37m---    fused 0 elementwise_add with relu6 activatione[0m
e[37m---    fused 0 elementwise_add with sigmoid activatione[0m
e[37m---    fused 0 elementwise_sub with relu activatione[0m
e[37m---    fused 0 elementwise_sub with tanh activatione[0m
e[37m---    fused 0 elementwise_sub with leaky_relu activatione[0m
e[37m---    fused 0 elementwise_sub with swish activatione[0m
e[37m---    fused 0 elementwise_sub with hardswish activatione[0m
e[37m---    fused 0 elementwise_sub with sqrt activatione[0m
e[37m---    fused 0 elementwise_sub with abs activatione[0m
e[37m---    fused 0 elementwise_sub with clip activatione[0m
e[37m---    fused 0 elementwise_sub with gelu activatione[0m
e[37m---    fused 0 elementwise_sub with relu6 activatione[0m
e[37m---    fused 0 elementwise_sub with sigmoid activatione[0m
e[37m---    fused 0 elementwise_mul with relu activatione[0m
e[37m---    fused 0 elementwise_mul with tanh activatione[0m
e[37m---    fused 0 elementwise_mul with leaky_relu activatione[0m
e[37m---    fused 0 elementwise_mul with swish activatione[0m
e[37m---    fused 0 elementwise_mul with hardswish activatione[0m
e[37m---    fused 0 elementwise_mul with sqrt activatione[0m
e[37m---    fused 0 elementwise_mul with abs activatione[0m
e[37m---    fused 0 elementwise_mul with clip activatione[0m
e[37m---    fused 0 elementwise_mul with gelu activatione[0m
e[37m---    fused 0 elementwise_mul with relu6 activatione[0m
e[37m---    fused 0 elementwise_mul with sigmoid activatione[0m* Running on all addresses.WARNING: This is a development server. Do not use it in a production deployment.* Running on http://xxx.xxx.xxx.xx:xxxx/ (Press CTRL+C to quit)* Serving Flask app 'app' (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: off

要确保接口没有问题,可以在postman测试,发POST请求,body中只有一个text字段。

这一步的操作在PC或者服务器上没有区别。

4. 添加自动标注功能

现在我们有了doccano标注平台,以及一个自动标注的接口,接下来要做的就是把它们两个放在一起。
我们进入标注系统,用管理员账号登录,点击左下角的Settings,然后选择Auto Labeling,然后会弹出下面的窗口,我们选择Custom REST Request

点击Next,填写自动标注服务所在的地址,就是你的ip+端口,比如你的PC或者服务器的ip是
111.222.33.44,在上面第3步中py里边的port写的是1234,则应该填写如下:

然后ParamsHeaders中都空着,Body填写如下:

注意,这里的value中,text和括号之间有两个空格,我一开始因为没看到空格,在这里卡住好久(参考连接:https://github.com/doccano/doccano/issues/1417)
这里写完之后可以输入一句话来测试你的接口,比如我们输入一句话“小明昨天去了北京”,点击Test,如果得到了图中的结果,说明接口运行正常,否则需要去前面的环节找问题。

进入Next,在图中所示位置加入这样一段代码:

代码如下:

[{% for entity in input %}{"start_offset": {{ entity.start_offset }},"end_offset": {{ entity.end_offset}},"label": "{{ entity.label }}"}{% if not loop.last %},{% endif %}{% endfor %}
]

最后一步,需要建立从接口到标注平台的标签映射,这一步的作用是把你的接口识别出来的实体类型,映射到第2步中创建的标注平台的label,例如在api中定义了时间,在平台创建label的时候定义的label名称是时间日期,那么就需要建立他们之间的一个映射,把所有的映射建立起来就可以了:

最后Test->Finish,大功告成。

接下来,在标注的界面中,就可以通过打开魔法棒,来实现自动标注的功能:

通过测试我发现,第一篇文章进入的时候,并不会触发自动标注,自动标注的动作在你点击上一篇或者下一篇的按钮时触发(也有可能是我的操作有问题),所以第一篇文章如果要获取标注结果,需要先点击到第二篇,然后再回到第一篇。

此外,尽量使用GPU进行自动标注,UIE只占2G多显存,要求已经很低了。如果是cpu的话,连续的触发自动标注很容易造成任务阻塞。

至此,自动标注就大功告成了。

5. 增加标注员用户

我们需要进入Django的管理界面,地址是你的ip+标注服务的端口+admin/,例如
111.222.33.44:1234/admin/
进入界面之后,在users点击add,即可添加标注员用户:

然后回到标注系统的项目中,在成员中即可添加新的标注成员。

6. 数据导出

doccano的数据导出存在问题,可以参考这个项目进行数据导出:
https://github.com/taishan1994/doccano_export
下载这个项目到本地或你的服务器(起标注服务的设备),然后打开doccano_export.py,
修改为正确的db.sqlite3地址:

conn = sqlite3.connect(r'C:\Users\Administrator\doccano\db.sqlite3')

这个地址需要自己去找,在windows中一般是默认的地址,Linux服务器上可能是以下地址:

conn = sqlite3.connect('/root/doccano/db.sqlite3')

然后python运行它,就可以正确的导出了。

以上就是本篇全部内容了,如果有任何疑问可以在下方留言或直接联系我。最近半年一直在做产品的事情,相关技术不方便开源,所以有一阵子没有更新了,接下来还是尽量跟进一些新鲜的技术分享给大家,你的点赞就是我更新的动力,我们下期再见。

NLP工具——doccano标注系统自动标注功能使用相关推荐

  1. 摹客标注:自动标注一键生成,手动标注自由补充

    熬着夜手动做标注? 用工具自动标注,却被攻城狮追命连环call? 设计稿标注--其实--可以「自动+手动」! 摹客,「自动标注」一键生成,「手动标注」自由补充, 助你五星通过标注大关~ 「自动+手动」 ...

  2. 在基于图像的深度学习中如何做数据的自动标注以及自动标注的等级介绍

    作者:Tobias Schaffrath Rosario 编译:ronghuaiyang 原文:在基于图像的深度学习中如何做数据的自动标注以及自动标注的等级介绍_ronghuaiyang的博客-CSD ...

  3. unit自动驾驶怎么使用_特斯拉7.0系统自动驾驶功能操作全面解析

    去年十月,特斯拉便开始为Model S配备相关硬件,并不断推送自动驾驶技术的升级: 12个超声波传感器:一个前雷达,一个前置摄像头:以及一套高精度.数字化操控的电子辅助制动系统. 而在今年的10月23 ...

  4. Tesla技术方案深度剖析:自动标注/感知定位/决策规划/场景重建/场景仿真/数据引擎...

    作者 | 石桥  编辑 | 汽车人 原文链接:zhuanlan.zhihu.com/p/584024853 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点 ...

  5. ui标注生成html,自动标注一键生成,手动标注自由补充

    熬着夜手动做标注? 用工具自动标注,却被攻城狮追命连环call? 设计稿标注--其实--可以「自动+手动」! 助你五星通过标注大关~ 为什么标注需要「自动+手动」? 手动标注到自动标注,在设计界是有一 ...

  6. UG NX 10.0 永久关闭连续自动标注尺寸

    文件-实用工具-用户默认设置-草图-自动判断约束和尺寸,去掉勾选"在设计应用程序中连续自动标注尺寸".重启软件! 默认情况下"连续自动标注尺寸"按钮是激活的,即 ...

  7. Tesla数据标注系统解析

    模型需要数据来驱动,模型决定上限,而数据帮助模型到达这个上限.自动驾驶时代,所有的感知任务最终都要在现实的3D世界中应用,数据集的规模也不再是几万张,几十万张,或者几百万张图片,与之前的情况已不可同日 ...

  8. 如何关闭苹果手机自动扣费_教你关闭苹果手机系统的自动更新功能,旧手机还能再用几年!...

    大家都知道,苹果手机在更新几个大版本后,手机不是变得非常卡,就是非常的耗电,大大的缩短了手机的使用寿命. 所以,许多人都不会选择更新系统,但是手机只要连上WiFi并且在充电状态,就会在半夜自动更新系统 ...

  9. Tesla AI Day视觉自动驾驶技术解读:感知+规划+矢量地图+自动标注+仿真

    作者 | 赵行  编辑 | 汽车人 原文链接:https://zhuanlan.zhihu.com/p/570824078 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干 ...

最新文章

  1. hadoop 2.0 详细配置教程
  2. Mysql —— C语言链接mysql数据库,用户 角色 权限(用户根据角色的不同拥有增删改查的权限、用户有三种认证方式)
  3. Linux内核源码目录说明
  4. 国家自然科学基金2020年预算减少22亿元
  5. 我会铭记这一天:2016年10月25日
  6. php手机号码一分钟发送一次短信_如何实现php手机短信验证功能
  7. ARM 中断状态和SVC状态的堆栈切换 (异常)【转】
  8. python生成器的作用是什么_看完这篇,你就知道Python生成器是什么
  9. Android简单的发短信示例
  10. 【网络安全】永恒之蓝实战 - Mac通过Metasploit攻击Server2008
  11. 软件架构模式 mark Richards - 读后总结 6 - 整合
  12. 微信小程序学习日记7
  13. 51nod 1423 最大“二货”【单调栈】
  14. 微信H5、网页、内置Web浏览器 清理缓存,微信浏览器缓存
  15. 云服务器、虚拟主机、VPS的区别与差异(超详细解说)
  16. Suse12离线安装docker
  17. 绿皮书一些quant 题目 (1)
  18. Python 猜数字小游戏,3次机会
  19. 做一个简单的根据按键不同改变盒子颜色
  20. 安卓GB28181云台控制和预置位查询

热门文章

  1. https安全证书过期的原因
  2. (Java实现) 洛谷 P1605 迷宫
  3. mysql怎么快速删除亿级数据_mysql数据库如何实现亿级数据快速清理
  4. 爬取优美图库里的照片,并存到文件夹中
  5. python爬虫,python学习,如何用python爬取视频资源
  6. R语言基础指令和并行算法初识(上篇)
  7. SEAndroid安全机制中的文件安全上下文关联分析
  8. 如何屏蔽百度网盟广告
  9. 服务器UDIMM、LRDIMM、RDIMM的区别
  10. kafka数据清理配置——删除篇