用BERT进行中文短文本分类

使用Bert预训练模型进行中文文本分类(基于pytorch) 基于BERT预训练模型的中文文本分类任务的实现 阅读详情

最近参加了一个关于医疗短文本分类的比赛。刚开始用了SVM、xgBoost效果都不是很好,群里有人说BERT的效果不错,于是自己赶鸭子上架,根据网上的文章,手动实践,赶在比赛结束前一天提交了结果,效果确实比传统机器学习模型要强得多,特记录一下详细步骤与程序。

1. 环境配置

本实验使用操作系统:Ubuntu 18.04.3 LTS 4.15.0-29-generic GNU/Linux操作系统。

​​​​​​1.1 查看CUDA版本

cat /usr/local/cuda/version.txt 

输出:

CUDA Version 10.0.130*

1.2 查看 cudnn版本

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

输出:

#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 3
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

如果没有安装 cuda 和 cudnn,到官网根自己的 GPU 型号版本安装即可

1.3 安装tensorflow-gpu

通过Anaconda创建虚拟环境来安装tensorflow-gpu(Anaconda安装步骤就不说了)

创建虚拟环境

虚拟环境名为:tensorflow

conda create -n tensorflow python=3.7.1
进入虚拟环境

下次使用也可以通过此命令进入虚拟环境

source activate tensorflow
安装tensorflow-gpu

不推荐直接pip install tensorflow-gpu 因为速度比较慢。可以从豆瓣的镜像中下载,速度还是很快的。https://pypi.doubanio.com/simple/tensorflow-gpu/
找到自己适用的版本(cp37表示python版本为3.7)
然后通过pip install 安装

pip install https://pypi.doubanio.com/packages/15/21/17f941058556b67ce6d1e3f0e0932c9c2deaf457e3d45eecd93f2c20827d/tensorflow_gpu-1.14.0rc1-cp37-cp37m-manylinux1_x86_64.whl

我选择了1.14.0的tensorflow-gpu linux版本,python版本为3.7。使用BERT的话,tensorflow-gpu版本必须大于1.11.0。同时,不建议选择2.0版本,2.0版本好像修改了一些方法,还需要自己手动修改代码

环境测试

在tensorflow虚拟环境中,python命令进入Python环境中,输入import tensorflow,看是否能成功导入
​

2. 准备工作

2.1 BERT源码下载

git clone https://github.com/google-research/bert.git

windows系统下直接进入
https://github.com/google-research/bert,选择Clone or download

2.2 预训练模型下载

  • Bert-base Chinese
  • BERT-wwm :由哈工大和讯飞联合实验室发布的,效果比Bert-base Chinese要好一些(链接地址为讯飞云,密码:mva8。无奈当时用wwm训练完提交结果时,提交通道已经关闭了,呜呜)
bert_model.ckpt:负责模型变量载入
vocab.txt:训练时中文文本采用的字典
bert_config.json:BERT在训练时,可选调整的一些参数

2.3 数据准备

1)将自己的数据集格式改成如下格式:第一列是标签,第二列是文本数据,中间用tab隔开(若测试集没有标签,只保留一列样本数据)。 分别将训练集、验证集、测试集文件名改为train.tsv、val.tsv、test.tsv。文件格式为UTF-8(无BOM)
在这里插入图片描述
2)新建data文件夹,存放这三个文件。
3)预训练模型解压,存放到新建文件夹chinese中

2.4 代码修改

我们需要对bert源码中run_classifier.py进行两处修改

1)在run_classifier.py中添加我们的任务类

可以参照其他Processor类,添加自己的任务类

