doccano是documment anotation的缩写,是一个开源的文本标注工具,我们可以用它为NLP任务的语料库进行打标。它支持情感分析,命名实体识别,文本摘要,关系抽取等任务。
它的操作非常便捷,在小型语料库上,只要数小时就能完成全部的打标工作。
下面介绍一下如何安装、配置和使用doccano。
1. 安装
本文是基于anaconda来进行安装。
首先,在anaconda下创建虚拟环境:
conda create -n doccano python=3.9
注:建议python版本为3.9+
然后,激活doccano环境:
conda activate doccano
在doccano环境下安装doccano:
pip install doccano
2. 运行
在doccano环境下执行:
# 初始化数据库
doccano init
# 创建一个super user。这里要把pass改成你需要的密码。当然,用户名也可以改成别的。
doccano createuser --username admin --password pass
启动doccano
首先,在终端中运行下面的代码来启动WebServer
# 启动webserver
doccano webserver --port 8000
然后,打开另一个终端,运行下面的代码启动任务队列:
# 启动任务队列
doccano task
此时,我们就完成了doccano的启动。
3. 文本标注
运行doccano与创建新的文本打标项目
首先,打开浏览器(最好是Chrome),在地址栏中输入http://localhost:8000/并回车。
此时,我们会看到这样的界面
点击右上角进行登录
3.1 项目创建
以江河数据标注任务为例:
UIE支持抽取与分类两种类型的任务,根据实际需要创建一个新的项目:
- 抽取式任务项目创建
创建项目时选择序列标注任务,并勾选Allow overlapping entity及Use relation Labeling。适配命名实体识别、关系抽取、事件抽取、评价观点抽取等任务。
- 分类式任务项目创建
创建项目时选择文本分类任务。适配文本分类、句子级情感倾向分类等任务。
-
创建项目。点击左上角的
CREATE
,跳转至以下界面。 -
选择序列标注模块
-
勾选序列标注(
Sequence Labeling
) -
填写项目名称(
Project name
)等必要信息 -
勾选允许实体重叠(
Allow overlapping entity
)、使用关系标注(Use relation labeling
) -
创建完成后,项目首页视频提供了从数据导入到导出的七个步骤的详细说明。
3.2 数据上传
doccano总共支持4种格式的文本,他们的区别如下:
- Textfile:要求上传的文件为txt格式,并且在打标的时候,一整个txt文件在打标的时候显示为一页内容;
- Textline:要求上传的文件为txt格式,并且在打标的时候,该txt文件的一行文字会在打标的时候显示为一页内容;
- JSONL:是JSON Lines的简写,每行是一个有效的JSON值。
- CoNLL:是“中文依存语料库”,是根据句子的依存结构而建立的树库。其中,依存结构描述的是句子中词与词之间直接的句法关系。具体介绍看汉语树库。
注意:
- doccano官方推荐的文档编码格式为UTF-8。
- 在使用JSONL格式的时候,文字数据本身要符合JSON格式的规范。
- 数据集中不要包含空行。
选择Textline
3.3 添加标签
构建抽取式任务标签
抽取式任务包含Span与Relation两种标签类型,Span指原文本中的目标信息片段,如实体识别中某个类型的实体,事件抽取中的触发词和论元;Relation指原文本中Span之间的关系,如关系抽取中两个实体(Subject&Object)之间的关系,事件抽取中论元和触发词之间的关系。
注意,这里只是添加将来可供选择的标签,是项目配置的过程,而不是进行文本标注。
3.4 关系标注
标注数据。点击每条数据最右边的Annotate按钮开始标记。标记页面右侧的标签类型(Label Types)开关可在实体标签和关系标签之间切换。
- 实体标注:直接用鼠标选取文本即可标注实体。
- 关系标注:首先点击待标注的关系标签,接着依次点击相应的头尾实体可完成关系标注。
关系抽取(Relation Extraction,简称RE),是指从文本中识别实体并抽取实体之间的语义关系,即抽取三元组(实体一,关系类型,实体二)。
标注示例:
示例中定义了作品名
、人物名
和时间
三种Span类型标签,以及歌手
、发行时间
和所属专辑
三种Relation标签。Relation标签由Subject对应实体指向Object对应实体。
3.5 数据导出
3.5.1 导出抽取式任务数据
导出数据。在Datasets一栏点击Actions
、Export Dataset
导出已标注的数据。
选择导出的文件类型为JSONL(relation)
,导出数据示例:
{
"id": 38,
"text": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中",
"relations": [
{
"id": 20,
"from_id": 51,
"to_id": 53,
"type": "歌手"
},
{
"id": 21,
"from_id": 51,
"to_id": 55,
"type": "发行时间"
},
{
"id": 22,
"from_id": 51,
"to_id": 54,
"type": "所属专辑"
}
],
"entities": [
{
"id": 51,
"start_offset": 4,
"end_offset": 11,
"label": "作品名"
},
{
"id": 53,
"start_offset": 15,
"end_offset": 18,
"label": "人物名"
},
{
"id": 54,
"start_offset": 42,
"end_offset": 46,
"label": "作品名"
},
{
"id": 55,
"start_offset": 26,
"end_offset": 31,
"label": "时间"
}
]
}
标注数据保存在同一个文本文件中,每条样例占一行且存储为json
格式,其包含以下字段
id
: 样本在数据集中的唯一标识ID。
text
: 原始文本数据。entities
: 数据中包含的Span标签,每个Span标签包含四个字段:
id
: Span在数据集中的唯一标识ID。start_offset
: Span的起始token在文本中的下标。end_offset
: Span的结束token在文本中下标的下一个位置。label
: Span类型。relations
: 数据中包含的Relation标签,每个Relation标签包含四个字段:
id
: (Span1, Relation, Span2)三元组在数据集中的唯一标识ID,不同样本中的相同三元组对应同一个ID。from_id
: Span1对应的标识ID。to_id
: Span2对应的标识ID。type
: Relation类型。
3.5.2 导出句子级分类任务数据
选择导出的文件类型为JSONL
,导出数据示例:
{
"id": 41,
"data": "大年初一就把车前保险杠给碰坏了,保险杠和保险公司 真够倒霉的,我决定步行反省。",
"label": [
"负向"
]
}
标注数据保存在同一个文本文件中,每条样例占一行且存储为json
格式,其包含以下字段
-
id
: 样本在数据集中的唯一标识ID。 -
data
: 原始文本数据。 -
label
: 文本对应类别标签。
3.6 标注完数据转化:
该章节详细说明如何通过doccano.py
脚本对doccano平台导出的标注数据进行转换,一键生成训练/验证/测试集。
3.6.1 抽取式任务数据转换
- 当标注完成后,在 doccano 平台上导出
JSONL(relation)
形式的文件,并将其重命名为doccano_ext.json
后,放入./data
目录下。- 通过 doccano.py 脚本进行数据形式转换,然后便可以开始进行相应模型训练。
python doccano.py \
--doccano_file ./data/doccano_ext.json \
--task_type ext \
--save_dir ./data \
--splits 0.8 0.2 0 \
--schema_lang ch
可配置参数说明:
-
doccano_file
: 从doccano导出的数据标注文件。 -
save_dir
: 训练数据的保存目录,默认存储在data
目录下。 -
negative_ratio
: 最大负例比例,该参数只对抽取类型任务有效,适当构造负例可提升模型效果。负例数量和实际的标签数量有关,最大负例数量 = negative_ratio * 正例数量。该参数只对训练集有效,默认为5。为了保证评估指标的准确性,验证集和测试集默认构造全负例。 -
splits
: 划分数据集时训练集、验证集所占的比例。默认为[0.8, 0.1, 0.1]表示按照8:1:1
的比例将数据划分为训练集、验证集和测试集。 -
task_type
: 选择任务类型,可选有抽取和分类两种类型的任务。 -
options
: 指定分类任务的类别标签,该参数只对分类类型任务有效。默认为["正向", "负向"]。 -
prompt_prefix
: 声明分类任务的prompt前缀信息,该参数只对分类类型任务有效。默认为"情感倾向"。 -
is_shuffle
: 是否对数据集进行随机打散,默认为True。 -
seed
: 随机种子,默认为1000. -
separator
: 实体类别/评价维度与分类标签的分隔符,该参数只对实体/评价维度级分类任务有效。默认为"##"。 -
schema_lang
: 选择schema的语言,可选有ch
和en
。默认为ch
,英文数据集请选择en
。
备注:
- 默认情况下 doccano.py 脚本会按照比例将数据划分为 train/dev/test 数据集
- 每次执行 doccano.py 脚本,将会覆盖已有的同名数据文件
- 在模型训练阶段我们推荐构造一些负例以提升模型效果,在数据转换阶段我们内置了这一功能。可通过
negative_ratio
控制自动构造的负样本比例;负样本数量 = negative_ratio * 正样本数量。 - 对于从doccano导出的文件,默认文件中的每条数据都是经过人工正确标注的。
更多不同类型任务(关系抽取、事件抽取、评价观点抽取等)的标注规则及参数说明,请参考doccano数据标注指南。
3.6.2 句子级分类任务数据转换
- 当标注完成后,在 doccano 平台上导出
JSON
形式的文件,并将其重命名为doccano_cls.json
后,放入./data
目录下。 - 在数据转换阶段,我们会自动构造用于模型训练的prompt信息。例如句子级情感分类中,prompt为
情感倾向[正向,负向]
,可以通过prompt_prefix
和options
参数进行声明。 - 通过 doccano.py 脚本进行数据形式转换,然后便可以开始进行相应模型训练。
python doccano.py \
--doccano_file ./data/doccano_cls.json \
--task_type "cls" \
--save_dir ./data \
--splits 0.8 0.1 0.1 \
--prompt_prefix "情感倾向" \
--options "正向" "负向"
参考文章:doccano标注
网友评论