AI实时质检一直是个比较热门的话题,主要的实现方式有两种:一种是基于规则的模型;一种是基于深度学习的模型。基于规则的模型有通用的缺陷:规则冲突和维护困难。基于深度学习的模型,则可以很好的规避这个缺陷,且全召回、高精度。下面介绍基于深度语义模型实现的过程。语料数据由于涉及信息安全,不能提供,仅提供具体的技术实现过程。
首先是模型的选择,我们选择百度语义模型ernie_tiny,选择tiny只是为了训练的效率,有资源的朋友的可以选择标准模型ernie,效果会更好。
语义数据格式说明:语义包含两列分布是违规分类和违规话术。数据集10270条,其中训练集7000条,验证集1000条,测试集1000条,预测集1270条。
labels=['误导混淆产品概念',
'冒充其它岗位人员',
'销售误导',
'引导客户退保',
'恶意销售误导',
'保障升级',
'出现不礼貌词语',
'出现极致词语',
'夸大产品稀缺性',
'理赔时效介绍不规范',
'开场白不规范',
'消极挽单',
'禁止不客观对比',
'夸大条款引用错误话术',
'误导钱存到虚构账户',
'利用法律法规虚假宣传']
#id标签转换
id2label= {i:str(label) for i,label in enumerate(labels)}
label2id= {str(label):i for i,label in enumerate(labels)}
id_list =[i for i,_ in enumerate(label2id)]
import paddlehub as hub
#选择模型
model = hub.Module(name='ernie_tiny', version='2.0.1', task='seq-cls', num_classes=16, label_map=id2label)
自定义数据集实现类
from typing import Dict, List, Optional, Union, Tuple
from paddlehub.datasets.base_nlp_dataset import TextClassificationDataset
from paddlehub.text.bert_tokenizer import BertTokenizer
from paddlehub.text.tokenizer import CustomTokenizer
#参考百度源代码,继承文本分类数据集
class QualityInspectCorp(TextClassificationDataset):
def __init__(self, tokenizer: Union[BertTokenizer, CustomTokenizer], max_seq_len: int = 128, mode: str = 'train'):
base_path = os.path.join(".", "QualityInspect")
if mode == 'train':
data_file = 'train.tsv'
elif mode == 'test':
data_file = 'test.tsv'
else:
data_file = 'dev.tsv'
super().__init__(
base_path=base_path,
tokenizer=tokenizer,
max_seq_len=max_seq_len,
mode=mode,
data_file=data_file,
label_list=id_list,
is_file_with_header=True)
生成数据集
train_dataset = QualityInspectCorp(tokenizer=model.get_tokenizer(), max_seq_len=120, mode='train')
dev_dataset = QualityInspectCorp(tokenizer=model.get_tokenizer(), max_seq_len=120, mode='dev')
test_dataset = QualityInspectCorp(tokenizer=model.get_tokenizer(), max_seq_len=120, mode='test')
模型训练及评估
import paddle
optimizer = paddle.optimizer.Adam(learning_rate=5e-5, parameters=model.parameters())
trainer = hub.Trainer(model, optimizer, checkpoint_dir='test_ernie_text_cls')
#每个epoch保存一次训练好的模型,最佳模型保存在best_model下。
trainer.train(train_dataset, epochs=3, batch_size=32, eval_dataset=dev_dataset, save_interval=1)
# 在测试集上评估当前训练模型
trainer.evaluate(test_dataset, batch_size=32)
训练及评估可视化结果
模型预测
#载入最佳模型进行预测
import paddlehub as hub
best_model = hub.Module(
name='ernie_tiny',
version='2.0.1',
task='seq-cls',
load_checkpoint='./test_ernie_text_cls/best_model/model.pdparams',
label_map=id2label
)
#预测数据集转换
data=[[pre_dataset.examples[i].text_a] for i in range(0,len(pre_dataset.examples))]
data
results = best_model.predict(data, max_seq_len=128, batch_size=1, use_gpu=False)
for idx, text in enumerate(data):
print('Data: {} \t Label: {}'.format(text[0], results[idx]))
预测结果:正确率0.994,召回率:1,精确率:0.99。