大家好,文本数据的处理,对于一个风控策略或者算法,我觉得是必须要掌握的技能,有人说,我的风控并不涉及到文本?我觉得这片面了,在非内容风控领域,文本知识也是非常有用的。

用户昵称、地址啥的,这种绝大部分风控场景都能遇到;关系网络的节点向量化,基本也是文本处理的思路;行为序列,也能用文本的知识去处理,能捕捉非常有趣模式。

去年就已经写的差不多了,现在整理好慢慢更新,本系列主要介绍了风控场景下文本分类的基本方法,对抗文本变异,包括传统的词袋模型、循环神经网络,也有常用于计算机视觉任务的卷积神经网络,以及 RNN + CNN,试验完一遍,基本能搞定大部分的文本分类以及文本变异对抗问题。

今天使用双向GRU对文本进行分类,喜欢记得收藏、关注、点赞。完整代码,获取如下

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式、添加微信号:dkl88191,备注:来自CSDN
方式、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

一、原理介绍

RNN 可能看起来很可怕,尽管它们因为复杂而难以理解,但非常有趣。RNN 模型封装了一个非常漂亮的设计,以克服传统神经网络在处理序列数据(文本、时间序列、视频、DNA 序列等)时的短板。

RNN 是一系列神经网络的模块,它们彼此连接像锁链一样,每一个都将消息向后传递,强烈推荐大家从 Colah 的博客中深入了解它的内部机制,下面的图就来源于此。

我们要处理的序列类型是文本数据。对意义而言,单词顺序很重要。RNN 考虑到了这一点,它可以捕捉长期依赖关系。

二、数据集和预处理

本文用一个风险弹幕数据集做实验,该数据集包含19670条明细数据,每一行都用 1(垃圾文本)和 0(正常文本)进行了标记。

数据集地址:https://github.com/LebronGG/textcnn/blob/master/data/cnews/train.txt,自己需要简单处理下,负向-1,正向-0即可。也可以后台回复【弹幕】获取

目标: 针对直播间中存在的大量涉黄涉暴弹幕,进行垃圾分类,将弹幕中不合法的内容进行识别并屏蔽。

正常弹幕示例

新人主播,各位老板多多关注ᚠᚠᚠ 0

50077你卖我 0

看看五雷咒的威力 0

垃圾弹幕示例

网站++沜买的私聊我 1

安 KMD555 买-P-微 1

抠逼加薇2928046748抠逼加薇2928046748抠逼。 1

数据读取和查看

import os
import pandas as pd
path  = '/Users/wuzhengxiang/Documents/DataSets/TextCnn'
os.chdir(path)
data = pd.read_csv('text_all.csv')#对数据进行随机打乱
data = data.sample(frac=1, random_state=42)
print(data.shape)
(19670, 2)#查看0-1的比例,可以看出来,数据集基本上平衡
data['label'].value_counts()
1    9882
0    9788#查看前10行的数据
data.head(10)text  label
1703629526 Q 77544      1
5426                    葩葩葩l      0
14173            网站盘需要买的私聊我.      1
14582               买家秀和卖家秀?0
1730                  1776看v      0
1444              我又没送你谢我干啥ᚠ      0
10439            7645 555620
2448   伽韦 sx111505 珂视频箹   Ku      1
10423            影薇 w2753636      1
11782      胸还没有寒磊的 大ᚠ  还奶子疼!0

三、模型构建

