日常生活中,因为虚拟移动基站或者是因为信息泄漏我们总会收到一些算法看不懂但是人可以看懂的短信。例如赌博/诈骗/套路贷款/等等,在这里我们利用生成式模型基于双向预训练语言模型对这些人能看懂但是分类算法看不懂的模型,进行一次还原操作。

Epoch 7/20
710/710 [==============================] - 107s 151ms/step - loss: 0.6680
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:50<00:00,  4.34it/s]
valid_data: {'rouge-1': 0.7285710688319597, 'rouge-2': 0.6089576684810527, 'rouge-l': 0.7272458741391169, 'bleu': 0.39399624868114114, 'best_bleu': 0.3991621462519909}
Epoch 8/20
710/710 [==============================] - 106s 149ms/step - loss: 0.6241
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:50<00:00,  4.34it/s]
valid_data: {'rouge-1': 0.7272126493770903, 'rouge-2': 0.6027857889593273, 'rouge-l': 0.7256909269008991, 'bleu': 0.3895602359841116, 'best_bleu': 0.3991621462519909}
Epoch 9/20
710/710 [==============================] - 106s 150ms/step - loss: 0.5837
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:51<00:00,  4.31it/s]
valid_data: {'rouge-1': 0.7291913095893998, 'rouge-2': 0.6093193362166718, 'rouge-l': 0.7274270175256913, 'bleu': 0.3940310287458383, 'best_bleu': 0.3991621462519909}
Epoch 10/20
710/710 [==============================] - 107s 151ms/step - loss: 0.5503
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:49<00:00,  4.35it/s]
valid_data: {'rouge-1': 0.732473693571034, 'rouge-2': 0.6162449389293161, 'rouge-l': 0.7310235523751296, 'bleu': 0.4003163952059621, 'best_bleu': 0.4003163952059621}
Epoch 11/20
710/710 [==============================] - 107s 151ms/step - loss: 0.5193
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [03:51<00:00,  4.31it/s]
valid_data: {'rouge-1': 0.7339013307351808, 'rouge-2': 0.6160255334339125, 'rouge-l': 0.7323492346774872, 'bleu': 0.40060752986767656, 'best_bleu': 0.40060752986767656}

数据集原始形态

每条数据由\t分割,第一个列是id第二列是短信中的文本第三列是人工翻译后的文本。so我们的模型输入是第二列输出是第三列。我们可以做一个实验看一下第二列有多少数据是在rbtl3的词表之外的。我们可以加入词表之外的信息重新训练一个更适应于当前场景的预训练语言模型出来,从而提升整体效果。

首先看一下效果 其中用到了几种验证手段

作者:HiroLin
链接:中文文本摘要指标-ROUGE - 知乎
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.ROUGE-N
 
对应的N即为连续字个数。例如:
人工y:文章内容新颖 (6个字) 机器x:这篇文章内容是新颖的(10个字) 重叠的部分是6个字
候选句子摘要句子是x,人工摘要句子是y
precision 两个句子重叠部分的n-gram/len(x) 6/10
recall 两个句子重叠部分的n-gram/len(y) 6/6
可以看出来机器生成的把人工的全部召回了,但是实际上机器生成的太多。此时精度就是来限制句子的关联程度的。
对应的range-2计算
人工y:文章内容新颖- 文章 章内 内容…… 共5个 机器x:这篇文章内容是新颖的(10个字)- 这篇 篇文 文章 …… 共9个 重叠的部分是5个词
precision 为5/9
recall 为5/5
优点:简洁且有词序
缺点:区分度不高,随着N的增大,值变小如上示例6/10 -> 5/9
2.ROUGE-L
最长公共子序列的重合率计算。
S是人工摘要,C是机器摘要

RLCS 表示召回率,而 PLCS 表示精确率,FLCS 就是 ROUGE-L。一般 beta 会设置为很大的数,因此 FLCS 几乎只考虑了 RLCS (即召回率)
优点:反应句子级别顺序,不需要制定n-gram的长度
缺点:只考虑了最长子序列的长度,忽略了其他子序列
适用于短摘要提取

以上信息来源:

HiroLin:中文文本摘要指标-ROUGE0 赞同 · 0 评论文章正在上传…重新上传取消​

bleu

作者:一译
链接:BLEU:一种自动评估机器翻译的方法 - 知乎
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

