强烈推荐:数据标注平台doccano----简介、安装、使用、踩坑记录

网友投稿 915 2022-10-19

强烈推荐:数据标注平台doccano----简介、安装、使用、踩坑记录

1.doccano的安装与初始配置

1.1 doccano的用途

document classification 文本分类sequence labeling 序列标注,用于命名实体识别sequence to sequence seq2seq,用于翻译speech to text 语音转文本标注命名实体标注序列标注(如机器翻译)文本分类任务(如情感分析)

官方文档:

​​GitHub - doccano/doccano: Open source annotation tool for machine learning practitioners.​​

1.2 安装与初始配置

记的进虚拟环境!!!!!

Step 1. 本地安装doccano(请勿在AI Studio内部运行,本地测试环境python=3.8)

$ pip install doccano

Step 2. 初始化数据库和账户(用户名和密码可替换为自定义值)

# 初始化,设置用户名= admin,密码=passdoccano initdoccano createuser --username admin --password pass-------------------------个人设置---------------------------$ doccano init$ doccano createuser --username my_admin_name --password my_password

Step 3. 启动doccano

在一个窗口启动doccano的WebServer,保持窗口

$ doccano webserver --port 8000

在另一个窗口启动doccano的任务队列

$ doccano task

打开浏览器(推荐Chrome),在地址栏中输入​​doccano无法上传标注的数据 or 无法导出标注数据

2.1  上传下载数据---界面不断加载状态

在另一个终端中,运行以下命令: doccano task 看一下原文档。运行的话,重新按一下回车键!!!

2.2 端口被占用

启动的时候不要使用应用程序(我是开着酷狗音乐软件,这个软件占用了端口),如果使用的话会报以下错误:

OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

2.3 导出数据报错

导出数据时如果报错:找到writer.py这个文件

C:\Users\Glenn.conda\envs\dataannotation\Lib\site-packages\backend\api\views\download\writer.py

line 9,增加encoding="utf-8"

class LineWriter(BaseWriter): extension = 'txt' def write(self, records: Iterator[Record]) -> str: files = {} for record in records: filename = os.path.join(self.tmpdir, f'{record.user}.{self.extension}') if filename not in files: f = open(filename, mode='a',encoding="utf-8") #就是这个位置 files[filename] = f f = files[filename] line = self.create_line(record) f.write(f'{line}\n') for f in files.values(): f.close() save_file = self.write_zip(files) for file in files: os.remove(file) return save_file

3.项目:doccano来标注实体和关系

3.1 项目创建

参考文档:

​​PaddleNLP/doccano.md at develop · PaddlePaddle/PaddleNLP · GitHub​​

UIE支持抽取与分类两种类型的任务,根据实际需要创建一个新的项目:抽取式任务项目创建创建项目时选择序列标注任务,并勾选Allow overlapping entity及Use relation Labeling。适配命名实体识别、关系抽取、事件抽取、评价观点抽取等任务。分类式任务项目创建创建项目时选择文本分类任务。适配文本分类、句子级情感倾向分类等任务。

以抽取为例:

勾选序列标注(​​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)之间的关系,事件抽取中论元和触发词之间的关系。

注意,这里只是添加将来可供选择的标签,是项目配置的过程,而不是进行文本标注。

在弹出的“创建标签”窗口里面,在第一行写上标签的名字。例如在NER的例子中,可以写People、Location、Organization等。

在第二行添加该标签对应的快捷键---短键。例如,我们给People设置的快捷键是p。将来在打标的时候,右手用鼠标选中段落中的文字(例如“白居易”),左手在键盘按下快捷键p,就可以把被选中的文字打标成“People”。

再往下,我们可以给标签自定义颜色。

此时,一个标签就添加完成了。我们以同样的方法添加其他所需要的标签。

3.4 任务标注

3.4.1 命名实体识别

命名实体识别(Named Entity Recognition,简称NER),是指识别文本中具有特定意义的实体。在开放域信息抽取中,抽取的类别没有限制,用户可以自己定义。

标注示例:

示例中定义了​​时间​​​、​​选手​​​、​​赛事名称​​​和​​得分​​四种Span类型标签。

3.4.2 关系抽取

关系抽取(Relation Extraction,简称RE),是指从文本中识别实体并抽取实体之间的语义关系,即抽取三元组(实体一,关系类型,实体二)。

标注示例:

示例中定义了​​作品名​​​、​​人物名​​​和​​时间​​​三种Span类型标签,以及​​歌手​​​、​​发行时间​​​和​​所属专辑​​三种Relation标签。Relation标签由Subject对应实体指向Object对应实体。

3.4.3 事件抽取

事件抽取 (Event Extraction, 简称EE),是指从自然语言文本中抽取事件并识别事件类型和事件论元的技术。UIE所包含的事件抽取任务,是指根据已知事件类型,抽取该事件所包含的事件论元。

标注示例:

示例中定义了​​地震触发词​​​(触发词)、​​等级​​​(事件论元)和​​时间​​​(事件论元)三种Span标签,以及​​时间​​​和​​震级​​两种Relation标签。触发词标签统一格式为​​XX触发词​​,​​XX​​​表示具体事件类型,上例中的事件类型是​​地震​​​,则对应触发词为​​地震触发词​​。Relation标签由触发词指向对应的事件论元。

3.4.4 评价观点抽取

评论观点抽取,是指抽取文本中包含的评价维度、观点词。

标注示例:

示例中定义了​​评价维度​​​和​​观点词​​​两种Span标签,以及​​观点词​​一种Relation标签。Relation标签由评价维度指向观点词。

3.4.5 分类任务

标注示例:

示例中定义了​​正向​​​和​​负向​​两种类别标签对文本的情感倾向进行分类

3.5 数据导出

3.5.1 导出抽取式任务数据

选择导出的文件类型为​​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​​

在为机器学习的语料库打标的时候,由于语料库一般比较大,如果让一个人给所有的文本打标的话,那到地老天荒都完不成。因此,我们需要多个人协同完成语料库的打标工作。

也就是在初始配置doccano的时候创建的超级用户admin。因此,为了让其他人参与到打标项目中来,我们首先需要为其他成员创建账户。

我们打开网页​​administration,并用超级用户的账号密码登陆该管理系统。

具体见链接:​​如何使用文本标注工具——doccano?​​

3.7.标注完数据转化:

该章节详细说明如何通过​​doccano.py​​脚本对doccano平台导出的标注数据进行转换,一键生成训练/验证/测试集。

3.7.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 \ --negative_ratio 5

3.7.2 分类式任务数据转换

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.py​​ 脚本会按照比例将数据划分为 train/dev/test 数据集每次执行​​doccano.py​​ 脚本,将会覆盖已有的同名数据文件在模型训练阶段我们推荐构造一些负例以提升模型效果,在数据转换阶段我们内置了这一功能。可通过​​negative_ratio​​控制自动构造的负样本比例;负样本数量 = negative_ratio * 正样本数量。对于从doccano导出的文件,默认文件中的每条数据都是经过人工正确标注的。

各个任务标注文档参考:

​​https://github.com/PaddlePaddle/PaddleNLP/blob/develop/model_zoo/uie/doccano.md​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:零基础搭建boot+MybatisPlus的详细教程
下一篇:【虹科分享】在容器上使用 ntop 工具的最佳实践
相关文章

 发表评论

暂时没有评论,来抢沙发吧~