应用背景:
通信运检一班绩效的机制是利用每天的工作日志,将工作内容按照《一线班组工作积分制考核实施方案(20190108修订)》中的工作基本额定标准库进行对应,就可以知道每天的工分,每月工分相加就是每位员工的核心工作积分。部分工作日志如下图所示。
其中最有价值的部分是工作内容这一列。平时班组的绩效员根据自己的经验将工作内容和《工作基本额定标准库》进行人工一一对应,部分标准库如下图所示。
此人工过程相当费时费力,如果能用人工智能解决工作内容和工作基本额定标准库的智能对应,将大大提升绩效评定工作的效率。
数据集和标签:
选取一班今年1月的数据进行实验:
将数据人工打上标签,标签一定不能打错,否则会影响模型最终的判断。平时普通的人工方法其实就是人工打标签的过程,此过程非常耗时,亟待优化。打好标签的数据如下图所示。
只需要建立深度学习模型将这个对应关系学习出来,就可以利用深度学习模型对没有打标签的日志表,自动打上标签。以前1小时的工作量可以缩短为5分钟(登陆人工智能平台,上传数据,运行,得到结果),大大提升绩效评定工作的效率。
人工智能自然语言处理介绍:
自然语言处理的核心是通过编程设计让系统模仿人的智能去处理各项工作,这是使得新时期的文本分类工作开始朝着自动化、智能化方向发展的关键。
从数学的角度来看,文本分类工作其实只不过是一个映射的过程。可以一对一的映射,把一些被表明类别的文本信息映射到现有的种类当中,完成分类工作。也可以一对多的映射,比如,有些文本当中既有这种类别的特征,也含有其他类别的分类特征,因此需要将同一个文本分别存放在不同的类别中。所以在文本分类中,可以看作是一个集合的值映射到一个矩阵上。将相同类别的文本划入同一个矩阵当中,就完成了基础的文本分类工作。
模型选择:
本次项目选用的模型是百度PaddleHub中的ERNIE模型。
ERNIE通过建模海量数据中的词、实体及实体关系,学习真实世界的语义知识。相较于BERT学习原始语言信号,ERNIE直接对先验语义知识单元进行建模,增强了模型语义表示能力,以Transformer为网络基本组件,以Masked Bi-Language Model和Next Sentence Prediction为训练目标,通过预训练得到通用语义表示,再结合简单的输出层,应用到下游的NLP任务,在多个任务上取得了SOTA的结果。其可用于文本分类、序列标注、阅读理解等任务。预训练数据集为百科类、资讯类、论坛对话类数据等中文语料。
启动项目:
在ai studio中新建项目,上传打好标签的数据和没打标签需要预测的数据。
日志转绩效类型.xlsx中的数据如下图所示。
预测.xlsx中的数据如下图所示。
程序编写:
导包:
import csv
import paddle
import pandas as pd
import paddlehub as hub
from paddlehub.datasets.base_nlp_dataset import InputExample,TextClassificationDataset
数据导入:
DATA_DIR = "./work"
data = pd.read_excel("./work/日志转绩效类型.xlsx")
data.to_csv("./work/train1.csv",index=None)
test = pd.read_excel("./work/预测.xlsx")
test.to_csv("./work/test1.csv",index=None)
模型建立:
classes = list(data.iloc[:,1].unique()) #把第二列的类型找出来,也就是最后要输出的类别
model = hub.Module(name="ernie", task="seq-cls", num_classes = len(classes))
#ERNIE通过建模海量数据中的词、实体及实体关系,学习真实世界的语义知识。
#task任务名称,可为seq-cls文本分类任务
#num_classes:分类任务的类别数
数据加载:
class classifi(TextClassificationDataset):
label_list = classes
def __init__(self, tokenizer, max_seq_len: int = 128, mode: str = "train"):
if mode == "train":
data_file = "train1.csv"
elif mode == "test":
data_file = "test1.csv"
else:
data_file = "dev.csv"
super().__init__(base_path=DATA_DIR,data_file=data_file,tokenizer=tokenizer, max_seq_len=max_seq_len, mode=mode,is_file_with_header=True,label_list=self.label_list)
def _read_file(self, input_file, is_file_with_header: bool = False) :
with open(input_file,'r',encoding='UTF-8') as f:
examples = []
seq_id =0
reader = csv.reader(f,delimiter = ',')
header = next(reader) if is_file_with_header else None
for line in reader:
example = InputExample(guid=seq_id, text_a=line[0],label=line[1])
seq_id += 1
examples.append(example)
return examples
train_dataset = classifi(model.get_tokenizer(),mode = 'train',max_seq_len=128)
选择优化器和运行配置:
optimizer = paddle.optimizer.Adam(parameters=model.parameters(),learning_rate=1e-5)
trainer = hub.Trainer(model,optimizer=optimizer,checkpoint_dir='./check_point',use_gpu=True)
模型训练:
trainer.train(train_dataset,epochs=20,batch_size=10,save_interval=4)
acc即是accuracy准确度,准确度高达96%,没到100%的原因是训练的数据集不够大,模型还没有看完所有的情况。也就是只要他见过的类似题他就一定解得出,没过类似题的,就有小概率会解错。
模型预测:
#预测
label_map = {idx:label for idx,label in enumerate(classifi.label_list)}
data = pd.read_csv("./work/test1.csv",delimiter=',',header=None)
data.columns = ['预测输入']
#得到预测数据中的字符串组成列表
text = [[i[0]] for i in data.values ]
#读取模型
model_train = hub.Module(name="ernie", task="seq-cls",load_checkpoint = "./check_point/epoch_20/model.pdparams",
label_map = label_map)
result=model_train.predict(text,max_seq_len = 128, batch_size=1,use_gpu = True)
#data:待预测数据
#max_seq_len:模型处理文本的最大长度
#batch_size:模型批处理大小
#use_gpu:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu
data['预测结果'] = result
data.to_csv("a.csv",index = None,sep = ',')
在生成的a.csv中即可得到利用模型去预测的结果。
本次实验结果如下图所示:
肉眼可见准确率近乎100%,想要达到完全100%的效果只需要找出预测错误的项,将正确的标签加入日志转绩效类型.xlsx文件重新训练模型,即可达到准确率100%效果。
项目总结:
在平时工作中,文本分类的场景非常普遍,只要大家善于发现场景,重视数据的收集和提炼,再结合人工智能技术,就可以达到事半功倍的效果,效率呈几何级增长。
希望各位同事留意梳理应用场景,提升数据收集处理意识。
往期精彩回顾
适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件
本站qq群554839127,加入微信群请扫码: