天池大赛中药说明书实体识别挑战冠军方案开源(二)部署运行实战 附详细操作说明

news2024/11/23 4:38:34

目录

  • Introduction 导言
  • 环境
    • 搭建环境
  • Github地址
  • 项目目录说明
  • 使用步骤
    • 下载预训练模型
    • 更改部分代码
    • 模型训练
      • 参数设置
        • BERT-CRF模型训练
        • BERT-SPAN模型训练
        • BERT-MRC模型训练
      • 运行训练
      • 预测复赛 test 文件 (上述模型训练完成后)
  • 参考资料
  • 其它资料下载


在这里插入图片描述

Introduction 导言

人工智能对中医药领域的传承和创新发展起到了重要的加速作用。其中,中医药文本信息的抽取是构建中医药知识图谱的核心组成部分,为上层应用如临床辅助诊疗系统(CDSS)的构建奠定了基础。

在本次NER挑战中,我们的目标是从中药药品说明书中提取关键信息,包括药品、药物成分、疾病、症状、证候等13类实体,并构建中医药药品的知识库。

通过应用自然语言处理和深度学习技术,我们可以对中药药品说明书进行语义分析和实体抽取。通过训练模型,我们可以识别和提取药品名称、药物成分、相关疾病、症状、证候等重要信息,并将其存储到中医药药品知识库中。

构建中医药药品知识库对于推动中医药的研究和临床实践具有重要意义。这个知识库可以为中医药研究人员和临床医生提供方便快捷的参考信息,帮助他们深入了解中药的特性、功效和应用范围。同时,该知识库也为中医药领域的智能化应用提供了数据基础,如CDSS系统的构建和其他医疗决策支持系统。

本次开源的项目是天池中药说明书实体识别挑战冠军方案Cinese-DeepNER-Pytorch,本博客主要是部署运行该算法的不同模型。

关于本项目的方案及模型原理说明详见另外一篇博客:
天池大赛中药说明书实体识别挑战冠军方案开源(一)方案及模型原理说明

环境

python3.7
pytorch==1.6.0 +
transformers==2.10.0
pytorch-crf==0.7.2

搭建环境

搭建环境,建议搭建pytorch-GPU版本,具体搭建过程,可参考我另外一篇博客:
NLP实战:Pytorch实现6大经典深度学习中文短文本分类-bert+ERNIE+bert_CNN+bert_RNN+bert_RCNN+bert_DPCNN

另外还需要在安装环境下,分别使用下面命令安装相关库:

pip install transformers==2.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pytorch-crf==0.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

Github地址

使用下面github地址,下载到本地。

天池中药说明书实体识别挑战冠军方案

项目目录说明

下载到本地后,可以看到以下目录:

DeepNER
│
├── data                                    # 数据文件夹
│   ├── mid_data                            # 存放一些中间数据
│   │   ├── crf_ent2id.json                 # crf 模型的 schema
│   │   └── span_ent2id.json                # span 模型的 schema
│   │   └── mrc_ent2id.json                 # mrc 模型的 schema
│
│   ├── raw_data                            # 转换后的数据
│   │   ├── dev.json                        # 转换后的验证集
│   │   ├── test.json                       # 转换后的初赛测试集
│   │   ├── pseudo.json                     # 转换后的半监督数据
│   │   ├── stack.json                      # 转换后的全体数据
│   └── └── train.json                      # 转换后的训练集
│
├── out                                     # 存放训练好的模型
│   ├── ...           
│   └── ...                                      
│
├── src
│   ├── preprocess                  
│   │   ├── convert_raw_data.py             # 处理转换原始数据
│   │   └── processor.py                    # 转换数据为 Bert 模型的输入
│   ├── utils                      
│   │   ├── attack_train_utils.py           # 对抗训练 FGM / PGD
│   │   ├── dataset_utils.py                # torch Dataset
│   │   ├── evaluator.py                    # 模型评估
│   │   ├── functions_utils.py              # 跨文件调用的一些 functions
│   │   ├── model_utils.py                  # Span & CRF & MRC model (pytorch)
│   │   ├── options.py                      # 命令行参数|   └── trainer.py                      # 训练器
|
├── competition_predict.py                  # 复赛数据推理并提交
├── README.md                               # ...
├── convert_test_data.py                    # 将复赛 test 转化成 json 格式
├── run.sh                                  # 运行脚本
└── main.py                                 # main 函数 (主要用于训练/评估)

