1 赛题名称

基于文本挖掘的企业隐患排查质量分析模型

2 赛题背景

企业自主填报安全生产隐患,对于将风险消除在事故萌芽阶段具有重要意义。企业在填报隐患时,往往存在不认真填报的情况,“虚报、假报”隐患内容,增大了企业监管的难度。采用大数据手段分析隐患内容,找出不切实履行主体责任的企业,向监管部门进行推送,实现精准执法,能够提高监管手段的有效性,增强企业安全责任意识。

3 赛题任务

本赛题提供企业填报隐患数据,参赛选手需通过智能化手段识别其中是否存在“虚报、假报”的情况

看清赛题很关键,大家需要好好理解赛题目标之后,再去做题,可以避免很多弯路。

数据简介

本赛题数据集为脱敏后的企业填报自查隐患记录。

4 数据说明

训练集数据包含“【id、level_1(一级标准)、level_2(二级标准)、level_3(三级标准)、level_4(四级标准)、content(隐患内容)和label(标签)】”共7个字段。
其中“id”为主键,无业务意义;“一级标准、二级标准、三级标准、四级标准”为《深圳市安全隐患自查和巡查基本指引(2016年修订版)》规定的排查指引,一级标准对应不同隐患类型,二至四级标准是对一级标准的细化,企业自主上报隐患时,根据不同类型隐患的四级标准开展隐患自查工作;“隐患内容”为企业上报的具体隐患;“标签”标识的是该条隐患的合格性,“1”表示隐患填报不合格,“0”表示隐患填报合格。

预测结果文件results.csv

列名 说明
id 企业号
label 正负样本分类
  • 文件名:results.csv,utf-8编码
  • 参赛者以csv/json等文件格式,提交模型结果,平台进行在线评分,实时排名。

5 评测标准

本赛题采用F1 -score作为模型评判标准。

精确率P、召回率 R和 F1-score计算公式如下所示:

6 数据分析

  • 查看数据集

训练集数据包含“【id、level_1(一级标准)、level_2(二级标准)、level_3(三级标准)、level_4(四级标准)、content(隐患内容)和label(标签)】”共7个字段。测试集没有label字段

  • 标签分布
    我们看下数据标签数量分布,看看有多少在划水哈哈_
sns.countplot(train.label)
plt.xlabel('label count')


在训练集12000数据中,其中隐患填报合格的有10712条,隐患填报不合格的有1288条,差不多是9:1的比例,说明我们分类任务标签分布式极其不均衡的。

  • 文本长度分布
    我们将level_content的文本拼接在一起
train['text']=train['content']+' '+train['level_1']+' '+train['level_2']+' '+train['level_3']+' '+train['level_4']
test['text']=test['content']+' '+test['level_1']+' '+test['level_2']+' '+test['level_3']+' '+test['level_4']train['text_len']=train['text'].map(len)
test['text'].map(len).describe()

然后查看下文本最大长度分布

count    18000.000000
mean        64.762167
std         22.720117
min         27.000000
25%         50.000000
50%         60.000000
75%         76.000000
max        504.000000
Name: text, dtype: float64
train['text_len'].plot(kind='kde')

7 基于BERT的企业隐患排查质量分析模型

完整代码可以联系作者获取

