# 文本分类任务doccano使用指南
**目录**
* [1. 安装](#安装)
* [2. 项目创建](#项目创建)
* [3. 数据上传](#数据上传)
* [4. 标签构建](#标签构建)
* [5. 任务标注](#任务标注)
* [6. 数据导出](#数据导出)
* [7. 数据转换](#数据转换)
## 1. 安装
**以下标注示例用到的环境配置:**
- Python 3.8+
- doccano 1.6.2
在终端(terminal)使用pip安装doccano:
```shell
pip install doccano==1.6.2
```
安装完成后,运行以下命令行:
```shell
# Initialize database.
doccano init
# Create a super user.
doccano createuser --username admin --password pass
# Start a web server.
doccano webserver --port 8000
```
在新的终端(terminal)运行如下命令行:
```shell
# Start the task queue to handle file upload/download.
doccano task
```
在浏览器打开[http://127.0.0.1:8000/](http://127.0.0.1:8000/),输入用户名和密码登录,开始使用doccano进行标注。doccano支持中文版本,可以点击右上角选择ZH(中文)。
doccano还支持PostgreSQL、Docker、Docker Compose等安装方式,详情请参考[doccano官方文档](https://github.com/doccano/doccano) 完成doccano的安装与初始配置。
## 2. 项目创建
文本分类支持多分类、多标签、层次分类三种类型的文本分类任务。
点击创建(Create)开始创建一个新的项目,选择文本分类,然后填写项目名称、描述、Tags等项目信息。如果是多分类任务或者是单路径层次分类任务,勾选 `Allow single label` ,勾选后标签标注只允许选择一个标签进行标注。点击创建成功创建一个doccano项目。
## 3. 数据上传
点击数据集-操作-导入数据集,开始导入本地待标注数据集:
doccano支持`TextFile`、`TextLine`、`JSONL`和`CoNLL`四种数据上传格式,文本分类本地数据集定制训练中**统一使用TextLine**这一文件格式,即上传的文件需要为txt等格式,且在数据标注时,该文件的每一行待标注文本显示为一页内容。
上传的文件为txt等格式,每一行为一条待标注文本,示例:
```text
黑苦荞茶的功效与作用及食用方法
交界痣会凸起吗
检查是否能怀孕挂什么科
鱼油怎么吃咬破吃还是直接咽下去
幼儿挑食的生理原因是
...
```
上传数据类型**选择TextLine**,选择待标注文本或拖拽文本导入doccano项目中,点击导入,导入待标注数据集。
## 4. 标签构建
点击标签-操作-创建标签,开始添加分类类别标签:
填入分类类别标签,选择标签颜色,建议不同标签选择不同颜色,最后点击保存或保存并添加下一个,保存标签:
文本分类标签构建示例:
**NOTE:**
我们默认层次分类标签不同层的标签之间具有关联性,以下图为例一个样本具有标签美短虎斑,我们默认还包含美国短毛猫和猫两个标签。
对于层次分类任务的分类标签我们建议使用标签层次结构中**叶结点标签路径作为标签**,以上图的标签结构为例,我们建议使用`##`作为分隔符,分隔不同层之间的标签:
## 5. 任务标注
标注示例,选择对应的分类类别标签,输入回车(Enter)键确认:
## 6. 数据导出
选择数据集-操作-导出数据集,将标注好的数据导出,我们默认所有数据集已经标注完成且正确:
选择导出的文件类型为``JSONL``,导出数据:
导出数据示例:
```text
{"id": 23, "data": "黑苦荞茶的功效与作用及食用方法", "label": ["功效作用"]}
{"id": 24, "data": "交界痣会凸起吗", "label": ["疾病表述"]}
{"id": 25, "data": "检查是否能怀孕挂什么科", "label": ["就医建议"]}
{"id": 26, "data": "鱼油怎么吃咬破吃还是直接咽下去", "label": ["其他"]}
{"id": 27, "data": "幼儿挑食的生理原因是", "label": ["病因分析"]}
```
标注数据保存在同一个文本文件中,每条样例占一行且存储为``jsonl``格式,其包含以下字段
- ``id``: 样本在数据集中的唯一标识ID。
- ``data``: 原始文本数据。
- ``label``: 文本对应类别标签。
## 7.数据转换
该章节详细说明如何通过`doccano.py`脚本对doccano平台导出的标注数据进行转换,一键生成训练/验证/测试集。当标注完成后,在 doccano 平台上导出 `JSON` 形式的文件,并将其重命名为 `doccano.jsonl`。
### 7.1 多分类任务
通过 [doccano.py](./doccano.py) 脚本进行数据形式转换,然后便可以按照[多分类文本任务指南](multi_class/README.md)中固定格式进行相应模型训练。
数据标注转化运行:
```shell
python doccano.py \
--doccano_file doccano.jsonl \
--save_dir ./data \
--splits 0.8 0.1 0.1 \
--task_type "multi_class"
```
稀疏数据识别出的有效标注请增加配置参数`--valid`,脏数据清洗的标注数据(文本中有脏数据标签)请增加配置参数`--dirty`,更多稀疏数据识别和脏数据清洗详见[多分类训练评估与模型优化指南](multi_class/analysis/README.md)
### 7.2 多标签任务
通过 [doccano.py](./doccano.py) 脚本进行数据形式转换,然后便可以按照[多标签文本分类任务指南](multi_label/README.md)中固定格式进行相应模型训练。
数据标注转化运行:
```shell
python doccano.py \
--doccano_file doccano.jsonl \
--save_dir ./data \
--splits 0.8 0.1 0.1 \
--task_type "multi_label"
```
稀疏数据识别出的有效标注请增加配置参数`--valid`,脏数据清洗的标注数据(文本中有脏数据标签)请增加配置参数`--dirty`,更多稀疏数据识别和脏数据清洗详见[多标签训练评估与模型优化指南](multi_label/analysis/README.md)
### 7.3 层次分类任务
通过 [doccano.py](./doccano.py) 脚本进行数据形式转换,然后便可以按照[层次文本分类任务指南](hierarchical/README.md)中固定格式进行相应模型训练。
数据标注转化运行:
```shell
python doccano.py \
--doccano_file doccano.jsonl \
--save_dir ./data \
--splits 0.8 0.2 \
--task_type "hierarchical"
```
稀疏数据识别出的有效标注请增加配置参数`--valid`,脏数据清洗的标注数据(文本中有脏数据标签)请增加配置参数`--dirty`,更多稀疏数据识别和脏数据清洗详见[层次分类训练评估与模型优化指南](hierarchical/analysis/README.md)
可配置参数说明:
- ``doccano_file``: 从doccano导出的数据标注文件。
- ``save_dir``: 训练数据的保存目录,默认存储在``data``目录下。
- ``splits``: 划分数据集时训练集、验证集所占的比例。默认为[0.8, 0.2]表示按照``8:2``的比例将数据划分为训练集、验证集。
- ``task_type``: 可选,选择任务类型,有多分类,多标签,层次分类三种类型的任务。
- ``is_shuffle``: 是否对数据集进行随机打散,默认为True。
- ``seed``: 随机种子,默认为1000.
- ``separator``: 不同层标签之间的分隔符,该参数只对层次文本分类任务有效。默认为"##"。
- ``valid``: 是否为稀疏数据筛选的有效标注数据,默认为False.
- ``dirty``: 是否为脏数据清洗策略标注数据,默认为False.
转化后的doccano标注数据目录结构如下:
```text
data/
├── train.txt # 训练数据集文件
├── dev.txt # 开发数据集文件
├── test.txt # 测试训练集文件(可选,数据划分为 train/dev/test 数据集)
├── label.txt # 分类标签文件
└── data.txt # 待预测数据文件
```
备注:
- 默认情况下 [doccano.py](./doccano.py) 脚本会按照比例将数据划分成train/dev 数据集,也可以划分为 train/dev/test 数据集。
- 脚本会自动生成data.txt,如果数据划分为 train/dev/test 数据集,data.txt则为test数据集无标签数据;如果数据划分为 train/dev 数据集,data.txt为无标签数据。**如果有未标注数据,则用未标注数据文件替换data.txt**
- 每次执行 [doccano.py](./doccano.py) 脚本,将会覆盖已有的同名数据文件
- 对于从doccano导出的文件,默认文件中的每条数据都是经过人工正确标注的。
## References
- **[doccano](https://github.com/doccano/doccano)**