基于 Labelstudio 的 UIE 半监督智能标注计划(本地版)
更多技术细节参考上一篇我的项目,本篇次要偏重本地端链路走通教学,提速提效:
基于 Labelstudio 的 UIE 半监督深度学习的智能标注计划(云端版),提效
更多内容参考文末码源
自然语言解决信息抽取智能标注计划包含以下几种:
-
基于规定的标注计划:通过编写一系列规定来辨认文本中的实体、关系等信息,并将其标注。
- 基于规定的标注计划是一种传统的办法,它须要人工编写规定来辨认文本中的实体、关系等信息,并将其标注。
- 这种办法的长处是易于了解和实现,但毛病是须要大量的人工工作,并且规定难以笼罩所有状况。
-
基于机器学习的标注计划:通过训练模型来自动识别文本中的实体、关系等信息,并将其标注。
- 基于机器学习的标注计划是一种自动化的办法,它应用曾经标注好的数据集训练模型,并应用模型来主动标注文本中的实体、关系等信息。
- 这种办法的长处是能够解决大量的数据,并且能够自适应地调整模型,但毛病是须要大量的标注数据和计算资源,并且模型的性能受到标注数据的品质和数量的限度。
-
基于深度学习的标注计划:通过应用深度学习模型来自动识别文本中的实体、关系等信息,并将其标注。
- 基于深度学习的标注计划是一种最新的办法,它应用深度学习模型来主动从文本中提取实体、关系等信息,并将其标注。
- 这种办法的长处是能够解决大量的数据,并且具备 较高的准确性,但毛病是须要大量的标注数据和计算资源,并且模型的训练和调试须要业余的常识和技能。
-
基于半监督学习的标注计划:通过应用大量的手工标注数据和大量的未标注数据来训练模型,从而实现主动标注。
- 基于半监督学习的标注计划是一种利用大量的手工标注数据和大量的未标注数据来训练模型的办法。
- 这种办法的长处是能够利用未标注数据来进步模型的性能,但毛病是须要大量的未标注数据和计算资源,并且模型的性能受到标注数据的品质
- 基于近程监督的标注计划:利用已知的知识库来主动标注文本中的实体、关系等信息,从而缩小手工标注的工作量。
本次我的项目次要解说的是基于半监督深度学习的标注计划。
1. 智能标注本地版 Machine Learning 集成教学
1.1 本地启动 Label Studio
装置 label-studio:
# 创立名为 label_studio 的虚拟环境(示例的 Python 版本为 3.8)
conda create -n labelstudio python=3.8
#激活虚拟环境
conda activate labelstudio
#pip 装置 label-studio (version=1.7.2)
pip install label-studio==1.7.2
1.2 启动 Machine Learning Backend
在终端中顺次执行下列命令:
#装置 label-studio 机器学习后端,dirname 为放代码的文件夹门路
cd dirname
git clone https://github.com/heartexlabs/label-studio-ml-backend
#装置 label-studio 及其依赖
cd label-studio-ml-backend
pip install -U -e .
#(可选) 装置 label-studio 中 examples 运行所需的 requirements
pip install -r label_studio_ml/examples/requirements.txt
创立与启动模型: 定义模型
在应用 label-studio 后端之前,要先定义好本人的训练模型,模型的定义须要继承自 label-studio 指定的类,具体可参考第四节。
创立后端模型:依照要求创立好的模型文件的门路假如为 /Users/kyrol/Desktop/my_ml_backend.py,终端中执行以下命令:
# 初始化自定义机器学习后端
label-studio-ml init my_ml_backend --script /Users/kyrol/Desktop/my_ml_backend.py
#命令执行结束会在以后文件夹下创立名为 my_ml_backend 的文件夹,外面放有 my_ml_backend.py, _wsgi.py 等内容。#其中,_wsgi.py 是要运行的 python 主文件,能够查看外面内容。留神:同时须要把依赖文件放入 my_ml_backend.py 文件夹。# 开启机器学习后端服务
label-studio-ml start my_ml_backend
胜利启动后,在终端中能够看到 ML 后端的 URL。
1.3 模型配置与训练
开启可视化窗口,再开启一个终端窗口,首先,激活 conda 对应的环境;而后,cd 到 label-studio 代码所在门路;而后,执行以下终端命令,启动可视化的窗口:
在启动自定义机器学习后端之后,就能够将其增加到 Label Studio 我的项目中。
具体步骤如下:
-
配置训练数据文件
- 依据不同的工作配置不同的标签,在 settings 中点击 Labeling Interface, 配置我的项目标签,具体可参考官网。
-
训练模型
- 创立一个 project
- 点击 setting
- 点击 Machine Learning
- 配置模型训练端口,导入模型
- 训练后的模型会保留在 my_ml_backend 文件夹中以数字命名的文件夹内。
具体步骤如下所示:
- 点击 Settings – Machine Learning – Add Model
- 填入题目、ML 后端的 URL、形容(可选)等内容
- 抉择 Use for interactive preannotations 关上交互式预正文性能(可选)
- 点击 Validate and Save
1.3 获取交互式预正文
若要应用交互式预正文性能,需在增加 ML Backend 时关上 Use for interactive preannotations 选项。如未关上,可点击 Edit 进行编辑。而后轻易点击一个数据,label studio 就会轻轻运行方才的 ml backend 生成新的标注了。
查看预标注好的数据,如有必要,对标注进行批改。
- 本例中,预标注的后果中『NBA』没有被辨认进去,手动增加实体将其标注为『组织』。
- 本例中,预标注的后果中将『人名』实体『三月』错标注为『工夫』实体,手动进行批改。
批改实现后,或预标注的后果曾经合乎预期,点击 Submit 提交标注后果。
1.4 智能标注(主动再训练模型)
在标注了至多一项工作之后,就能够开始训练模型了。
点击 Settings – Machine Learning – Start Training 开始训练。
动态图为援用不便展现这个流程。
而后返回启动 label-studio-ml-backend 的窗口能够看到训练的流程启动了。
2.UIE-base 预训练模型进行命名实体辨认
from pprint import pprint
from paddlenlp import Taskflow
schema = ['地名', '人名', '组织', '工夫', '产品', '价格', '天气']
ie = Taskflow('information_extraction', schema=schema)
pprint(ie("2K 与 Gearbox Software 发表,《小缇娜的奇幻之地》将于 6 月 24 日凌晨 1 点登录 Steam,此前 PC 平台为 Epic 限时独占。在限定期间内,Steam 玩家能够在 Steam 动手《小缇娜的奇幻之地》,并在 2022 年 7 月 8 日前享有取得黄金英雄铠甲包。"))
[{'产品': [{'end': 35,
'probability': 0.8595664902550801,
'start': 25,
'text': '《小缇娜的奇幻之地》'}],
'地名': [{'end': 34,
'probability': 0.30077351606695757,
'start': 26,
'text': '小缇娜的奇幻之地'},
{'end': 117,
'probability': 0.5250433327469182,
'start': 109,
'text': '小缇娜的奇幻之地'}],
'工夫': [{'end': 52,
'probability': 0.8796518890642702,
'start': 38,
'text': '6 月 24 日凌晨 1 点'}],
'组织': [{'end': 2,
'probability': 0.6914450625760651,
'start': 0,
'text': '2K'},
{'end': 93,
'probability': 0.5971815528872604,
'start': 88,
'text': 'Steam'},
{'end': 75,
'probability': 0.5844303540013343,
'start': 71,
'text': 'Epic'},
{'end': 105,
'probability': 0.45620707081511114,
'start': 100,
'text': 'Steam'},
{'end': 60,
'probability': 0.5683007420326334,
'start': 55,
'text': 'Steam'},
{'end': 21,
'probability': 0.6797917390407271,
'start': 5,
'text': 'Gearbox Software'}]}]
pprint(ie("近日,量子计算专家、ACM 计算奖得主 Scott Aaronson 通过博客发表,将于本周来到得克萨斯大学奥斯汀分校 (UT Austin) 一年,并加盟人工智能钻研公司 OpenAI。"))
[{'人名': [{'end': 23,
'probability': 0.664236391748247,
'start': 18,
'text': 'Scott'},
{'end': 32,
'probability': 0.479811241610971,
'start': 24,
'text': 'Aaronson'}],
'工夫': [{'end': 43,
'probability': 0.8424644728072508,
'start': 41,
'text': '本周'}],
'组织': [{'end': 87,
'probability': 0.5550909248934985,
'start': 81,
'text': 'OpenAI'}]}]
应用默认模型 uie-base 进行命名实体辨认,成果还不错,大多数的命名实体被辨认进去了,但仍然存在局部实体未被辨认出,局部文本被误辨认等问题。比方 “Scott Aaronson” 被辨认为了两个人名,比方 “ 得克萨斯大学奥斯汀分校 ” 没有被辨认进去。为晋升辨认成果,将通过标注大量数据对模型进行微调。
3. 模型微调
在终端中执行以下脚本,将 label studio 导出的数据文件格式转换成 doccano 导出的数据文件格式。
python labelstudio2doccano.py --labelstudio_file dataset/label-studio.json
参数阐明:
- labelstudio_file: label studio 的导出文件门路(仅反对 JSON 格局)。
- doccano_file: doccano 格局的数据文件保留门路,默认为 “doccano_ext.jsonl”。
- task_type: 工作类型,可选有抽取(”ext”)和分类(”cls”)两种类型的工作,默认为 “ext”。
!python doccano.py \
--doccano_file dataset/doccano_ext.jsonl \
--task_type "ext" \
--save_dir ./data \
--splits 0.8 0.2 0
参数阐明:
- doccano_file: doccano 格局的数据标注文件门路。
- task_type: 抉择工作类型,可选有抽取(”ext”)和分类(”cls”)两种类型的工作。
- save_dir: 训练数据的保留目录,默认存储在 data 目录下。
- negative_ratio: 最大负例比例,该参数只对抽取类型工作无效,适当结构负例可晋升模型成果。负例数量和理论的标签数量无关,最大负例数量 = negative_ratio * 正例数量。该参数只对训练集无效,默认为 5。为了保障评估指标的准确性,验证集和测试集默认结构全负例。
- splits: 划分数据集时训练集、验证集、测试集所占的比例。默认为 [0.8, 0.1, 0.1]。
- options: 指定分类工作的类别标签,该参数只对分类类型工作无效。默认为 [“ 正向 ”, “ 负向 ”]。
- prompt_prefix: 申明分类工作的 prompt 前缀信息,该参数只对分类类型工作无效。默认为 “ 情感偏向 ”。
- is_shuffle: 是否对数据集进行随机打散,默认为 True。
- seed: 随机种子,默认为 1000。
- separator: 实体类别 / 评估维度与分类标签的分隔符,该参数只对实体 / 评估维度级分类工作无效。默认为 “##”。
注:
- 每次执行 doccano.py 脚本,将会笼罩已有的同名数据文件。
3.1 Finetune
在终端中执行以下脚本进行模型微调。
# 而后在终端中执行以下脚本,对 doccano 格局的数据文件进行解决,执行后会在 /home/data 目录下生成训练 / 验证 / 测试集文件。!python finetune.py \
--train_path "./data/train.txt" \
--dev_path "./data/dev.txt" \
--save_dir "./checkpoint" \
--learning_rate 1e-5 \
--batch_size 32 \
--max_seq_len 512 \
--num_epochs 100 \
--model "uie-base" \
--seed 1000 \
--logging_steps 100 \
--valid_steps 100 \
--device "gpu"
[2023-03-31 16:14:53,465] [INFO] - global step 600, epoch: 67, loss: 0.00012, speed: 3.76 step/s
[2023-03-31 16:14:53,908] [INFO] - Evaluation precision: 0.93478, recall: 0.79630, F1: 0.86000
[2023-03-31 16:15:20,328] [INFO] - global step 700, epoch: 78, loss: 0.00010, speed: 3.79 step/s
[2023-03-31 16:15:20,777] [INFO] - Evaluation precision: 0.93750, recall: 0.83333, F1: 0.88235
[2023-03-31 16:15:46,992] [INFO] - global step 800, epoch: 89, loss: 0.00009, speed: 3.81 step/s
[2023-03-31 16:15:47,439] [INFO] - Evaluation precision: 0.91667, recall: 0.81481, F1: 0.86275
[2023-03-31 16:16:13,316] [INFO] - global step 900, epoch: 100, loss: 0.00008, speed: 3.86 step/s
[2023-03-31 16:16:13,758] [INFO] - Evaluation precision: 0.95833, recall: 0.85185, F1: 0.90196
后果展现:
参数阐明:
- train_path: 训练集文件门路。
- dev_path: 验证集文件门路。
- save_dir: 模型存储门路,默认为 “./checkpoint”。
- learning_rate: 学习率,默认为 1e-5。
- batch_size: 批处理大小,请联合机器状况进行调整,默认为 16。
- max_seq_len: 文本最大切分长度,输出超过最大长度时会对输出文本进行主动切分,默认为 512。
- num_epochs: 训练轮数,默认为 100。
- model: 抉择模型,程序会基于抉择的模型进行模型微调,可选有 “uie-base”, “uie-medium”, “uie-mini”, “uie-micro” 和 “uie-nano”,默认为 “uie-base”。
- seed: 随机种子,默认为 1000。
- logging_steps: 日志打印的距离 steps 数,默认为 10。
- valid_steps: evaluate 的距离 steps 数,默认为 100。
- device: 选用什么设施进行训练,可选 “cpu” 或 “gpu”。
- init_from_ckpt: 初始化模型参数的门路,可从断点处持续训练。
3.2 模型评估
在终端中执行以下脚本进行模型评估。
输入示例:
参数阐明:
- model_path: 进行评估的模型文件夹门路,门路下需蕴含模型权重文件 model_state.pdparams 及配置文件 model_config.json。
- test_path: 进行评估的测试集文件。
- batch_size: 批处理大小,请联合机器状况进行调整,默认为 16。
- max_seq_len: 文本最大切分长度,输出超过最大长度时会对输出文本进行主动切分,默认为 512。
- debug: 是否开启 debug 模式对每个正例类别别离进行评估,该模式仅用于模型调试,默认敞开。
debug
模式输入示例:
!python evaluate.py \
--model_path ./checkpoint/model_best \
--test_path ./data/dev.txt \
--batch_size 16 \
--max_seq_len 512
[2023-03-31 16:16:18,503] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load './checkpoint/model_best'.
W0331 16:16:18.530714 1666 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0331 16:16:18.533171 1666 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
[2023-03-31 16:16:24,551] [INFO] - -----------------------------
[2023-03-31 16:16:24,551] [INFO] - Class Name: all_classes
[2023-03-31 16:16:24,551] [INFO] - Evaluation Precision: 0.95918 | Recall: 0.87037 | F1: 0.91262
!python evaluate.py \
--model_path ./checkpoint/model_best \
--test_path ./data/dev.txt \
--debug
[2023-03-31 16:16:29,246] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load './checkpoint/model_best'.
W0331 16:16:29.278601 1707 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0331 16:16:29.281224 1707 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
[2023-03-31 16:16:34,944] [INFO] - -----------------------------
[2023-03-31 16:16:34,944] [INFO] - Class Name: 工夫
[2023-03-31 16:16:34,944] [INFO] - Evaluation Precision: 1.00000 | Recall: 0.90000 | F1: 0.94737
[2023-03-31 16:16:34,998] [INFO] - -----------------------------
[2023-03-31 16:16:34,998] [INFO] - Class Name: 地名
[2023-03-31 16:16:34,998] [INFO] - Evaluation Precision: 0.95833 | Recall: 0.85185 | F1: 0.90196
[2023-03-31 16:16:35,022] [INFO] - -----------------------------
[2023-03-31 16:16:35,022] [INFO] - Class Name: 产品
[2023-03-31 16:16:35,022] [INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
[2023-03-31 16:16:35,048] [INFO] - -----------------------------
[2023-03-31 16:16:35,048] [INFO] - Class Name: 组织
[2023-03-31 16:16:35,049] [INFO] - Evaluation Precision: 1.00000 | Recall: 0.50000 | F1: 0.66667
[2023-03-31 16:16:35,071] [INFO] - -----------------------------
[2023-03-31 16:16:35,071] [INFO] - Class Name: 人名
[2023-03-31 16:16:35,071] [INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
[2023-03-31 16:16:35,092] [INFO] - -----------------------------
[2023-03-31 16:16:35,092] [INFO] - Class Name: 天气
[2023-03-31 16:16:35,092] [INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
[2023-03-31 16:16:35,109] [INFO] - -----------------------------
[2023-03-31 16:16:35,109] [INFO] - Class Name: 价格
[2023-03-31 16:16:35,109] [INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
3.3 微调后成果
my_ie = Taskflow("information_extraction", schema=schema, task_path='./checkpoint/model_best') # task_path 指定模型权重文件的门路
pprint(my_ie("2K 与 Gearbox Software 发表,《小缇娜的奇幻之地》将于 6 月 24 日凌晨 1 点登录 Steam,此前 PC 平台为 Epic 限时独占。在限定期间内,Steam 玩家能够在 Steam 动手《小缇娜的奇幻之地》,并在 2022 年 7 月 8 日前享有取得黄金英雄铠甲包。"))
[2023-03-31 16:16:39,383] [INFO] - Converting to the inference model cost a little time.
[2023-03-31 16:16:46,661] [INFO] - The inference model save in the path:./checkpoint/model_best/static/inference
[2023-03-31 16:16:48,783] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load './checkpoint/model_best'.
[{'产品': [{'end': 118,
'probability': 0.9860396834664122,
'start': 108,
'text': '《小缇娜的奇幻之地》'},
{'end': 35,
'probability': 0.9870830377819004,
'start': 25,
'text': '《小缇娜的奇幻之地》'},
{'end': 148,
'probability': 0.9075236400717301,
'start': 141,
'text': '黄金英雄铠甲包'}],
'工夫': [{'end': 52,
'probability': 0.9998017644462607,
'start': 38,
'text': '6 月 24 日凌晨 1 点'},
{'end': 137,
'probability': 0.9875673117430104,
'start': 122,
'text': '2022 年 7 月 8 日前'}],
'组织': [{'end': 2,
'probability': 0.9888051241547942,
'start': 0,
'text': '2K'},
{'end': 93,
'probability': 0.9503029387182096,
'start': 88,
'text': 'Steam'},
{'end': 75,
'probability': 0.9819544449787045,
'start': 71,
'text': 'Epic'},
{'end': 105,
'probability': 0.7914398215948992,
'start': 100,
'text': 'Steam'},
{'end': 60,
'probability': 0.982935890915897,
'start': 55,
'text': 'Steam'},
{'end': 21,
'probability': 0.9994608274841141,
'start': 5,
'text': 'Gearbox Software'}]}]
pprint(my_ie("近日,量子计算专家、ACM 计算奖得主 Scott Aaronson 通过博客发表,将于本周来到得克萨斯大学奥斯汀分校 (UT Austin) 一年,并加盟人工智能钻研公司 OpenAI。"))
[{'人名': [{'end': 32,
'probability': 0.9990193078443497,
'start': 18,
'text': 'Scott Aaronson'}],
'工夫': [{'end': 2,
'probability': 0.9998481327061199,
'start': 0,
'text': '近日'},
{'end': 43,
'probability': 0.9995744486620453,
'start': 41,
'text': '本周'}],
'组织': [{'end': 66,
'probability': 0.9900117066000078,
'start': 57,
'text': 'UT Austin'},
{'end': 87,
'probability': 0.9993381402363184,
'start': 81,
'text': 'OpenAI'},
{'end': 56,
'probability': 0.9968616126324434,
'start': 45,
'text': '得克萨斯大学奥斯汀分校'},
{'end': 13,
'probability': 0.8434502340745098,
'start': 10,
'text': 'ACM'}]}]
基于 50 条标注数据进行模型微调后,成果有所晋升。
4. 智能标注:Machine Learning Backend 编写教学
在基于 UIE 的命名实体辨认的根底上,进一步通过集成 Label Studio 的 Machine Learning Backend 实现交互式预正文和模型训练等性能。
环境装置:pip install label_studio_ml
pip uninstall attr
残缺的 Machine Learning Backend 见 my_ml_backend.py
文件。更多无关自定义机器学习后端编写的内容可参考 Write your own ML backend。
简略来讲,my_ml_backend.py 内次要蕴含一个继承自 LabelStudioMLBase 的类,其内容能够分为以下三个次要局部:
- init 办法,蕴含模型的加载和根本配置的初始化
- predict 办法,用于为标注数据生成新的预测后果,其要害参数 tasks 就是 label studio 传递的原始数据
- fit 办法,用于模型的训练,当点击页面上的 Train 按钮时,会调用此办法(具体的地位在下文会提到),其要害参数 annotations 就是 label studio 传递的曾经标注了的数据
4.1 init 初始化办法
- 导入依赖库
import numpy as np
import os
import json
from paddlenlp import Taskflow
from label_studio_ml.model import LabelStudioMLBase
- 申明并初始化一个类
首先创立一个类申明,通过继承 LabelStudioMLBase
创立一个与 Label Studio 兼容的 ML 后端服务器。
class MyModel(LabelStudioMLBase):
而后,在 __init__
办法中定义和初始化须要的变量。LabelStudioMLBase
类提供了以下
- self.label_config: 原始标签配置。
- self.parsed_label_config: 为我的项目提供结构化的 Label Studio 标签配置。
- self.train_output: 蕴含之前模型训练运行的后果,与训练调用局部中定义的
fit()
办法的输入雷同。
如本教程的例子中,标签配置为:
<View>
<Labels name="label" toName="text">
<Label value="地名" background="#FFA39E"/>
<Label value="人名" background="#D4380D"/>
<Label value="组织" background="#FFC069"/>
<Label value="工夫" background="#AD8B00"/>
<Label value="产品" background="#D3F261"/>
<Label value="价格" background="#389E0D"/>
<Label value="天气" background="#5CDBD3"/>
</Labels>
<Text name="text" value="$text"/>
</View>
绝对应的 parsed_label_config
如下所示:
{
'label': {
'type': 'Labels',
'to_name': ['text'],
'inputs': [{
'type': 'Text',
'value': 'text'
}],
'labels': ['地名', '人名', '组织', '工夫', '产品', '价格', '天气'],
'labels_attrs': {
'地名': {
'value': '地名',
'background': '#FFA39E'
},
'人名': {
'value': '人名',
'background': '#D4380D'
},
'组织': {
'value': '组织',
'background': '#FFC069'
},
'工夫': {
'value': '工夫',
'background': '#AD8B00'
},
'产品': {
'value': '产品',
'background': '#D3F261'
},
'价格': {
'value': '价格',
'background': '#389E0D'
},
'天气': {
'value': '天气',
'background': '#5CDBD3'
}
}
}
}
依据须要从 self.parsed_label_config
变量中提取须要的信息,并通过 PaddleNLP 的 Taskflow 加载用于预标注的模型。
def __init__(self, **kwargs):
# don't forget to initialize base class...
super(MyModel, self).__init__(**kwargs)
# print("parsed_label_config:", self.parsed_label_config)
self.from_name, self.info = list(self.parsed_label_config.items())[0]
assert self.info['type'] == 'Labels'
assert self.info['inputs'][0]['type'] == 'Text'
self.to_name = self.info['to_name'][0]
self.value = self.info['inputs'][0]['value']
self.labels = list(self.info['labels'])
self.model = Taskflow("information_extraction", schema=self.labels, task_path= './checkpoint/model_best')
4.2 应用 ML Backend predict 预测办法(主动标注)
编写代码笼罩 predict(tasks, **kwargs)
办法。predict()
办法承受 [JSON 格局的 Label Studio 工作]返回预测。此外,还能够蕴含和自定义可用于被动学习循环的预测分数。
tasks
参数蕴含了无关要进行预正文的工作的详细信息。具体的 task 格局如下所示:
{
'id': 16,
'data': {'text': '新华社都柏林 6 月 28 日电(记者张琪)第二届“汉语桥”世界小学生中文秀爱尔兰赛区比赛结果日前揭晓,来自都柏林市的小学五年级学生埃拉·戈尔曼取得一等奖。'},
'meta': {},
'created_at': '2022-07-12T07:05:06.793411Z',
'updated_at': '2022-07-12T07:05:06.793424Z',
'is_labeled': False,
'overlap': 1,
'inner_id': 6,
'total_annotations': 0,
'cancelled_annotations': 0,
'total_predictions': 0,
'project': 2,
'updated_by': None,
'file_upload': 2,
'annotations': [],
'predictions': []}
通过 Taskflow 进行预测须要从 ['data']['text']
字段提取出原始文本,返回的 uie 预测后果格局如下所示:
{
'地名': [{
'text': '爱尔兰',
'start': 34,
'end': 37,
'probability': 0.9999107139090313
}, {
'text': '都柏林市',
'start': 50,
'end': 54,
'probability': 0.9997840536235998
}, {
'text': '都柏林',
'start': 3,
'end': 6,
'probability': 0.9999684097596173
}],
'人名': [{
'text': '埃拉·戈尔曼',
'start': 62,
'end': 68,
'probability': 0.9999879598978225
}, {
'text': '张琪',
'start': 15,
'end': 17,
'probability': 0.9999905824882092
}],
'组织': [{
'text': '新华社',
'start': 0,
'end': 3,
'probability': 0.999975681447097
}],
'工夫': [{
'text': '6 月 28 日',
'start': 6,
'end': 11,
'probability': 0.9997071721989244
}, {
'text': '日前',
'start': 43,
'end': 45,
'probability': 0.9999804497706464
}]
}
从 uie 预测后果中提取相应的字段,形成 Label Studio 承受的预正文格局。命名实体辨认工作的具体预正文示例可参考 [Import span pre-annotations for text]
更多其余类型工作的具体预正文示例可参考 [Specific examples for pre-annotations]
def predict(self, tasks, **kwargs):
from_name = self.from_name
to_name = self.to_name
model = self.model
predictions = []
for task in tasks:
# print("predict task:", task)
text = task['data'][self.value]
uie = model(text)[0]
# print("uie:", uie)
result = []
scores = []
for key in uie:
for item in uie[key]:
result.append({
'from_name': from_name,
'to_name': to_name,
'type': 'labels',
'value': {'start': item['start'],
'end': item['end'],
'score': item['probability'],
'text': item['text'],
'labels': [key]
}
})
scores.append(item['probability'])
result = sorted(result, key=lambda k: k["value"]["start"])
mean_score = np.mean(scores) if len(scores) > 0 else 0
predictions.append({
'result': result,
# optionally you can include prediction scores that you can use to sort the tasks and do active learning
'score': float(mean_score),
'model_version': 'uie-ner'
})
return predictions
4.3 应用 ML Backend fit 训练方法(依据标注好的数据再次优化训练模型)
基于新正文更新模型。
编写代码笼罩 fit()
办法。fit()
办法承受 [JSON 格局的 Label Studio 正文]并返回任意一个能够存储模型相干信息的 JSON 字典。
def fit(self, annotations, workdir=None, **kwargs):
""" This is where training happens: train your model given list of annotations,
then returns dict with created links and resources
"""# print("annotations:", annotations)
dataset = convert(annotations)
with open("./doccano_ext.jsonl", "w", encoding="utf-8") as outfile:
for item in dataset:
outline = json.dumps(item, ensure_ascii=False)
outfile.write(outline + "\n")
os.system('python doccano.py \
--doccano_file ./doccano_ext.jsonl \
--task_type "ext" \
--save_dir ./data \
--splits 0.8 0.2 0')
os.system('python finetune.py \
--train_path "./data/train.txt" \
--dev_path "./data/dev.txt" \
--save_dir "./checkpoint" \
--learning_rate 1e-5 \
--batch_size 4 \
--max_seq_len 512 \
--num_epochs 50 \
--model "uie-base" \
--init_from_ckpt "./checkpoint/model_best/model_state.pdparams" \
--seed 1000 \
--logging_steps 10 \
--valid_steps 100 \
--device "gpu"')
return {'path': workdir}
6. 总结
-
人工标注的毛病次要有以下几点:
- 产能低:人工标注须要大量的人力物力投入,且标注速度慢,产能低,无奈满足大规模标注的需要。
- 受限条件多:人工标注受到人力、物力、工夫等条件的限度,无奈适应所有的标注场景,尤其是一些简单的标注工作。
- 易受主观因素影响:人工标注受到人为因素的影响,如标注人员的业余素养、标注态度、主观判断等,易受到人为误差的烦扰,导致标注后果不精确。
- 难以满足个性化需要:人工标注无奈满足所有标注场景和个性化需要,无奈准确地标注出所有的要害信息,须要使用者自行抉择和判断。
-
相比之下,智能标注的劣势次要包含:
- 效率更高:智能标注能够自动化地进行标注,可能疾速地生成标注后果,缩小了人工标注所需的工夫和精力,进步了标注效率。
- 精度更高:智能标注采纳了先进的人工智能技术,可能对图像进行深度学习和解决,可能生成更加精确和精密的标注后果,特地是对于一些细节和特色的标注,手动标注往往存在误差较大的问题。
- 主动纠错:智能标注能够自动检测标注后果中的谬误,并进行主动修改,可能无效地防止标注谬误带来的影响,进步了标注的准确性。
- 灵活性更强:智能标注能够依据不同的利用场景和需要,生成不同类型的标注后果,可能满足用户的多样化需要,进步了标注的适用性。
总之,智能标注绝对于人工标注有着更高的效率、更高的精度、更强的灵活性和更好的适用性,能够更好地满足用户的需要。
6.1 码源
智能标注:基于 Labelstudio 的 UIE 半监督深度学习的智能标注计划码源
更多细节参考:人工智能常识图谱之信息抽取:基于 Labelstudio 的 UIE 半监督深度学习的智能标注计划(云端版),提效。