from keras.preprocessing.text import Tokenizer
from keras.preprocessing.text import text_to_word_sequence
from keras.preprocessing.sequence import pad_sequencesfrom keras.models import Model
from keras.models import Sequentialfrom keras.layers import Input, Dense, Embedding, Conv1D, Conv2D, MaxPooling1D, MaxPool2D
from keras.layers import Reshape, Flatten, Dropout, Concatenate
from keras.layers import SpatialDropout1D, concatenate
from keras.layers import GRU, Bidirectional, GlobalAveragePooling1D, GlobalMaxPooling1Dfrom keras.callbacks import Callback
from keras.optimizers import Adamfrom keras.callbacks import ModelCheckpoint, EarlyStopping
from keras.models import load_model
from keras.utils.vis_utils import plot_model#进行分字处理
import os
import pandas as pd
path  = '/Users/wuzhengxiang/Documents/DataSets/TextCnn'
os.chdir(path)
text_all = pd.read_csv('text_all.csv')data = text_all
data['text'] = text_all['text'].apply(lambda x: ' '.join(x))
data.head()x_train, x_test, y_train, y_test=\train_test_split(data['text'], data['label'], test_size=0.2, random_state=42)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)x_train[45]
'\ufeff + C 名 看 P , 是 威 哦 ❤   ❤'MAX_NB_WORDS = 80000
tokenizer=Tokenizer(num_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(x_train)tokenizer.texts_to_sequences([x_train[38]])train_sequences = tokenizer.texts_to_sequences(x_train)
test_sequences  = tokenizer.texts_to_sequences(x_test)MAX_LENGTH = 35
padded_train_sequences = pad_sequences(train_sequences, maxlen=MAX_LENGTH)
padded_test_sequences  = pad_sequences(test_sequences,  maxlen=MAX_LENGTH)padded_train_sequences
array([[  0,   0,   0, ...,   2,   8,   2],[  0,   0,   0, ..., 387, 443,  16],[  0,   0,   0, ...,  64,  59,  11],...,[  0,   0,   0, ...,  27,  27,  27],[  0,   0,   0, ...,   3,   9,  71],[  0,   0,   0, ...,   1,  16,  16]], dtype=int32)
padded_train_sequences.shape
(15736, 35)import numpy as npdef get_simple_rnn_model():embedding_dim = 300embedding_matrix = np.random.random((MAX_NB_WORDS, embedding_dim))inp = Input(shape=(MAX_LENGTH, ))x = Embedding(input_dim = MAX_NB_WORDS, output_dim = embedding_dim, input_length = MAX_LENGTH, weights=[embedding_matrix], trainable=True)(inp)x = SpatialDropout1D(0.3)(x)x = Bidirectional(GRU(100, return_sequences=True))(x)avg_pool = GlobalAveragePooling1D()(x)max_pool = GlobalMaxPooling1D()(x)conc = concatenate([avg_pool, max_pool])outp = Dense(1, activation="sigmoid")(conc)model = Model(inputs=inp, outputs=outp)model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])return model
rnn_simple_model = get_simple_rnn_model()plot_model(rnn_simple_model, #to_file='C:\\Users\\Desktop\\NLP任务实验\\rnn_simple_model.png',show_shapes=True, show_layer_names=True)filepath="weights-improvement-{epoch:02d}-{val_acc:.4f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True,mode='max')batch_size = 256
epochs = 2
history = rnn_simple_model.fit(x = padded_train_sequences, y = y_train, validation_data = (padded_test_sequences, y_test), batch_size = 256, #callbacks=[checkpoint],epochs = 5, verbose=1)#best_rnn_simple_model = load_model('weights-improvement-01-0.8262.hdf5')y_pred_rnn_simple = rnn_simple_model.predict(padded_test_sequences, verbose=1, batch_size=2048)y_pred_rnn_simple = pd.DataFrame(y_pred_rnn_simple, columns=['prediction'])
y_pred_rnn_simple['prediction'] = y_pred_rnn_simple['prediction'].map(lambda p: 1 if p >= 0.5 else 0)#y_pred_rnn_simple.to_csv('./predictions/y_pred_rnn_simple.csv', index=False)
#y_pred_rnn_simple = pd.read_csv('./predictions/y_pred_rnn_simple.csv')print(accuracy_score(y_test, y_pred_rnn_simple))
0.9669547534316217df = pd.DataFrame({'text':x_test,'label':y_test,'pred':y_pred_rnn_simple})
df[df['label']!=df['pred']]

相比于第二个模型(拼音+ngram+逻辑回归)的0.95602,这个一下子就干到了0.9669,可以看到深度学习还是非常勇猛的,在序列领域,RNN有着不可取代的地位。后续我们继续考虑变异情况,再考虑用深度学习来试验,看看能做到多少的准确率。

四、模型解释

1)模型打印

plot_model 可以打印模型的框架,我们的框架如下,可以看到,使用了一个双项的GRU,然后进行了两种不同的池化方式进行池化在拼接起来。

2)模型训练过程

我们可以看看训练过程的损失下降和准确率上升,通过曲线,可以优化我们的训练过程。

import matplotlib.pyplot as plt# 画出损失函数曲线
plt.plot(history.history['loss'],    'bo',)
plt.plot(history.history['accuracy'], 'b',)
plt.title('train loss')plt.ylabel('acc')
plt.xlabel('epoch')plt.legend()# 画出损失函数曲线
plt.plot(history.history['val_loss'],    'bo',)
plt.plot(history.history['val_accuracy'], 'b',)
plt.title('val loss')
plt.ylabel('acc')
plt.xlabel('epoch')
plt.legend()

可以看到整个下降曲线还是很平滑的,如果我们轮数增加,准确率还有上升的可能性,大家可以测试下,有点非机器,一训练就开始发热了,

先写到这里了,大家可以看到,深度学习,对于解决语言问题,还是很有优势的,就这么简简单单的一段代码,准确率有了非常大的提升,后面的文章,我们继续深入研究各种风控识别算法。