7.1 导入工具包
import random
import numpy as np
import pandas as pd
from bert4keras.backend import keras, set_gelu
from bert4keras.tokenizers import Tokenizer
from bert4keras.models import build_transformer_model
from bert4keras.optimizers import Adam, extend_with_piecewise_linear_lr
from bert4keras.snippets import sequence_padding, DataGenerator
from bert4keras.snippets import open
from keras.layers import Lambda, Dense
Using TensorFlow backend.
7.2 设置参数
set_gelu('tanh')  # 切换gelu版本
num_classes = 2
maxlen = 128
batch_size = 32
config_path = '../model/albert_small_zh_google/albert_config_small_google.json'
checkpoint_path = '../model/albert_small_zh_google/albert_model.ckpt'
dict_path = '../model/albert_small_zh_google/vocab.txt'# 建立分词器
tokenizer = Tokenizer(dict_path, do_lower_case=True)
7.3 定义模型
# 加载预训练模型
bert = build_transformer_model(config_path=config_path,checkpoint_path=checkpoint_path,model='albert',return_keras_model=False,
)
output = Lambda(lambda x: x[:, 0], name='CLS-token')(bert.model.output)
output = Dense(units=num_classes,activation='softmax',kernel_initializer=bert.initializer
)(output)model = keras.models.Model(bert.model.input, output)
model.summary()
    Model: "model_2"__________________________________________________________________________________________________Layer (type)                    Output Shape         Param #     Connected to                     ==================================================================================================Input-Token (InputLayer)        (None, None)         0                                            __________________________________________________________________________________________________Input-Segment (InputLayer)      (None, None)         0                                            __________________________________________________________________________________________________Embedding-Token (Embedding)     (None, None, 128)    2704384     Input-Token[0][0]                __________________________________________________________________________________________________Embedding-Segment (Embedding)   (None, None, 128)    256         Input-Segment[0][0]              __________________________________________________________________________________________________Embedding-Token-Segment (Add)   (None, None, 128)    0           Embedding-Token[0][0]            Embedding-Segment[0][0]          __________________________________________________________________________________________________Embedding-Position (PositionEmb (None, None, 128)    65536       Embedding-Token-Segment[0][0]    __________________________________________________________________________________________________Embedding-Norm (LayerNormalizat (None, None, 128)    256         Embedding-Position[0][0]         __________________________________________________________________________________________________Embedding-Mapping (Dense)       (None, None, 384)    49536       Embedding-Norm[0][0]             __________________________________________________________________________________________________Transformer-MultiHeadSelfAttent (None, None, 384)    591360      Embedding-Mapping[0][0]          Embedding-Mapping[0][0]          Embedding-Mapping[0][0]          Transformer-FeedForward-Norm[0][0Transformer-FeedForward-Norm[0][0Transformer-FeedForward-Norm[0][0Transformer-FeedForward-Norm[1][0Transformer-FeedForward-Norm[1][0Transformer-FeedForward-Norm[1][0Transformer-FeedForward-Norm[2][0Transformer-FeedForward-Norm[2][0Transformer-FeedForward-Norm[2][0Transformer-FeedForward-Norm[3][0Transformer-FeedForward-Norm[3][0Transformer-FeedForward-Norm[3][0Transformer-FeedForward-Norm[4][0Transformer-FeedForward-Norm[4][0Transformer-FeedForward-Norm[4][0__________________________________________________________________________________________________Transformer-MultiHeadSelfAttent (None, None, 384)    0           Embedding-Mapping[0][0]          Transformer-MultiHeadSelfAttentioTransformer-FeedForward-Norm[0][0Transformer-MultiHeadSelfAttentioTransformer-FeedForward-Norm[1][0Transformer-MultiHeadSelfAttentioTransformer-FeedForward-Norm[2][0Transformer-MultiHeadSelfAttentioTransformer-FeedForward-Norm[3][0Transformer-MultiHeadSelfAttentioTransformer-FeedForward-Norm[4][0Transformer-MultiHeadSelfAttentio__________________________________________________________________________________________________Transformer-MultiHeadSelfAttent (None, None, 384)    768         Transformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentio__________________________________________________________________________________________________Transformer-FeedForward (FeedFo (None, None, 384)    1181568     Transformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentioTransformer-MultiHeadSelfAttentio__________________________________________________________________________________________________Transformer-FeedForward-Add (Ad (None, None, 384)    0           Transformer-MultiHeadSelfAttentioTransformer-FeedForward[0][0]    Transformer-MultiHeadSelfAttentioTransformer-FeedForward[1][0]    Transformer-MultiHeadSelfAttentioTransformer-FeedForward[2][0]    Transformer-MultiHeadSelfAttentioTransformer-FeedForward[3][0]    Transformer-MultiHeadSelfAttentioTransformer-FeedForward[4][0]    Transformer-MultiHeadSelfAttentioTransformer-FeedForward[5][0]    __________________________________________________________________________________________________Transformer-FeedForward-Norm (L (None, None, 384)    768         Transformer-FeedForward-Add[0][0]Transformer-FeedForward-Add[1][0]Transformer-FeedForward-Add[2][0]Transformer-FeedForward-Add[3][0]Transformer-FeedForward-Add[4][0]Transformer-FeedForward-Add[5][0]__________________________________________________________________________________________________CLS-token (Lambda)              (None, 384)          0           Transformer-FeedForward-Norm[5][0__________________________________________________________________________________________________dense_7 (Dense)                 (None, 2)            770         CLS-token[0][0]                  ==================================================================================================Total params: 4,595,202Trainable params: 4,595,202Non-trainable params: 0__________________________________________________________________________________________________