# 自定义Processor类
class MyProcessor(DataProcessor):

    def __init__(self):
        self.labels = ['Addictive Behavior',
                       'Address',
                       'Age',
                       'Alcohol Consumer',
                       'Allergy Intolerance',
                       'Bedtime',
                       'Blood Donation',
                       'Capacity',
                       'Compliance with Protocol',
                       'Consent',
                       'Data Accessible',
                       'Device',
                       'Diagnostic',
                       'Diet',
                       'Disabilities',
                       'Disease',
                       'Education',
                       'Encounter',
                       'Enrollment in other studies',
                       'Ethical Audit',
                       'Ethnicity',
                       'Exercise',
                       'Gender',
                       'Healthy',
                       'Laboratory Examinations',
                       'Life Expectancy',
                       'Literacy',
                       'Multiple',
                       'Neoplasm Status',
                       'Non-Neoplasm Disease Stage',
                       'Nursing',
                       'Oral related',
                       'Organ or Tissue Status',
                       'Pharmaceutical Substance or Drug',
                       'Pregnancy-related Activity',
                       'Receptor Status',
                       'Researcher Decision',
                       'Risk Assessment',
                       'Sexual related',
                       'Sign',
                       'Smoking Status',
                       'Special Patient Characteristic',
                       'Symptom',
                       'Therapy or Surgery']
	
    def get_train_examples(self, data_dir):
        return self._create_examples(
            self._read_tsv(os.path.join(data_dir, "train.tsv")), "train")

    def get_dev_examples(self, data_dir):
        return self._create_examples(
            self._read_tsv(os.path.join(data_dir, "val.tsv")), "val")

    def get_test_examples(self, data_dir):
        return self._create_examples(
            self._read_tsv(os.path.join(data_dir, "test.tsv")), "test")

    def get_labels(self):
        return self.labels

    def _create_examples(self, lines, set_type):
        examples = []
        for (i, line) in enumerate(lines):
            guid = "%s-%s" % (set_type, i)
            if set_type == "test":
            """
            因为我的测试集中没有标签,所以对test进行单独处理,
            test的label值设为任意一标签(一定是存在的类标签,
            不然predict时会keyError),如果测试集中有标签,就
            不需要if了,统一处理即可。
            """
                text_a = tokenization.convert_to_unicode(line[0])
                label = "Address"
            else:
                text_a = tokenization.convert_to_unicode(line[1])
                label = tokenization.convert_to_unicode(line[0])
            examples.append(
                InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
        return examples

2)修改processor字典

def main(_):
    tf.logging.set_verbosity(tf.logging.INFO)

    processors = {
        "cola": ColaProcessor,
        "mnli": MnliProcessor,
        "mrpc": MrpcProcessor,
        "xnli": XnliProcessor,
        "mytask": MyProcessor, # 将自己的Processor添加到字典
    }

3 开工

3.1 配置训练脚本

创建并运行run.sh文件

python run_classifier.py \
  --data_dir=data \
  --task_name=mytask \
  --do_train=true \
  --do_eval=true \
  --vocab_file=chinese/vocab.txt \
  --bert_config_file=chinese/bert_config.json \
  --init_checkpoint=chinese/bert_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=8 \
  --learning_rate=2e-5 \
  --num_train_epochs=3.0
  --output_dir=out \

fine-tune需要一定的时间,我的训练集有两万条,验证集有八千条,GPU为2080Ti,需要20分钟左右。如果显存不够大,记得适当调整max_seq_length 和 train_batch_size

3.2 预测

创建并运行test.sh(注:init_checkpoint为自己之前输出模型地址)

python run_classifier.py \
  --task_name=mytask \
  --do_predict=true \
  --data_dir=data \
  --vocab_file=chinese/vocab.txt \
  --bert_config_file=chinese/bert_config.json \
  --init_checkpoint=out \
  --max_seq_length=128 \
  --output_dir=out

预测完会在out目录下生成test_results.tsv。生成文件中,每一行对应你训练集中的每一个样本,每一列对应的是每一类的概率(对应之前自定义的label列表)。如第5行第8列表示第5个样本是第8类的概率。

在这里插入图片描述

3.3 预测结果处理

因为预测结果是概率,我们需要对其处理,选取每一行中的最大值最为预测值,并转换成对应的真实标签。

data_dir = "C:\\test_results.tsv"
lable = ['Addictive Behavior',
         'Address',
         'Age',
         'Alcohol Consumer',
         'Allergy Intolerance',
         'Bedtime',
         'Blood Donation',
         'Capacity',
         'Compliance with Protocol',
         'Consent',
         'Data Accessible',
         'Device',
         'Diagnostic',
         'Diet',
         'Disabilities',
         'Disease',
         'Education',
         'Encounter',
         'Enrollment in other studies',
         'Ethical Audit',
         'Ethnicity',
         'Exercise',
         'Gender',
         'Healthy',
         'Laboratory Examinations',
         'Life Expectancy',
         'Literacy',
         'Multiple',
         'Neoplasm Status',
         'Non-Neoplasm Disease Stage',
         'Nursing',
         'Oral related',
         'Organ or Tissue Status',
         'Pharmaceutical Substance or Drug',
         'Pregnancy-related Activity',
         'Receptor Status',
         'Researcher Decision',
         'Risk Assessment',
         'Sexual related',
         'Sign',
         'Smoking Status',
         'Special Patient Characteristic',
         'Symptom',
         'Therapy or Surgery']
# 用pandas读取test_result.tsv,将标签设置为列名
data_df = pd.read_table(data_dir, sep="\t", names=lable, encoding="utf-8")
label_test = []
for i in range(data_df.shape[0]):
	# 获取一行中最大值对应的列名,追加到列表
    label_test.append(data_df.loc[i, :].idxmax())

4. 参考文章:

TensorFlow + GPU配置

BERT模型fine-tuning代码解析(一)

中文最佳,哈工大讯飞联合发布全词覆盖中文BERT预训练模型

利用bert进行文本分类 1、任务及数据集描述 实现利用bert预训练模型进行中文新闻分类,使用的数据集情况: 其中,train.txt, dev.txt, test.txt内容格式为每一行为“内容 Tab 标签”: class.txt内容为10类的新闻标签,如上面的0就代表finance这一类。 2、bert模型准备 (1)下载bert中文预训练模型chinese_L-12_H-768_A-12,解压后里面包含5个... 阅读详情

相关推荐

使用BERT进行文本分类

在本文中,我们将探讨如何使用BERT进行文本分类,并提供相应的源代码。通过加载预训练的BERT模型,对文本进行编码和特征提取,并使用训练数据训练模型,我们可以实现高效准确的文本分类。BERT模型接受的输入是经过特定编码的token序列,其中包括输入文本的token索引和相应的attention mask。在这一步,我们将加载预训练的BERT模型并进行必要的配置。在这一步,我们将使用加载的BERT模型对数据进行训练。在这一步,我们将使用训练好的模型对新的文本进行分类预测。步骤4:加载预训练的BERT模型。

PzBlockchain的博客 721

使用Bert/ERNIE进行中文短文本分类(附数据集)

向AI转型的程序员都关注了这个号????????????机器学习AI算法工程 公众号:datayx中文文本分类,Bert,ERNIE,基于pytorch,开箱即用。中文数据集我从TH...

datayx的文章 7789

中文新闻短文本分类四模型实战包:CNN+RNN(带Attention)+GCN+BERT端到端训练代码

直接跑通中文文本分类任务的完整Python工程,内置CNN、RNN(含Attention机制)、GCN图神经网络和BERT四种主流模型。从原始文本读取开始,自动完成分词、构建词共现图(build_graph.py)、生成词向量与图结构编码(transform.py)、模型搭建(model.py/gcn.py)、训练验证(train.py/train_eval.py)到一键启动(run.py + train.sh)。配套标准数据格式:train.txt/dev.txt/test.txt划分、class.txt

chair的专栏 187

使用bert进行中文文本分类

使用bert进行中文文本分类

julac的博客 4103

BERT/ERNIE中文短文本分类实战:从数据到部署全链路

BERT和ERNIE是当前主流的预训练语言模型,其核心原理在于Transformer架构下的上下文表征学习;在中文短文本分类任务中,模型性能不仅取决于参数规模,更依赖于对字词切分、实体感知、知识增强等中文特性的深度适配;技术价值体现在显著提升微博评论、电商评价、客服工单等真实场景的细粒度情感判别准确率与鲁棒性;典型应用场景包括实时舆情监控、智能客服意图识别与用户反馈自动归因;本文聚焦PyTorch原生实现,覆盖数据清洗、ERNIE知识注入、动态序列截断、分层优化器配置及TensorRT推理压缩等关键工程环节

weixin_30388677的博客 425

中文短文本分类实战:BERT与ERNIE选型、微调与部署全指南

中文短文本分类是自然语言处理中基础且高频的工程任务,其核心挑战在于语义稀疏性、领域适配性与模型泛化能力。BERT与ERNIE虽同属预训练语言模型,但因预训练目标差异——MLM+NSP vs 知识掩码+对话响应预测——在短文本场景下表现迥异。理解二者在token注意力分布、OOV处理、任务结构对齐等维度的本质区别,是提升F1-score与线上稳定性的前提。结合Hugging Face Transformers框架进行Tokenizer动态扩展、Layer-wise学习率衰减、梯度范数监控及ONNX量化部署,可

weixin_34115824的博客 360

基于Bert语言模型的中文短文本分类