基于双向 GRU 的文本分类 Python 算法实战相关推荐

  1. NNDL 实验七 循环神经网络(4)基于双向LSTM的文本分类

    6.4 实践:基于双向LSTM模型完成文本分类任务 电影评论可以蕴含丰富的情感:比如喜欢.讨厌.等等. 情感分析(Sentiment Analysis)是为一个文本分类问题,即使用判定给定的一段文本信 ...

  2. python中文文本分析_基于CNN的中文文本分类算法(可应用于垃圾邮件过滤、情感分析等场景)...

    基于cnn的中文文本分类算法 简介 参考IMPLEMENTING A CNN FOR TEXT CLASSIFICATION IN TENSORFLOW实现的一个简单的卷积神经网络,用于中文文本分类任 ...

  3. 自然语言处理入门实战——基于循环神经网络RNN、LSTM、GRU的文本分类(超级详细,学不会找我!!!)

    1  一.实验过程 1.1  实验目的 通过这个课程项目大,期望达到以下目的: 1.了解如何对 自然语言处理 的数据集进行预处理操作. 2.初识自然语言数据集处理操作的步骤流程. 3.进一步学习RNN ...

  4. 综述:基于深度学习的文本分类 --《Deep Learning Based Text Classification: A Comprehensive Review》总结(一)

    文章目录 综述:基于深度学习的文本分类 <Deep Learning Based Text Classification: A Comprehensive Review>论文总结(一) 总 ...

  5. Datawhale NLP入门:Task5 基于深度学习的文本分类2

    Task5 基于深度学习的文本分类2 在上一章节,我们通过FastText快速实现了基于深度学习的文本分类模型,但是这个模型并不是最优的.在本章我们将继续深入. 基于深度学习的文本分类 本章将继续学习 ...

  6. Task5 基于深度学习的文本分类2

    Task5 基于深度学习的文本分类2 在上一章节,我们通过FastText快速实现了基于深度学习的文本分类模型,但是这个模型并不是最优的.在本章我们将继续深入. 基于深度学习的文本分类 本章将继续学习 ...

  7. Datawhale零基础入门NLP day5/Task5基于深度学习的文本分类2

    基于深度学习的文本分类 本章将继续学习基于深度学习的文本分类. 学习目标 学习Word2Vec的使用和基础原理 学习使用TextCNN.TextRNN进行文本表示 学习使用HAN网络结构完成文本分类 ...

  8. Datawhale零基础入门NLP赛事 - Task5 基于深度学习的文本分类2

    在上一章节,我们通过FastText快速实现了基于深度学习的文本分类模型,但是这个模型并不是最优的.在本章我们将继续深入. 基于深度学习的文本分类 本章将继续学习基于深度学习的文本分类. 学习目标 学 ...

  9. 新闻文本分类--任务5 基于深度学习的文本分类2

    Task5 基于深度学习的文本分类2 在上一章节,我们通过FastText快速实现了基于深度学习的文本分类模型,但是这个模型并不是最优的.在本章我们将继续深入. 基于深度学习的文本分类 本章将继续学习 ...

  10. 自然语言处理入门实战2:基于深度学习的文本分类

    自然语言处理入门实战2:基于深度学习的文本分类 数据集 数据预处理 模型 模型训练 模型测试 参考 本文参考复旦大学自然语言处理入门练习,主要是实现基于深度学习的文本分类. 环境:python3.7 ...

最新文章

  1. es6 日期字符串转日期_量化数据预处理-中文日期(含)转英文日期
  2. 后生可畏!中国军团称霸阅读理解竞赛RACE:微信AI称王,高中生力压腾讯康奈尔联队(附资料)...
  3. php内核一 一次请求与结束
  4. 拯救者linux无法正常关机,Ubuntu无法关机解决办法
  5. 合并的数组会有顺序么_咱就别按顺序刷题了,看看大佬怎么刷
  6. 孙鑫-MFC笔记四--文本编程
  7. 美团员工被指用钓鱼邮件获拼多多薪资;华为回应暂无其它手机厂商接入HarmonyOS;GCC 放弃版权转让政策...
  8. 3D打印发光字与传统工艺发光字的区别具体有哪些?
  9. 移动网优大神VoLTE学习笔记(四):主叫信令流程
  10. python代码美化工具
  11. LCD和LED屏幕的工作原理总结
  12. 反垃圾邮件企业邮箱设置(TXT记录)
  13. 计算机启动显示不正确的分区表,电脑开机黑屏提示无效的分区表如何解决_电脑开不了机显示无效的分区表如何处理...
  14. 生命以负熵为生:Web3行业2022年之怪现象
  15. COB--COF--COG--TAB--TCP
  16. JAVA基础--java简单知识04(类与对象,封装,继承,多态)
  17. C语言-堆栈 什么是栈?一篇文章带你了解…
  18. MiniDao (轻量级JAVA持久层,Hibernate完美助手)
  19. vue中 表头 th 合并单元格,且表格列数不定的动态渲染方法
  20. 行云管家荣膺《中国网络安全行业全景图(第九版)》收录

热门文章

  1. 局域网服务器共享文件夹设置,局域网共享设置如何操作?怎么实现局域网文件夹共享?...
  2. 巧用头条号及悟空问答引流
  3. Google Play安装应用一直在等待下载的解决方案
  4. ABAP学习笔记-基础语法-06-流程控制(01)-条件语句
  5. (深度学习快速入门)人工智能、机器学习和深度学习总体概述
  6. 学写网页 #05# CSS Mastery 笔记 1~3
  7. USB协议详解第20讲(USB包-帧首包SOF)
  8. TCP连接关闭—close和shutdown
  9. 使用flex实现左中右布局,中间自适应
  10. Ring of Elysium 游戏汉化