# 派生为带分段线性学习率的优化器。
# 其中name参数可选,但最好填入,以区分不同的派生优化器。
# AdamLR = extend_with_piecewise_linear_lr(Adam, name='AdamLR')model.compile(loss='sparse_categorical_crossentropy',optimizer=Adam(1e-5),  # 用足够小的学习率
#     optimizer=AdamLR(learning_rate=1e-4, lr_schedule={
#         1000: 1,
#         2000: 0.1
#     }),metrics=['accuracy'],
)
7.4 生成数据
def load_data(valid_rate=0.3):train_file = "../data/train.csv"test_file = "../data/test.csv"df_train_data = pd.read_csv("../data/train.csv")df_test_data = pd.read_csv("../data/test.csv")train_data, valid_data, test_data = [], [], []for row_i, data in df_train_data.iterrows():id, level_1, level_2, level_3, level_4, content, label = dataid, text, label = id, str(level_1) + '\t' + str(level_2) + '\t' + \str(level_3) + '\t' + str(level_4) + '\t' + str(content), labelif random.random() > valid_rate:train_data.append( (id, text, int(label)) )else:valid_data.append( (id, text, int(label)) )for row_i, data in df_test_data.iterrows():id, level_1, level_2, level_3, level_4, content = dataid, text, label = id, str(level_1) + '\t' + str(level_2) + '\t' + \str(level_3) + '\t' + str(level_4) + '\t' + str(content), 0test_data.append( (id, text, int(label)) )return train_data, valid_data, test_data
train_data, valid_data, test_data = load_data(valid_rate=0.3)
valid_data
[(5,'工业/危化品类(现场)—2016版\t(一)消防检查\t2、防火检查\t8、易燃易爆危险物品和场所防火防爆措施的落实情况以及其他重要物资的防火安全情况;\t防爆柜里面稀释剂,机油费混装',0),(3365,'三小场所(现场)—2016版\t(一)消防安全\t2、消防通道和疏散\t2、疏散通道、安全出口设置应急照明灯和疏散指示标志。\t4楼消防楼梯安全出口指示牌坏',0),...]
len(train_data)
8403
class data_generator(DataGenerator):"""数据生成器"""def __iter__(self, random=False):batch_token_ids, batch_segment_ids, batch_labels = [], [], []for is_end, (id, text, label) in self.sample(random):token_ids, segment_ids = tokenizer.encode(text, maxlen=maxlen)batch_token_ids.append(token_ids)batch_segment_ids.append(segment_ids)batch_labels.append([label])if len(batch_token_ids) == self.batch_size or is_end:batch_token_ids = sequence_padding(batch_token_ids)batch_segment_ids = sequence_padding(batch_segment_ids)batch_labels = sequence_padding(batch_labels)yield [batch_token_ids, batch_segment_ids], batch_labelsbatch_token_ids, batch_segment_ids, batch_labels = [], [], []
# 转换数据集
train_generator = data_generator(train_data, batch_size)
valid_generator = data_generator(valid_data, batch_size)
valid_data
    [(5,'工业/危化品类(现场)—2016版\t(一)消防检查\t2、防火检查\t8、易燃易爆危险物品和场所防火防爆措施的落实情况以及其他重要物资的防火安全情况;\t防爆柜里面稀释剂,机油费混装',0),(8,'工业/危化品类(现场)—2016版\t(一)消防检查\t2、防火检查\t2、安全疏散通道、疏散指示标志、应急照明和安全出口情况;\t已整改',1),(3365,'三小场所(现场)—2016版\t(一)消防安全\t2、消防通道和疏散\t2、疏散通道、安全出口设置应急照明灯和疏散指示标志。\t4楼消防楼梯安全出口指示牌坏',0),...]

7.5 训练和验证

evaluator = Evaluator()
model.fit(train_generator.forfit(),steps_per_epoch=len(train_generator),epochs=2,callbacks=[evaluator])
model.load_weights('best_model.weights')
# print(u'final test acc: %05f\n' % (evaluate(test_generator)))
print(u'final test acc: %05f\n' % (evaluate(valid_generator)))
final test acc: 0.981651
print(u'final test acc: %05f\n' % (evaluate(train_generator)))

完整代码可以联系作者获取