使用步骤

下载预训练模型

首先下载

  • 哈工大预训练模型 :https://github.com/ymcui/Chinese-BERT-wwm

    百度云下载链接:

    链接:https://pan.baidu.com/s/1axdkovbzGaszl8bXIn4sPw
    提取码:jjba

    (注意:需人工将 vocab.txt 中两个 [unused] 转换成 [INV] 和 [BLANK])

    tips: 推荐使用 uer、roberta-wwm、robert-wwm-large

注:run.sh脚本中指定的 BERT_DIR 指BERT所在文件夹,需要把上面百度云下载的 BERT 文件夹放到该指定文件夹中

如:export BERT_DIR=“./bert/torch_$BERT_TYPE”

就表示直接放到DeepNER目录下的bert文件夹即可。注意github中的export BERT_DIR="../bert/torch_$BERT_TYPE"是默认放在DeepNER上层目录下。

博主最后放的目录如下图:

在这里插入图片描述

在这里插入图片描述

更改部分代码

  1. 如果你使用的系统为Linux系统,可以不做任何更改。

  2. 如果你使用的系统为Windows系统,需要对部分地址的分割方式进行更改。否则会出现相关报错,如下:
    在这里插入图片描述

具体Windows系统下需要修改的代码(核心就是把路径分割中的/ 改为\\)如下:

1)/src/utils/function_utils.py 中的get_model_path_list函数,具体修改如下:

def get_model_path_list(base_dir):
    """
    从文件夹中获取 model.pt 的路径
    """
    model_lists = []

    base_dir = os.path.abspath(base_dir)  #生成绝对路径
    # print(base_dir)

    for root, dirs, files in os.walk(base_dir):
        for _file in files:
            if 'model.pt' == _file:
                model_lists.append(os.path.join(root, _file))

    model_lists = sorted(model_lists,
                         key=lambda x: (x.split('\\')[-3], int(x.split('\\')[-2].split('-')[-1])))

    return model_lists

2)main.py 第69行,具体修改如下:

model_path = os.path.abspath(model_path)  #生成绝对路径
tmp_step = model_path.split('\\')[-2].split('-')[-1]

3)main.py 第106行,具体修改如下:

del_dir_list = [os.path.join(opt.output_dir, path.split('\\')[-2])
                        for path in model_path_list if path != max_f1_path]

模型训练

参数设置

BERT-CRF模型训练

task_type='crf'
mode='train' or 'stack'  train:单模训练与验证 ; stack:5折训练与验证

swa_start: swa 模型权重平均开始的 epoch
attack_train: 'pgd' / 'fgm' / '' 对抗训练 fgm 训练速度慢一倍, pgd 慢两倍,pgd 本次数据集效果明显

BERT-SPAN模型训练

task_type='span'
mode:同上
attack_train: 同上
loss_type: 'ce':交叉熵; 'ls_ce':label_smooth; 'focal': focal loss

BERT-MRC模型训练

task_type='mrc'
mode:同上
attack_train: 同上
loss_type: 同上

运行训练

1)Linux系统:直接打开终端,进入上面搭建好的环境,到DeepNER目录下,运行下面命令即可开始训练了。

按照上面参数设置说明

  • 如果你需要训练BERT-CRF,可以参考下面,修改run.sh文件
#!/usr/bin/env bash

export MID_DATA_DIR="./data/mid_data"
export RAW_DATA_DIR="./data/raw_data"
export OUTPUT_DIR="./out"

export GPU_IDS="0"
export BERT_TYPE="roberta_wwm"  # roberta_wwm / roberta_wwm_large / uer_large
export BERT_DIR="./bert/torch_$BERT_TYPE"

export MODE="train"
export TASK_TYPE="crf"