通常,给定源语句有许多“完美”的翻译。 这些翻译的单词选择可能不同,或者即使它们使用相同的单词但单词顺序也可能不同。 然而,人类可以清楚地区分好的翻译和坏翻译。 例如,考虑这两个对一条中文源语句的候选翻译:
例1
候选翻译1: It is a guide to action which ensures that the military always obeys the commands of the party.
候选翻译2: It is to insure the troops forever hearing the activity guidebook that party direct.
虽然它们似乎是在同一主题上,但它们的质量明显不同。 为了比较,下面我们提供同一语句的三个参考人类翻译。
参考翻译1: It is a guide to action that ensures that the military will forever heed Party commands.
参考翻译2: It is the guiding principle which guarantees the military forces always being under the command of the Party.
参考翻译3: It is the practical guide for the army always to heed the directions of the party.
很明显,好的候选翻译1与这三个参考译文共享许多单词和短语,而候选翻译2则没有。 我们将在第2.1节中简要地量化这种共享概念。 但首先要注意候选翻译1与参考翻译1共享"It is a guide to action",与参考翻译2共享"which",与参考翻译1共享"ensures that the military",与参考翻译2和3共享"always",最后与参考翻译2共享"of the party"(全部忽略大小写)。 相比之下,候选翻译2表现出的匹配要少得多,而且它们的范围较小。
很明显,程序可以简单地通过比较每个候选翻译和参考翻译之间的n-gram匹配来将候选翻译1排名高于候选翻译2。 对第5节中提供的大量翻译的实验表明,这种区分能力是一种普遍现象,而不是人工编造的一些无聊示例。
BLEU实现者的主要编程任务是将候选翻译的n-gram与参考翻译的n-gram进行比较并计算匹配数。 这些匹配与位置无关。 匹配越多,候选翻译就越好。 为简单起见,我们首先关注计算unigram匹配。

以上信息来源

一译:BLEU:一种自动评估机器翻译的方法65 赞同 · 13 评论文章

我们采用的预训练语言模型部分选用的是由哈工大开源的rbtl3模型

https://github.com/ymcui/Chinese-BERT-wwm​

github.com/ymcui/Chinese-BERT-wwm

代码是从bert4keras的example中修改而来

https://github.com/bojone/bert4keras/blob/master/examples/task_seq2seq_autotitle_csl.py​

github.com/bojone/bert4keras/blob/master/examples/task_seq2seq_autotitle_csl.py

