Skip to content

标记工具doccano私有化部署及二次开发

什么是doccano?

doccano 是一种面向机器学习从业者的开源数据标记工具。您可以使用多种数据格式执行不同类型的标记任务。

背景

当时所在的组是AI技术组,算法同学分析客服与客户的对话,从而进行自然语言处理(NLP)研究;所以需要一个工具,来标记对话中的文本是积极的还是消极的,作为算法的数据源来分析;正好开源工具doccano基本符合我们的需求,有特殊的需求,前端可以自己进行二次开发;

因此需要进行私有化部署以及二次开发;

私有化部署

doccano后端使用Python来实现的,前端使用nuxt来实现的。一起通过docker提供服务。

部署架构设计

私有化部署按照文档流程来进行就可以了。由于该开源工具提供的服务是前后端都在一个docker容器里启动,提供服务的。为了保证服务稳定性而且要满足可以二次开发,我设计的部署架构如下图所示。这样用户访问的前端是前端自己二次开发的仓库,调用的接口是开源工具私有化部署的docker服务;

前端二次开发

doccano中把前端仓库frontend拷贝出来就可以二次开发,然后单独部署提供前端服务了。

前端部署脚本改动:

为了提高服务的稳定性已经增加服务启动、停止、报错等日志记录功能。通过pm2来启动服务。

新增文件pm2.config.js

javascript
// pm2 start pm2.config.js
module.exports = {
  apps: [
    {
      name: 'doccano-frontend',
      script: './node_modules/nuxt/bin/nuxt.js',
      args: 'start',
      cwd: './', // current workspace
      // watch: [
      //   // watch directorys and restart when they change
      //   '.nuxt'
      // ],
      ignore_watch: [
        // ignore watch
        'node_modules',
        'logs',
        'static'
      ],
      max_memory_restart: "2G",
      instances: 2,  // start 2 instances
      node_args: '--harmony',
      exec_mode: 'cluster',
      autorestart: true,
      watch: false,
      env: {
        NODE_ENV: 'development'
      },
      env_production: {
        NODE_ENV: 'production'
      },
      // env: {
      //   NODE_ENV: process.env.NODE_ENV,
      // },
      out_file: './logs/out.log', // normal log
      error_file: './logs/err.log', // error log
      merge_logs: true,
      log_date_format: 'YYYY-MM-DD HH:mm Z' // date format
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

然后在package.json中增加scripts脚本命令,这样方便启动服务

js
"scripts": {
    "lint": "eslint --ext .ts,.js,.vue --ignore-path .gitignore .",
    "lintfix": "eslint --fix --ext .ts,.js,.vue --ignore-path .gitignore .",
    "precommit": "yarn lint",
    "test": "jest",
    "dev": "nuxt",
    "pm2": "pm2 start pm2.config.js",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate"
  },

1
2
3
4
5
6
7
8
9
10
11
12

之后就可以按照需求修改项目中的前端页面和交互了,还可以自定义新增功能。

使用手册备忘

私有化部署完,当时官网文档并不友好,不全面,所以记录了一下操作文档备忘。

管理员新建用户

登录超级管理员账号访问如下链接,添加用户并授予相关权限

{前端部署域名}/admin/

其中AUTHENTICATION AND AUTHORIZATION这一栏可以添加Groups和添加修改Users

主页介绍

如图右上角按钮依次为

  • 白天夜晚主题切换
  • 语言切换
  • 进入项目视图
  • 登录与退出

项目新建与删除

访问点击项目按钮进入

{前端部署域名}/zh/projects

删除:选中直接可以直接删除

新建项目

如图填写相关信息,选择项目类型即可创建项目 然后进入项目详情页面:

主页这里面有一些介绍引导的视频,已经比较详细了,下面也大致说一下

设置标签

可以导入导出标签,这里手动新建结果标签

这里可以设置新标签的名称、快捷键(标注时会用到)、标签颜色 这里我们新建两个标签

书写打标签指南

这里可以书写不同标签打标机的规则,在打标签时不确定可以看这个指南的预览

成员管理

添加人员并分配角色

数据集导入导出

导入:

点击选择文件或者拖动文件到按钮处

这里我上传的附件test.csv

点击蓝色确认上传

点击左上角按钮开始打标签

如果不清楚打标签的规则可以预览指南文档

选中关键字的时候可以点击选择,也可以快捷键选择标签

然后就可以数据导出或者查看统计了

针对已经标记部分数据的数据集如何处理呢,pre-label 上面项目中的数据导出文件为admin.jsonl

我们新建下一个项目的时候可以直接导出,看到已经标记的标签,如新建pre-lebel项目

上传数据集的时候选择jsonl时要注意这里的text和label要根据具体数据源字段修改字段名

由于我们需要导入的数据结构是这样的:

所以把text=>修改为data,然后上传数据

上传上面的admin.jsonl文件,可以直接看到之前的标记结果

评论

标注过程中,在导航预览旁边也有评论的入口,评论数据都可以在侧边栏评论处统一查看

设置

这里数据量比较大的时候,可能Auto Labeling的功能也很强大,但是还不太会用