运行Bert开源框架 报错:`tensorflow.python.framework.errors_impl.DataLossError: Checksum does not match: stored 4283821441 vs. calculated on the restored bytes 2653108158` 报错:`tensorflow.python.framework.errors_impl.OutOfRangeError: Read fewer bytes than requested`

敷衍zgf的博客 1143

基于BERT/ERNIE的中文短文本分类实战项目(含完整数据集与可运行代码)

任务形式化是工程化建模的起点,也是后续所有技术选型的锚点。脱离实际约束的“理想化建模”在工业场景中必然导致资源错配与效果衰减。中文短文本分类并非抽象数学问题,而是受制于硬件资源、业务SLA、标注成本与下游系统接口协议的复合约束体。因此,必须将任务空间严格界定为可测量、可验证、可迭代的有限集合。当单一分类任务无法满足业务需求时(如同时预测新闻标题的“主题类别”与“情感极性”),需对基础模型进行架构扩展。Hugging Face 的提供了标准继承接口,但直接修改BertModel。

weixin_42433737的博客 333

毕业设计:基于深度学习的多标签中文短文本分类

毕业设计:基于深度学习的多标签中文短文本分类中文短文本分类可以帮助社交媒体平台和新闻机构快速准确地进行内容过滤和分类,提高用户体验和信息推荐的效果。其次,企业可以利用中文短文本分类技术对用户评论、产品评价等进行情感分析和舆情监测,从而及时了解用户需求和市场动态。对于计算机专业、软件工程专业、人工智能专业、大数据专业的毕业生而言,提供了一个具有挑战性和创新性的研究课题。无论您对深度学习技术保持浓厚兴趣,还是希望探索机器学习、算法或人工智能的领域的同学,能为您提供灵感和指导

毕设帮助,疑难解答,欢迎打扰! 1874

cs188Inference in Bayes Nets(贝叶斯网络的推理)

cs188Inference in Bayes Nets贝叶斯网络的推理Question1(3 points):Bayes Net StructureQuestion2(1 points):Bayes Net ProbabilitiesQuestion 3(5 points):Join FactorsQuestion4(4 points):EliminateQuestion5(4 points):NormalizeQuestion 6(4 points):Variable EliminationQuesti

weixin_46582817的博客 1674

龙虾 Skill 技能库|OpenClaw+Hermes 全集成 一键调用所有 AI 技能

龙虾 Skill 技能库、OpenClaw、Hermes Agent、AI 技能集成、本地 AI 自动化、办公工具、数字员工

weixin_42219287的博客 624

StructBERT零样本分类-中文-base效果对比:vs BERT-wwm、RoFormer-Zero性能实测

本文介绍了如何在星图GPU平台自动化部署StructBERT零样本分类-中文-base镜像,实现高效中文文本分类。该镜像支持零样本学习,无需训练即可对新闻分类、情感分析等场景的文本进行快速智能归类,提升自然语言处理效率。

weixin_29009401的博客 106

ROS Noetic下Gazebo仿真:从零搭建两轮差速机器人(含ros_control配置避坑指南)

本文详细介绍了在ROS Noetic环境下,使用Gazebo从零搭建两轮差速机器人并进行仿真的完整流程。核心内容包括利用Xacro进行模块化建模,并重点解析了通过ros_control框架配置机器人运动控制的详细步骤与常见避坑指南,帮助开发者成功实现机器人在仿真环境中的差速驱动与运动控制。

game4的博客 620

StructBERT零样本分类:中文客服工单智能路由解决方案

本文介绍了如何在星图GPU平台上自动化部署StructBERT零样本分类-中文-base镜像,实现中文客服工单的智能路由。无需训练数据,仅需输入业务标签(如‘支付失败’‘物流停滞’),即可实时完成语义理解与精准分类,显著提升工单分派效率与准确率。

weixin_33205138的博客 254

F5高可用HA配置详情

F5 HA详细配置

weixin_45843944的博客 3025

【机器学习】推理时计算优化——思维链(Chain-of-Thought)与慢思考范式 第一章:基础理论与认知框架 第二章:计算优化技术与前沿方法

过程监督在数学推理中展现出显著优势,因其能够定位错误发生的具体步骤,而非仅在最终答案处提供稀疏反馈。然而,高质量过程标注的获取成本高昂,这催生了基于自动验证器的近似方法。

VectorShift的博客 72

毕业设计:基于深度学习的中文短文本分类算法系统