python main.py \
--gpu_ids=$GPU_IDS \
--output_dir=$OUTPUT_DIR \
--mid_data_dir=$MID_DATA_DIR \
--mode=$MODE \
--task_type=$TASK_TYPE \
--raw_data_dir=$RAW_DATA_DIR \
--bert_dir=$BERT_DIR \
--bert_type=$BERT_TYPE \
--train_epochs=10 \
--swa_start=5 \
--attack_train="" \
--train_batch_size=24 \
--dropout_prob=0.1 \
--max_seq_len=512 \
--lr=2e-5 \
--other_lr=2e-3 \
--seed=123 \
--weight_decay=0.01 \
--loss_type='ls_ce' \
--eval_model \
#--use_fp16
  • 如果你需要训练BERT-SPAN,可以参考下面,修改run.sh文件
#!/usr/bin/env bash

export MID_DATA_DIR="./data/mid_data"
export RAW_DATA_DIR="./data/raw_data"
export OUTPUT_DIR="./out"

export GPU_IDS="0"
export BERT_TYPE="roberta_wwm"  # roberta_wwm / roberta_wwm_large / uer_large
export BERT_DIR="./bert/torch_$BERT_TYPE"

export MODE="train"
export TASK_TYPE="span"

python main.py \
--gpu_ids=$GPU_IDS \
--output_dir=$OUTPUT_DIR \
--mid_data_dir=$MID_DATA_DIR \
--mode=$MODE \
--task_type=$TASK_TYPE \
--raw_data_dir=$RAW_DATA_DIR \
--bert_dir=$BERT_DIR \
--bert_type=$BERT_TYPE \
--train_epochs=10 \
--swa_start=5 \
--attack_train="" \
--train_batch_size=24 \
--dropout_prob=0.1 \
--max_seq_len=512 \
--lr=2e-5 \
--other_lr=2e-3 \
--seed=123 \
--weight_decay=0.01 \
--loss_type='ls_ce' \
--eval_model \
#--use_fp16
  • 如果你需要训练BERT-MRC,可以参考下面,修改run.sh文件
#!/usr/bin/env bash

export MID_DATA_DIR="./data/mid_data"
export RAW_DATA_DIR="./data/raw_data"
export OUTPUT_DIR="./out"

export GPU_IDS="0"
export BERT_TYPE="roberta_wwm"  # roberta_wwm / roberta_wwm_large / uer_large
export BERT_DIR="./bert/torch_$BERT_TYPE"

export MODE="train"
export TASK_TYPE="mrc"

python main.py \
--gpu_ids=$GPU_IDS \
--output_dir=$OUTPUT_DIR \
--mid_data_dir=$MID_DATA_DIR \
--mode=$MODE \
--task_type=$TASK_TYPE \
--raw_data_dir=$RAW_DATA_DIR \
--bert_dir=$BERT_DIR \
--bert_type=$BERT_TYPE \
--train_epochs=10 \
--swa_start=5 \
--attack_train="" \
--train_batch_size=24 \
--dropout_prob=0.1 \
--max_seq_len=512 \
--lr=2e-5 \
--other_lr=2e-3 \
--seed=123 \
--weight_decay=0.01 \
--loss_type='ls_ce' \
--eval_model \
#--use_fp16
bash run.sh

2)Windows系统:直接打开终端,进入上面搭建好的环境,到DeepNER目录下,运行下面命令即可开始训练了。

  • 训练BERT-CRF
python main.py --gpu_ids="0" --output_dir="./out" --mid_data_dir="./data/mid_data" --mode="train" --task_type="crf" --raw_data_dir="./data/raw_data" --bert_dir="./bert/torch_roberta_wwm" --bert_type="roberta_wwm" --train_epochs=10 --swa_start=5 --attack_train="" --train_batch_size=12 --dropout_prob=0.1 --max_seq_len=512 --lr=2e-5 --other_lr=2e-3 --seed=123 --weight_decay=0.01 --loss_type='ls_ce' --eval_model
  • 训练BERT-SPAN
python main.py --gpu_ids="0" --output_dir="./out" --mid_data_dir="./data/mid_data" --mode="train" --task_type="span" --raw_data_dir="./data/raw_data" --bert_dir="./bert/torch_roberta_wwm" --bert_type="roberta_wwm" --train_epochs=10 --swa_start=5 --attack_train="" --train_batch_size=12 --dropout_prob=0.1 --max_seq_len=512 --lr=2e-5 --other_lr=2e-3 --seed=123 --weight_decay=0.01 --loss_type='ls_ce' --eval_model
  • 训练BERT-MRC
