赞
踩
项目链接见文末
人工标注的缺点主要有以下几点:
相比之下,智能标注的优势主要包括:
总之,智能标注相对于人工标注有着更高的效率、更高的精度、更强的灵活性和更好的适用性,可以更好地满足用户的需求。
自然语言处理信息抽取智能标注方案包括以下几种:
基于规则的标注方案:通过编写一系列规则来识别文本中的实体、关系等信息,并将其标注。
基于机器学习的标注方案:通过训练模型来自动识别文本中的实体、关系等信息,并将其标注。
基于深度学习的标注方案:通过使用深度学习模型来自动识别文本中的实体、关系等信息,并将其标注。
基于半监督学习的标注方案:通过使用少量的手工标注数据和大量的未标注数据来训练模型,从而实现自动标注。
基于远程监督的标注方案:利用已知的知识库来自动标注文本中的实体、关系等信息,从而减少手工标注的工作量。
本次项目主要讲解的是基于半监督深度学习的标注方案。
- 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 日前享有获得黄金英雄铠甲包。"))
- [2023-03-27 16:11:00,527] [ INFO] - Downloading model_state.pdparams from https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base_v1.0/model_state.pdparams
- 100%|██████████| 450M/450M [00:45<00:00, 10.4MB/s]
- [2023-03-27 16:11:46,996] [ INFO] - Downloading model_config.json from https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/model_config.json
- 100%|██████████| 377/377 [00:00<00:00, 309kB/s]
- [2023-03-27 16:11:47,074] [ INFO] - Downloading vocab.txt from https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/vocab.txt
- 100%|██████████| 182k/182k [00:00<00:00, 1.27MB/s]
- [2023-03-27 16:11:47,292] [ INFO] - Downloading special_tokens_map.json from https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/special_tokens_map.json
- 100%|██████████| 112/112 [00:00<00:00, 99.6kB/s]
- [2023-03-27 16:11:47,364] [ INFO] - Downloading tokenizer_config.json from https://bj.bcebos.com/paddlenlp/taskflow/information_extraction/uie_base/tokenizer_config.json
- 100%|██████████| 172/172 [00:00<00:00, 192kB/s]
- W0327 16:11:47.478449 273 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 11.2, Runtime API Version: 11.2
- W0327 16:11:47.481654 273 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
- [2023-03-27 16:11:50,518] [ INFO] - Converting to the inference model cost a little time.
- [2023-03-27 16:11:57,379] [ INFO] - The inference model save in the path:/home/aistudio/.paddlenlp/taskflow/information_extraction/uie-base/static/inference
- [2023-03-27 16:11:59,489] [ INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load '/home/aistudio/.paddlenlp/taskflow/information_extraction/uie-base'.
-
-
- [{'产品': [{'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" 被识别为了两个人名,比如 "得克萨斯大学奥斯汀分校" 没有被识别出来。为提升识别效果,将通过标注少量数据对模型进行微调。
在将智能标注前,先讲解手动标注,通过手动标注后才会感知到智能标注的提效和交互性。
由于AI studio不支持在线标注,这里大家在本地端进行标注,标注完毕后上传数据集即可
以下标注示例用到的环境配置:
在终端(terminal)使用pip安装label-studio:
pip install label-studio==1.7.1
安装完成后,运行以下命令行:
label-studio start
在浏览器打开http://localhost:8080/,输入用户名和密码登录,开始使用label-studio进行标注。
填写项目名称、描述
添加标签(也可跳过后续在Setting/Labeling Interface中配置)
数据上传
先从本地上传txt格式文件,选择List of tasks,然后选择导入本项目。
实体抽取标注
在终端中执行以下脚本,将 label studio 导出的数据文件格式转换成 doccano 导出的数据文件格式。
python labelstudio2doccano.py --labelstudio_file dataset/label-studio.json
参数说明:
- !python doccano.py \
- --doccano_file dataset/doccano_ext.jsonl \
- --task_type "ext" \
- --save_dir ./data \
- --splits 0.8 0.2 0
- [2023-03-27 16:43:33,438] [ INFO] - Converting doccano data...
- 100%|████████████████████████████████████████| 40/40 [00:00<00:00, 29794.38it/s]
- [2023-03-27 16:43:33,440] [ INFO] - Adding negative samples for first stage prompt...
- 100%|███████████████████████████████████████| 40/40 [00:00<00:00, 118650.75it/s]
- [2023-03-27 16:43:33,441] [ INFO] - Converting doccano data...
- 100%|████████████████████████████████████████| 10/10 [00:00<00:00, 38095.40it/s]
- [2023-03-27 16:43:33,442] [ INFO] - Adding negative samples for first stage prompt...
- 100%|███████████████████████████████████████| 10/10 [00:00<00:00, 130257.89it/s]
- [2023-03-27 16:43:33,442] [ INFO] - Converting doccano data...
- 0it [00:00, ?it/s]
- [2023-03-27 16:43:33,442] [ INFO] - Adding negative samples for first stage prompt...
- 0it [00:00, ?it/s]
- [2023-03-27 16:43:33,444] [ INFO] - Save 274 examples to ./data/train.txt.
- [2023-03-27 16:43:33,445] [ INFO] - Save 70 examples to ./data/dev.txt.
- [2023-03-27 16:43:33,445] [ INFO] - Save 0 examples to ./data/test.txt.
- [2023-03-27 16:43:33,445] [ INFO] - Finished! It takes 0.01 seconds
参数说明:
注:
在终端中执行以下脚本进行模型微调。
- # 然后在终端中执行以下脚本,对 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-27 16:47:58,806] [ INFO] - Downloading resource files...
- [2023-03-27 16:47:58,810] [ INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'uie-base'.
- W0327 16:47:58.836591 13399 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 11.2, Runtime API Version: 11.2
- W0327 16:47:58.839186 13399 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
- [2023-03-27 16:48:30,349] [ INFO] - global step 100, epoch: 12, loss: 0.00060, speed: 3.46 step/s
- [2023-03-27 16:48:30,794] [ INFO] - Evaluation precision: 0.93878, recall: 0.85185, F1: 0.89320
- [2023-03-27 16:48:30,794] [ INFO] - best F1 performence has been updated: 0.00000 --> 0.89320
- [2023-03-27 16:48:58,054] [ INFO] - global step 200, epoch: 23, loss: 0.00032, speed: 3.82 step/s
- [2023-03-27 16:48:58,500] [ INFO] - Evaluation precision: 0.95918, recall: 0.87037, F1: 0.91262
- [2023-03-27 16:48:58,500] [ INFO] - best F1 performence has been updated: 0.89320 --> 0.91262
- [2023-03-27 16:49:25,664] [ INFO] - global step 300, epoch: 34, loss: 0.00022, speed: 3.83 step/s
- [2023-03-27 16:49:26,107] [ INFO] - Evaluation precision: 0.90385, recall: 0.87037, F1: 0.88679
- [2023-03-27 16:49:52,155] [ INFO] - global step 400, epoch: 45, loss: 0.00017, speed: 3.84 step/s
- [2023-03-27 16:49:52,601] [ INFO] - Evaluation precision: 0.93878, recall: 0.85185, F1: 0.89320
- [2023-03-27 16:50:18,632] [ INFO] - global step 500, epoch: 56, loss: 0.00014, speed: 3.84 step/s
- [2023-03-27 16:50:19,075] [ INFO] - Evaluation precision: 0.92157, recall: 0.87037, F1: 0.89524
- [2023-03-27 16:50:45,077] [ INFO] - global step 600, epoch: 67, loss: 0.00012, speed: 3.85 step/s
- [2023-03-27 16:50:45,523] [ INFO] - Evaluation precision: 0.93478, recall: 0.79630, F1: 0.86000
- [2023-03-27 16:51:11,546] [ INFO] - global step 700, epoch: 78, loss: 0.00010, speed: 3.84 step/s
- [2023-03-27 16:51:11,987] [ INFO] - Evaluation precision: 0.93750, recall: 0.83333, F1: 0.88235
- [2023-03-27 16:51:38,013] [ INFO] - global step 800, epoch: 89, loss: 0.00009, speed: 3.84 step/s
- [2023-03-27 16:51:38,457] [ INFO] - Evaluation precision: 0.93617, recall: 0.81481, F1: 0.87129
- [2023-03-27 16:52:04,361] [ INFO] - global step 900, epoch: 100, loss: 0.00008, speed: 3.86 step/s
- [2023-03-27 16:52:04,808] [ INFO] - Evaluation precision: 0.95745, recall: 0.83333, F1: 0.89109
结果展示:
参数说明:
在终端中执行以下脚本进行模型评估。
输出示例:
参数说明:
debug
模式输出示例:
- !python evaluate.py \
- --model_path ./checkpoint/model_best \
- --test_path ./data/dev.txt \
- --batch_size 16 \
- --max_seq_len 512
- [2023-03-27 16:56:21,832] [ INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load './checkpoint/model_best'.
- W0327 16:56:21.863559 15278 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 11.2, Runtime API Version: 11.2
- W0327 16:56:21.866312 15278 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
- [2023-03-27 16:56:27,409] [ INFO] - -----------------------------
- [2023-03-27 16:56:27,409] [ INFO] - Class Name: all_classes
- [2023-03-27 16:56:27,409] [ 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-27 16:56:31,824] [ INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load './checkpoint/model_best'.
- W0327 16:56:31.856709 15361 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 11.2, Runtime API Version: 11.2
- W0327 16:56:31.859668 15361 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
- [2023-03-27 16:56:37,039] [ INFO] - -----------------------------
- [2023-03-27 16:56:37,039] [ INFO] - Class Name: 时间
- [2023-03-27 16:56:37,039] [ INFO] - Evaluation Precision: 1.00000 | Recall: 0.90000 | F1: 0.94737
- [2023-03-27 16:56:37,092] [ INFO] - -----------------------------
- [2023-03-27 16:56:37,092] [ INFO] - Class Name: 地名
- [2023-03-27 16:56:37,092] [ INFO] - Evaluation Precision: 0.95833 | Recall: 0.85185 | F1: 0.90196
- [2023-03-27 16:56:37,113] [ INFO] - -----------------------------
- [2023-03-27 16:56:37,113] [ INFO] - Class Name: 产品
- [2023-03-27 16:56:37,113] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
- [2023-03-27 16:56:37,139] [ INFO] - -----------------------------
- [2023-03-27 16:56:37,139] [ INFO] - Class Name: 组织
- [2023-03-27 16:56:37,139] [ INFO] - Evaluation Precision: 1.00000 | Recall: 0.50000 | F1: 0.66667
- [2023-03-27 16:56:37,161] [ INFO] - -----------------------------
- [2023-03-27 16:56:37,161] [ INFO] - Class Name: 人名
- [2023-03-27 16:56:37,161] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
- [2023-03-27 16:56:37,181] [ INFO] - -----------------------------
- [2023-03-27 16:56:37,181] [ INFO] - Class Name: 天气
- [2023-03-27 16:56:37,181] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
- [2023-03-27 16:56:37,198] [ INFO] - -----------------------------
- [2023-03-27 16:56:37,198] [ INFO] - Class Name: 价格
- [2023-03-27 16:56:37,198] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000
- 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-27 16:59:31,064] [ INFO] - Converting to the inference model cost a little time.
- [2023-03-27 16:59:38,171] [ INFO] - The inference model save in the path:./checkpoint/model_best/static/inference
- [2023-03-27 16:59:40,364] [ INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load './checkpoint/model_best'.
-
-
- [{'产品': [{'end': 118,
- 'probability': 0.9860373472963602,
- 'start': 108,
- 'text': '《小缇娜的奇幻之地》'},
- {'end': 35,
- 'probability': 0.9870597349192849,
- 'start': 25,
- 'text': '《小缇娜的奇幻之地》'},
- {'end': 148,
- 'probability': 0.9075982731610566,
- 'start': 141,
- 'text': '黄金英雄铠甲包'}],
- '时间': [{'end': 52,
- 'probability': 0.9998029564426645,
- 'start': 38,
- 'text': '6 月 24 日凌晨 1 点'},
- {'end': 137,
- 'probability': 0.9876786236837809,
- 'start': 122,
- 'text': '2022 年 7 月 8 日前'}],
- '组织': [{'end': 2, 'probability': 0.988802896329716, 'start': 0, 'text': '2K'},
- {'end': 93,
- 'probability': 0.9500440898664806,
- 'start': 88,
- 'text': 'Steam'},
- {'end': 75,
- 'probability': 0.9819772965571794,
- 'start': 71,
- 'text': 'Epic'},
- {'end': 105,
- 'probability': 0.7921079762008958,
- 'start': 100,
- 'text': 'Steam'},
- {'end': 60,
- 'probability': 0.9829542747088276,
- 'start': 55,
- 'text': 'Steam'},
- {'end': 21,
- 'probability': 0.9994613042455924,
- 'start': 5,
- 'text': 'Gearbox Software'}]}]
pprint(my_ie("近日,量子计算专家、ACM计算奖得主Scott Aaronson通过博客宣布,将于本周离开得克萨斯大学奥斯汀分校(UT Austin)一年,并加盟人工智能研究公司OpenAI。"))
- [{'人名': [{'end': 32,
- 'probability': 0.9990170436659866,
- 'start': 18,
- 'text': 'Scott Aaronson'}],
- '时间': [{'end': 2,
- 'probability': 0.9998477751029782,
- 'start': 0,
- 'text': '近日'},
- {'end': 43,
- 'probability': 0.9995671774285029,
- 'start': 41,
- 'text': '本周'}],
- '组织': [{'end': 66,
- 'probability': 0.9900270615638647,
- 'start': 57,
- 'text': 'UT Austin'},
- {'end': 87,
- 'probability': 0.9993388552686611,
- 'start': 81,
- 'text': 'OpenAI'},
- {'end': 56,
- 'probability': 0.9968586409231648,
- 'start': 45,
- 'text': '得克萨斯大学奥斯汀分校'},
- {'end': 13,
- 'probability': 0.8437228020724348,
- 'start': 10,
- 'text': 'ACM'}]}]
基于 50 条标注数据进行模型微调后,效果有所提升。
部分效果展示更多详细内容查看链接:
人工智能知识图谱之信息抽取:基于Labelstudio的UIE半监督深度学习的智能标注方案(云端版),提效。
里面有详细代码实现
查看预标注好的数据,如有必要,对标注进行修改。
以下是 UIE Python 端的部署流程,包括环境准备、模型导出和使用示例。
模型导出
模型训练、压缩时已经自动进行了静态图的导出以及 tokenizer 配置文件保存,保存路径${finetuned_model} 下应该有 .pdimodel、.pdiparams 模型文件可用于推理。
模型部署
以下示例展示如何基于 FastDeploy 库完成 UIE 模型完成通用信息抽取任务的 Python 预测部署。先参考 UIE 模型部署安装FastDeploy Python 依赖包。 可通过命令行参数--device以及--backend指定运行在不同的硬件以及推理引擎后端,并使用--model_dir参数指定运行的模型。模型目录为 model_zoo/uie/checkpoint/model_best(用户可按实际情况设置)。
FastDeploy提供各平台预编译库,供开发者直接下载安装使用。当然FastDeploy编译也非常容易,开发者也可根据自身需求编译FastDeploy。
GPU端
为了在GPU上获得最佳的推理性能和稳定性,请先确保机器已正确安装NVIDIA相关驱动和基础软件,确保CUDA >= 11.2,cuDNN >= 8.1.1,并使用以下命令安装所需依赖
编写 predictor.py
文件:
导入依赖库:除了业务中用到的库之外,需要额外依赖serving。
后处理(可选):根据需要对模型返回的结果进行处理,以更好地展示。本教程中通过 format()
函数和 add_o()
函数修改命名实体识别结果的形式。
Predictor 类: 不需要继承其他的类,但是至少需要提供 __init__
和 predict
两个接口。
__init__
中定义实体抽取结构,通过 Taskflow
加载模型。predict
中进行预测,返回后处理的结果。- class Predictor:
- def __init__(self):
- self.schema = ['地名', '人名', '组织', '时间', '产品', '价格', '天气']
- self.ie = Taskflow("information_extraction", schema=self.schema, task_path='./checkpoint/model_best')
-
-
- def predict(self, json):
- text = json["input"]
- uie = self.ie(text)[0]
- result = format(text, uie)
- return result
- if __name__ == '__main__':
- serv.run(Predictor)
在项目根目录下已经提供了编写好的 predictor.py 可以直接在后续使用。
- # !paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8189
- # !pip install --upgrade paddlenlp
- # import json
-
- # import requests
-
- # url = "http://0.0.0.0:8189/taskflow/uie"
- # headers = {"Content-Type": "application/json"}
- # texts = ["近日,量子计算专家、ACM计算奖得主Scott Aaronson通过博客宣布,将于本周离开得克萨斯大学奥斯汀分校(UT Austin)一年,并加盟人工智能研究公司OpenAI"]
- # data = {
- # "data": {
- # "text": texts,
- # }
- # }
- # r = requests.post(url=url, headers=headers, data=json.dumps(data))
- # datas = json.loads(r.text)
- # print(datas)
此外目前使用的UIE码源是前几个版本的,最新官网更新了一些训练升级API,后续再重新优化现有项目。
本人对容器相关技术不太了解,所以在一些容器化技术操作上更多就是借鉴使用了,如有疑问评论区留言即可。
更多详情请参考Label Studio官网:
部分效果展示更多详细内容查看链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。