from __future__ import print_function
import numpy as np
from tqdm import tqdm
from bert4keras.backend import keras, K
from bert4keras.layers import Loss
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer, load_vocab
from bert4keras.optimizers import Adam
from bert4keras.snippets import sequence_padding, open
from bert4keras.snippets import DataGenerator, AutoRegressiveDecoder
from keras.models import Model
from rouge import Rouge  # pip install rouge
from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction# 基本参数
maxlen = 256
batch_size = 16
epochs = 20# bert配置
config_path = '/home/bert_config_rbt3.json'
checkpoint_path = '/home/bert_model.ckpt'
dict_path = '/home/vocab.txt'def load_data(filename):D = []with open(filename, encoding='utf-8') as f:for l in f:id, title, content = l.strip().split('\t')D.append((title, content))return D# 加载数据集
train_data = load_data('/home/train_public.csv')
valid_data = load_data('/home/train_public.csv')[:1000]
test_data = load_data('/home/train_public.csv')[1000:2000]# 加载并精简词表,建立分词器
token_dict, keep_tokens = load_vocab(dict_path=dict_path,simplified=True,startswith=['[PAD]', '[UNK]', '[CLS]', '[SEP]'],
)
tokenizer = Tokenizer(token_dict, do_lower_case=True)class data_generator(DataGenerator):"""数据生成器"""def __iter__(self, random=False):batch_token_ids, batch_segment_ids = [], []for is_end, (title, content) in self.sample(random):token_ids, segment_ids = tokenizer.encode(content, title, maxlen=maxlen)batch_token_ids.append(token_ids)batch_segment_ids.append(segment_ids)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)yield [batch_token_ids, batch_segment_ids], Nonebatch_token_ids, batch_segment_ids = [], []class CrossEntropy(Loss):"""交叉熵作为loss,并mask掉输入部分"""def compute_loss(self, inputs, mask=None):y_true, y_mask, y_pred = inputsy_true = y_true[:, 1:]  # 目标token_idsy_mask = y_mask[:, 1:]  # segment_ids,刚好指示了要预测的部分y_pred = y_pred[:, :-1]  # 预测序列,错开一位loss = K.sparse_categorical_crossentropy(y_true, y_pred)loss = K.sum(loss * y_mask) / K.sum(y_mask)return lossmodel = build_transformer_model(config_path,checkpoint_path,application='unilm',keep_tokens=keep_tokens,  # 只保留keep_tokens中的字,精简原字表
)output = CrossEntropy(2)(model.inputs + model.outputs)model = Model(model.inputs, output)
model.compile(optimizer=Adam(1e-5))
model.summary()class AutoTitle(AutoRegressiveDecoder):"""seq2seq解码器"""@AutoRegressiveDecoder.wraps(default_rtype='probas')def predict(self, inputs, output_ids, states):token_ids, segment_ids = inputstoken_ids = np.concatenate([token_ids, output_ids], 1)segment_ids = np.concatenate([segment_ids, np.ones_like(output_ids)], 1)return model.predict([token_ids, segment_ids])[:, -1]def generate(self, text, topk=1):max_c_len = maxlen - self.maxlentoken_ids, segment_ids = tokenizer.encode(text, maxlen=max_c_len)output_ids = self.beam_search([token_ids, segment_ids],topk)  # 基于beam searchreturn tokenizer.decode(output_ids)autotitle = AutoTitle(start_id=None, end_id=tokenizer._token_end_id, maxlen=32)class Evaluate(keras.callbacks.Callback):def __init__(self):self.rouge = Rouge()self.smooth = SmoothingFunction().method1self.best_bleu = 0.def on_epoch_end(self, epoch, logs=None):metrics = self.evaluate(valid_data)  # 评测模型if metrics['bleu'] > self.best_bleu:self.best_bleu = metrics['bleu']model.save_weights('./gray production management.weights')  # 保存模型metrics['best_bleu'] = self.best_bleuprint('valid_data:', metrics)def evaluate(self, data, topk=1):total = 0rouge_1, rouge_2, rouge_l, bleu = 0, 0, 0, 0for title, content in tqdm(data):total += 1title = ' '.join(title)pred_title = ' '.join(autotitle.generate(content, topk))if pred_title.strip():scores = self.rouge.get_scores(hyps=pred_title, refs=title)rouge_1 += scores[0]['rouge-1']['f']rouge_2 += scores[0]['rouge-2']['f']rouge_l += scores[0]['rouge-l']['f']bleu += sentence_bleu(references=[title.split(' ')],hypothesis=pred_title.split(' '),smoothing_function=self.smooth)rouge_1 /= totalrouge_2 /= totalrouge_l /= totalbleu /= totalreturn {'rouge-1': rouge_1,'rouge-2': rouge_2,'rouge-l': rouge_l,'bleu': bleu,}if __name__ == '__main__':evaluator = Evaluate()train_generator = data_generator(train_data, batch_size)model.fit_generator(train_generator.forfit(),steps_per_epoch=len(train_generator),epochs=epochs,callbacks=[evaluator])else:model.load_weights('./gray production management.weights')

数据来源于

数字安全公开赛​

www.datafountain.cn/special/BDCI2021-360?targetId=7642252

快来报名比赛吧。这里我本地保存了数据,如果在比赛结束后还需要进行科研攻关的朋友可以加我的微信获取到这次比赛的数据集,如果有同学需要用到这次比赛的模型可以来找我要模型。模型参数的腾讯云COS下载地址。加载模型不会的同学也可以来找我。

https://re-1256602214.cos.ap-nanjing.myqcloud.com/gray%20production%20management.weights​

re-1256602214.cos.ap-nanjing.myqcloud.com/gray%20production%20management.weights

下一步的工作计划,是通过文本相似度算法扩大预训练部分的训练语料。扩大词表。换几种语言模型架构跑一下。看一下各个模型的表现差异。

最后感谢autodl提供的GPU训练机器。AutoDL-品质GPU租用平台-租GPU就上AutoDL。