python main.py --gpu_ids="0" --output_dir="./out" --mid_data_dir="./data/mid_data" --mode="train" --task_type="mrc" --raw_data_dir="./data/raw_data" --bert_dir="./bert/torch_roberta_wwm" --bert_type="roberta_wwm" --train_epochs=10 --swa_start=5 --attack_train="" --train_batch_size=12 --dropout_prob=0.1 --max_seq_len=512 --lr=2e-5 --other_lr=2e-3 --seed=123 --weight_decay=0.01 --loss_type='ls_ce' --eval_model

注:小伙伴们也可以分别调整如max_seq_len为512或者256,使用不同的lr(学习率)、不同的loss_type(‘ce’:交叉熵; ‘ls_ce’:label_smooth; ‘focal’: focal loss),不同的swa_start(swa模型权重平均开始的epoch),不同的attack_train( ‘pgd’ 或 ‘fgm’ 在对抗训练 fgm 训练速度慢一倍, pgd 慢两倍,pgd 本次数据集效果明显)。对比训练结果。

3)运行问题说明:

当遇到下面提示,说明你的GPU显存不够(博主显存是16G,显示不够),建议将train_batch_size由24调整为12 或者 6再尝试即可。

在这里插入图片描述

4)训练结果演示:

BERT-CRF模型:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从上面几张图,可以看出,整个训练大概运行了23分57秒;BERT-CRF模型训练到最后的准确率约为70.67%,召回率为76.41%,f1分数为0.7334。

BERT-SPAN模型:

训练结果如下图,可以看出,整个训练大概运行了49分07秒;BERT-SPAN模型训练到最后的准确率约为69.22%,召回率为74.89%,f1分数为0.7178。
在这里插入图片描述

预测复赛 test 文件 (上述模型训练完成后)

注:暂无数据运行,等待官方数据开源后可运行

# convert_test_data
python convert_test_data.py
# predict
python competition_predict.py

参考资料

天池中药说明书实体识别挑战冠军方案开源

其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rdkit|化学指纹(fingerprint)

github:地址 文章目录 Rdkit|化学指纹(fingerprint)化学指纹(fingerprint)RDKFingerprintMorgan指纹提供的指纹信息存储在字典中 MACCS指纹AtomPair指纹TopologicalTorsion指纹参考 Rdkit|化学指纹(fingerprint&#x…

使用楔形步进体模进行X射线骨密度测定

来源:投稿 作者:洪棋 编辑:学姐 骨密度(BMD)被广泛应用于骨折风险的预测和骨质疏松症的常规识别。双能x线骨密度仪(DXA)在临床上广泛用于测量脊柱、髋关节和前臂的骨密度(aBMD)。放射学骨密度测定法(Radiographic absorpometry, RA)是最早的骨…

最全Linux Shell详细教程

一、环境准备 我们在这里就在本地测试学习,因此我在这里先不建议大家这么着急去买服务器来学,这样比较费钱,等我们学好这些基础之后,再去上手服务器,那将是手到擒来。 本地学习工具:虚拟机 如果你没有该工…

ES6~ES13新特性(一)

1 ECMA新描述概念 2 let、const的使用 3 let、const和var区别 4 块级作用域的使用 5 模板字符串的详解 6 ES6函数的增强用法 一个执行上下文关联两个环境。词法环境和变量环境。 词法环境是由let和const创建;变量环境是由var创建的。 let-const的基本使用、不能…

网络安全现状,一个黑客真实的收入

前言 上次带大家了解了什么是黑客,黑客是干嘛的,今天就来看看黑客的收入和方向怎么样。 一个黑客年薪是多少呢? 外界普遍认为黑客是高收入群体,那么你想过黑客是怎么赚钱的吗?黑客分为白帽黑客和黑帽黑客&#xff0…

R语言实现SMOTE与SMOGN算法解决不平衡数据的回归问题

本文介绍基于R语言中的UBL包,读取.csv格式的Excel表格文件,实现SMOTE算法与SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法。 在之前的文章Python实现SMOGN算法解决不平衡数据的回归问题&#x…

源码安装 gcc遇到的问题

1、需要的工具和库的安装1 见https://gcc.gnu.org/install/preprequisites.hml 2、源码下载和依赖的工具的源码的下载 在https://gcc.gnu.org/mirrors.html中选择一个镜像源的链接打开,下边以日本的源(http://ftp.tsukuba.wide.ad.jp/software/gcc/)为例。 2.1 …

MySQL数据库的备份与还原、视图基础操作

一、备份与还原 1、使用mysqldump命令备份数据库中的所有表 mysqldump -uroot -p#$%#*#^* booksDB authorbook authors books > /backup/db/booksDB.spl 2、备份booksDB数据库中的books表 mysqldump -uroot -p*&*&……%¥#¥% booksDB books …

FreeRTOS(任务调度)

任务调度 什么是任务调度? 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。 FreeRTOS中开启任务调度的函数是 vTaskStartScheduler() ,但在 CubeMX 中被封装为 osKernelStart() 。 FreeRTOS的任务调度规则是怎样的? FreeRTOS…

QT禁用窗口【关闭】按钮的实现方法

QT禁用窗口关闭按钮的实现方法,直接在窗体类构造函数的内部写入setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint)即可实现,案例如下: #include "form.h" #include "…

apache 安装配置 基础篇(三) 之 虚拟机、主服务等、默认虚拟主机、serverpath、DocumentRoot Directory

apache虚拟主机类型有两种 1、基于名称的虚拟主机 2、基于地址或IP地址的虚拟主机 基于名称的虚拟主机 但是如果不用域名(host)就没有办法区分了,而执行第一个匹配的网站了(第一个虚拟主机所处理) ## httpd-vhosts.conf 添加如下代码&…

选择合适的软件,提升工作计划效率

在快节奏的工作环境中,日程安排变得尤为重要。有许多不同的软件可用于帮助管理日程,但哪个软件最适合您的需求?在本文中,我们将介绍几种适合工作安排的软件。 1.Google Calendar Google日历是一种功能强大、易于使用且免费的日历应…

Orange pi3初调试

因为树莓派沦为理财产品1年前出手殆尽后,现在唯一一个B性能不足一直没动力调试,沦为吃灰工具。 偶然之间多多给推了个orange产品预售,看了下pi3的参数,这不和赚了差价的3B一个性能吗?果断定了个预售款,在差…

机器学习洞察 | 挖掘多模态数据机器学习的价值

在过去的数年里,我们见证了机器学习和计算机科学领域的很多变化。人工智能应用也愈趋广泛,正在加速融入人们的日常生活之中。机器学习作为技术核心,也在持续地发展进化,在更多领域发挥出越来越重要的作用。**机器学习会有哪些新的…

python 将 csv转excel (.xls和.xlsx)的几种方式

前言 excel 后缀有2种格式, .xls 是从 Excel 97 到 Excel 2003 的默认文件格式,而 .xlsx 是 Excel 2007 及更高版本的默认文件格式。 .xlsx和.xls格式的主要区别在于,.xls格式单个工作表最多支持65536行,256列。 .xlsx格式最多…

torch分布式训练笔记

torch分布式训练笔记 1. 数据并行(DistributedDataParallel)2. 模型并行(单机多卡)3. 混合并行(数据并行 模型并行/PipeLine并行) 1. 数据并行(DistributedDataParallel) 官方文档…

github搜索案例

目录结构 public/index.html <!DOCTYPE html> <html lang""><head><meta charset"utf-8"><!-- 针对IE浏览器的一个特殊配置&#xff0c;含义是让IE浏览器以最高的渲染级别渲染页面 --><meta http-equiv"X-UA-Comp…

海量文件高速传输解决方案(基于Rsync)

​​随着互联网的飞速发展和社会的数字化转型&#xff0c;企业信息化建设推动了数据的快速增长&#xff0c;越来越多的信息服务依赖海量数据的采集与应用。传统的FTP、网盘等工具无法满足海量数据的传输与分发&#xff0c;导致企业无法高效完成海量数据传输 。 传统的ftp传输效…

【使用驱动代码实现如下要求 应用程序通过阻塞的io模型来读取number变量的值】

驱动应用层代码 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h> #include "head.h"…

记一次JVM调优过程

文档修订记录 版本 日期 撰写人 审核人 批准人 变更摘要 & 修订位置 JVM相关理论 JVM内存 可分配内存&#xff1a; JVM可以调度使用的总的内存数&#xff0c;这个数量受操作系统进程寻址范围、系统虚…