毕业设计:基于深度学习的中文短文本分类算法系统利用最新的神经网络技术和自然语言处理方法,实现了高效的中文短文本分类。通过深入研究文本预处理、特征提取、分类器设计等关键技术,我们的系统能够在复杂的中文文本数据中快速准确地分类。对于计算机专业、软件工程专业、人工智能专业、大数据专业的毕业生而言,提供了一个具有挑战性和创新性的研究课题。无论您对深度学习技术保持浓厚兴趣,还是希望探索机器学习、算法或人工智能的领域的同学,能为您提供灵感和指导。

毕设帮助,疑难解答,欢迎打扰! 2006

基于Django+Vue3的目标检测系统设计与实现,Web前后端分离,Vue3前台系统+Django后台管理系统开发,YOLOv11 Web目标检测,实现图片、视频和摄像头检测等功能,全网独发

基于Django+Vue3的智能目标检测系统设计与实现,Web前后端分离,YOLOv11 Web目标检测,Vue3前台系统+Django后台管理系统开发,实现图片检测、视频检测、摄像头检测、登录、注册和个人中心功能

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3668

完全小白如何运行人生中的第一个Bert文本分类代码

本文介绍Bert文本分类入门

诸神缄默不语的博客 1981

阅文集团大数据面试题及参考答案

在 Flink 中,watermark 是一种用于处理乱序事件时间的机制。实现接口:通常需要实现 AssignerWithPeriodicWatermarks 或 AssignerWithPunctuatedWatermarks 接口。前者会周期性地生成 watermark,后者则是基于某些特定事件来生成 watermark ,比如接收到某个特定值的消息时。定义位置:可以在数据源处或者在流处理的中间操作中定义 watermark。在数据源定义时,能更精准地根据数据的产生特性设置 watermark;

大模型大数据攻城狮的专栏 1088

2026实测可用!4个专业AI Agent Skills垂直搜索平台对比

📊本文以表格形式整理4个实测可用的专业AI Agent Skills垂直搜索平台,涵盖资源规模、适配生态等关键维度🤖,适合开发者按需选择技能获取渠道,解决平台筛选与访问难题✨

XiaoqiangClub的博客 525

基于BERT的中文短文本分类实战与优化策略

预训练语言模型如BERT已成为NLP领域处理文本分类任务的核心技术。其双向Transformer架构能有效捕捉上下文语义,特别适合中文这类语义丰富的语言。通过微调预训练模型,可以在特定领域实现高效的文本分类。本文以中文短文本八分类任务为例,详细解析了从数据预处理、模型选择到训练优化的全流程关键技术。重点探讨了对抗训练、分层学习率等提升模型性能的实用技巧,并分享了模型量化、ONNX导出等工程部署方案。对于面临文本分类需求的企业和开发者,这些基于BERT的优化策略能显著提升模型准确率和推理效率。

快马扬鞭须努力! 394

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

中文短文本分类选型实战:BERT 真的更强吗

本文以电商评论分析项目为基础,对比 FastText、TF-IDF+LR、TF-IDF+RF 和 BERT 在投诉分流任务上的效果、延迟和体积差异,讨论实际项目中的模型选型策略。

m0_68262196的博客 329

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【免费下载】 中文BERT预训练模型下载

中文BERT预训练模型下载 【下载地址】中文BERT预训练模型下载 中文BERT预训练模型下载 项目地址: https://gitcode.com/open-source-toolkit/6dcc7 ...

gitblog_09768的博客 2616

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

中文短文本分类实例一-TextClassification概述综述(一般步骤流程、概论和归类、调参和tricks)

一、概述 中文短文本分类任务(text classification of short or long sentence)是自然语言处理NLP中的一个特别重要的任务,简单来看,生活中常见的新闻分类、情感分类、邮件分类、领域意图分类<接触的最多>、舆情分析、论文分类等,都离不开文本分类;往复杂里说,文本分类任务是词性标注与分词、相似度计算与排序、实体提取与关系抽取、位置...

大漠帝国的博客 7013

文献阅读笔记 Chinese Short Text Classification with Mutual-Attention Convolutional Neural Networks

文中短文本分类文献阅读笔记

weixin_44695049的博客 389
上一篇: linux_fedora25下 chromium与 firefox flash 配置
下一篇: Office2016自定义组件安装过程
机巧堂堂主居十方
博客等级 码龄11年 2粉丝 4原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值