unlim支撑垃圾短信还原器相关推荐

  1. 朴素贝叶斯算法--过滤垃圾短信

    文章目录 1. 基于黑名单过滤 2. 基于规则过滤 3. 基于概率统计过滤 4. 总结 上一节我们讲到,如何用位图.布隆过滤器,来 过滤重复数据.今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信? ...

  2. 大数据垃圾短信自动化识别系统的研发与应用

    申报单位: 中移(苏州)软件技术有限公司 中国移动信息安全管理与运营中心 第一部分 项目背景及挑战 一.企业简介 中国移动通信集团公司信息安全管理与运行中心(以下简称"中移信安中心" ...

  3. 强封锁之后,华为正寻求10亿美元贷款;苹果发布iOS 12.3.1正式版,出击垃圾短信;联想CFO为“联想搬出中国”言论道歉;...

    关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...

  4. iphone短信尚未送达_iPhone开启这个功能,从此告别垃圾短信骚扰!

    相信不少苹果手机用户在短信中经常收到邮件地址发来的垃圾赌博短信,其中的多个链接均植入了赌博网站,并利用改头换面的形式通过了苹果商店的审核.这些赌博网站还会引诱他人加入"代理",发展 ...

  5. python垃圾短信识别_Scikit-Learn机器学习实践:垃圾短信识别

    机器学习与垃圾短信识别 前不久,我们使用NLTK的贝叶斯分类模型垃圾对短信数据进行机器学习的垃圾短信识别. 其实除了使用NLTK,我们还可以使用Scikit-Learn这个集成了诸多机器学习算法的模块 ...

  6. 雅虎因发送垃圾短信面临50万人集体诉讼

    1月5日消息,据路透社报道,美国芝加哥一联邦法官周一判定,雅虎垃圾短信案必须以集体诉讼方式审理.此案原告指控雅虎未经许可向手机用户发送短信,违反了<电话消费者保护法>. 法院文件显示,有资 ...

  7. 人工智能情感分析源码,垃圾短信邮箱分析

    分享一个机器学习文本分类项目的案例,该分类项目是一个通用的文本分类项目,这里的数据集我酒店用户评价数据,分类模型为二分类,正面评价和负面评价,这里所说的通用,就是你可以根据你自己的数据,进行train ...

  8. 一键取消所有淘宝垃圾短信

    如果你在淘宝经常有购物[滑稽] 那么一定会经常收到如↓图类骚扰短信[赖皮] PS:有时候一天能给你发十几条营销短信,甚至还可能会接到商家的营销电话,然后还需要你回复XX才能退订...[赖皮] 但至于这 ...

  9. 虚拟运营商治理170垃圾短信推举报平台

    今日,腾讯科技从虚拟运营商蜗牛移动获悉,其微信号"蜗牛移动"正式对外推出垃圾短信举报平台,打击通讯诈骗. 公开数据显示,截至2015年底,虚拟运营商的用户总共有2050万户,占整个 ...

最新文章

  1. 数据结构与算法分析c++第四版_研分享 | 人工智能学院数据结构与算法分析考研备考整理...
  2. MySQL无法存储中文问题
  3. Angular框架里两个模块的互相依赖
  4. mysql2005本地连接_sql2005连接配置详细图解
  5. [转]MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  6. mysql 伪哈希_MySQL技巧--伪哈希索引
  7. 玩出来的33岁亿万富翁-畅游CEO王滔
  8. 2021强网杯 LongTimeAgo
  9. 【Verilog零基础入门-边看边练】学习笔记——第七讲 时序逻辑代码设计和仿真(三角波发生器)(一)
  10. HDU 5745 La Vie en rose(DP+bitset优化)
  11. html+css基础入门学习教程之HTML 样式
  12. python数据分析热力图怎么看_数据分析实战—热力图
  13. phpunit问题与解决
  14. 计算机开机后黑屏鼠标显示桌面图标,win10系统电脑启动开机黑屏不显示只有鼠标图标的处理办法...
  15. COMSOL中场路耦合(电路接口与电磁场接口)
  16. 第3.1章:StarRocks数据导入--Insert into
  17. mysql 分区 全局索引_全局分区索引与局部分区索引
  18. OSChina 周六乱弹 —— 下次又带妹子来吃猪蹄了
  19. 免抠图PNG素材网站
  20. CSS——粘性定位(sticky)

热门文章

  1. golang 原子操作
  2. [激光器原理与应用-9]: 开关电源主要指标
  3. python 学习指南_Python类型检查终极指南
  4. 给小学生上计算机课,【学生简笔画】小学生上电脑课精选日记
  5. 主流AI开发平台浅析1-华为云AI开发平台ModelArts
  6. 计算机网络:网络安全(精简版)
  7. 软工大作业·倾物语(二)
  8. Servlet解决中文乱码
  9. 百度搜索高级语法技巧
  10. km之路--002 easyui 一