手把手教你搭建Bert文本分类模型,快点看过来吧!相关推荐

  1. NLP - 15 分钟搭建中文文本分类模型

    https://eliyar.biz/nlp_chinese_text_classification_in_15mins/

  2. 15 分钟搭建一个基于XLNET的文本分类模型——keras实战

    今天笔者将简要介绍一下后bert 时代中一个又一比较重要的预训练的语言模型--XLNET ,下图是XLNET在中文问答数据集CMRC 2018数据集(哈工大讯飞联合实验室发布的中文机器阅读理解数据,形 ...

  3. 基于Keras搭建CNN、TextCNN文本分类模型

    基于Keras搭建CNN.TextCNN文本分类模型 一.CNN 1.1 数据读取分词 1.2.数据编码 1.3 数据序列标准化 1.4 构建模型 1.5 模型验证 二.TextCNN文本分类 2.1 ...

  4. 独家 | 教你用Pytorch建立你的第一个文本分类模型!

    作者:Aravind Pai 翻译:王威力 校对:张一豪 本文约3400字,建议阅读10+分钟 本文介绍了利用Pytorch框架实现文本分类的关键知识点,包括使用如何处理Out of Vocabula ...

  5. 手把手教你搭建机器学习+深度学习AI模型

    说起现在搞什么最挣钱,10 人里 11 个都要回答人工智能! 早在几年前,华为就开出百万年薪招聘 AI 专家,当是很多人认为噱头大于实际价值.但如果今天还有谁质疑人工智能的前景,那显然已经和时代脱轨了 ...

  6. 手把手教你搭建SpringCloud项目(十六)集成Stream消息驱动

    Spring Cloud全集文章目录: 零.什么是微服务?一看就会系列! 一.手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二.手把手教你搭建SpringCloud项目(二)生产 ...

  7. 基于Bert文本分类进行行业识别

    NLP学习之Bert文本分类 行业识别--基于Bert 项目介绍 数据集: 数据迭代器: 项目结构: 总入口: 模型搭建和配置 配置类: config 模型搭建:model 数据预处理: 数据预处理 ...

  8. NLP 模型“解语如神”的诀窍:在文本分类模型中注入外部词典

    一. 引言 现实世界的文本表述如恒河沙数,以惊人的速度变换着,人工智能(AI)在快速识别形形色色的文本之前,必须经过充足的训练数据洗礼.然而,面对复杂多变的文本表述,NLP 模型往往无法从有限的训练数 ...

  9. pytorch bert文本分类_一起读Bert文本分类代码 (pytorch篇 四)

    Bert是去年google发布的新模型,打破了11项纪录,关于模型基础部分就不在这篇文章里多说了.这次想和大家一起读的是huggingface的pytorch-pretrained-BERT代码exa ...

最新文章

  1. od结构体大小_od内存断点的探析和检测方法
  2. 深度有趣 | 27 服饰关键点定位
  3. SAP作业类型应用简介
  4. python bool值要注意的一些地方
  5. 山东省2021年高考成绩查询平台6,山东2021年高考成绩改为6月26日前公布
  6. react和nodejs_如何使用NodeJS和React为SaaS构建Stripe Billing入门流程
  7. 安徽新华学院计算机设计大赛,安徽新华学院学子在中国大学生计算机设计大赛中获佳绩...
  8. LeetCode刷题(37)--Edit Distance
  9. Salesforce正面叫板微软Office:5.82亿美元收购Quip
  10. 第六章 静电场中的导体和电介质
  11. Matlab 使用四阶龙格库塔求解二阶隐式微分方程_ode45
  12. Facebook_scraper:Python获取FB用户的公开发帖【FaceBook系列 一】
  13. 黑掉php网站,如何黑掉一个网站
  14. 进程、lwp(轻量级进程)和Java线程的理解
  15. com.thoughtworks.xstream.converters.reflection.ReflectionConverter,用XSTream将xml转换为Java对象
  16. Android开发-简介(一)
  17. 深度学习入门笔记(二十):经典神经网络(LeNet-5、AlexNet和VGGNet)
  18. Digimat-MF:微观-宏观(两尺度)方法
  19. echarts树图修改连线样式颜色,树的形状曲线和折线,树图边的曲度
  20. exit status 145: The directory is not empty,exit status 5: �ܾ����ʡ� ,nvm切换node版本问题汇总

热门文章

  1. 301重定向完整解析
  2. 使用mirDeep2进行miRNA-seq数据分析
  3. 定义一个矩形类,有长、宽两个属性,用成员函数计算矩形的面积
  4. MATLAB R2020a导出低版本的simulink模型
  5. Docker(3):docker运行nginx实例以及在java容器中运行java程序
  6. 【转】VCM驱动IC--close loop
  7. template是什么意思啊_建议永久保存!告诉你的孩子什么才重要
  8. Vue+ElementUI实现的后台开发框架
  9. 快速学习-“幽灵”(GHOST)协议
  10. stm32 常见模块代码