代码实践 | CNN卷积神经网络之文本分类

前情回顾

戳上方蓝字【阿力阿哩哩的炼丹日常】关注我~

今天继续给大家介绍第四章的内容

前面我们介绍了:

深度学习开端-全连接神经网络

一文掌握CNN卷积神经网络

超参数(Hyperparameters)|  上

超参数(Hyperparameters)|  下

寄己训练寄己|自编码器

通熟易懂RNN|RNN与RNN的变种结构 | 上

通俗易懂LSTM|RNN的变种结构 | LSTM长短期记忆网络

通俗易懂GRU|门控循环单元(gated recurrent unit, GRU)

代码实践 | 全连接神经网络回归---房价预测

代码实践|全连接神经网络与文本分类

4.7

代码实践

4.7.3 CNN卷积神经网络之文本分类

笔者在4.7.2节介绍了神经网络文本分类的招聘信息分类(代码实践|全连接神经网络与文本分类),并介绍了文本在进入神经网络前的预处理工作。今天笔者给大家分享的是CNN卷积神经网络对招聘数据的分类,也同样要对文本进行预处理,所以还没了解文本预处理的读者,可以翻阅4.7.2节。

同样地,我们的招聘数据集也是和上一小节一样。

1. 实验流程 

(1) 加载数据

(2) 数据上标签  

(3) 中文分词

(4) 提取文本关键词

(5) 建立token字典

(6) 使用token字典将“文字”转化为“数字列表”

(7) 截长补短让所有“数字列表”长度都是50 :保证每个文本都是同样的长度,避免不必要的错误。

(8) Embedding层将“数字列表”转化为"向量列表"

(9) 将向量列表送入深度学习模型(CNN卷积神经网络)进行训练

(10)保存模型与模型可视化

(11)模型的预测功能

(12)训练过程可视化

2. 代码

1.  # chapter4/4_7_3_CNN_text.ipynb  
2.  import pandas as pd  
3.  import jieba  
4.  import jieba.analyse as analyse  
5.  from keras.preprocessing.text import Tokenizer  
6.  from keras.preprocessing import sequence  
7.  from keras.models import Sequential  
8.  from keras.layers import Dense, Dropout, Activation, Flatten, MaxPool1D, Conv1D  
9.  from keras.layers.embeddings import Embedding  
10.  from keras.utils import multi_gpu_model  
11.  from keras.models import load_model  
12.  from keras import regularizers  # 正则化  
13.  import matplotlib.pyplot as plt  
14.  import numpy as np  
15.  from keras.utils import plot_model  
16.  from sklearn.model_selection import train_test_split  
17.  from keras.utils.np_utils import to_categorical  
18.  from sklearn.preprocessing import LabelEncoder  
19.  from keras.layers import BatchNormalization

1) 加载数据

1.  job_detail_pd = pd.read_csv('job_detail_dataset.csv', encoding='UTF-8')  
2.  label = list(job_detail_pd['PositionType'].unique())  # 标签  
3.  print(label)  
4.    
5.  # 上标签  
6.  def label_dataset(row):  
7.      num_label = label.index(row)   
8.      return num_label  
9.    
10.  job_detail_pd['label'] = job_detail_pd['PositionType'].apply(label_dataset)  
11.  job_detail_pd = job_detail_pd.dropna()  # 删除空行  
12.  job_detail_pd.head(5)

1.  # 中文分词  
2.  def chinese_word_cut(row):  
3.      return " ".join(jieba.cut(row))  
4.  job_detail_pd['Job_Description_jieba_cut'] = job_detail_pd.Job_Description.apply(chinese_word_cut)  
5.    
6.  # 提取关键词  
7.  def key_word_extract(texts):  
8.      return " ".join(analyse.extract_tags(texts, topK=50, withWeight=False, allowPOS=()))  
9.  job_detail_pd['Job_Description_key_word'] = job_detail_pd.Job_Description.apply(key_word_extract)

2) 训练





1.  # 建立2000个词的字典  
2.  token = Tokenizer(num_words = 2000)   
3.  token.fit_on_texts(job_detail_pd['Job_Description_key_word']) #按单词出现次数排序,排序前2000的单词会列入词典中  
4.    
5.  # 使用token字典将“文字”转化为“数字列表”  
6.  Job_Description_Seq = token.texts_to_sequences(job_detail_pd['Job_Description_key_word'])  
7.    
8.  # 截长补短让所有“数字列表”长度都是50  
9.  Job_Description_Seq_Padding = sequence.pad_sequences(Job_Description_Seq, maxlen=50)  
10.    
11.  x_train = Job_Description_Seq_Padding  
12.  y_train = job_detail_pd['label'].tolist()

3) 开始训练CNN

1.  model = Sequential()  
2.  model.add(Embedding(output_dim = 32,  # 词向量的维度  
3.                    input_dim = 2000,  # Size of the vocabulary 字典大小  
4.                      input_length = 50  # 每个数字列表的长度  
5.                     )    
6.           )  
7.    
8.  model.add(Conv1D(256,  # 输出大小  
9.                   3,   # 卷积核大小  
10.                   padding='same',   
11.                   activation='relu'))  
12.  model.add(MaxPool1D(3,3,padding='same'))  
13.  model.add(Conv1D(32, 3, padding='same', activation='relu'))  
14.  model.add(Flatten())  
15.  model.add(Dropout(0.3))  
16.  model.add(BatchNormalization()) # (批)规范化层  
17.  model.add(Dense(256,activation='relu'))  
18.  model.add(Dropout(0.2))  
19.  model.add(Dense(units = 10,  
20.                  activation = "softmax"))  
21.    
22.  batch_size = 256  
23.  epochs = 5  
24.    
25.  # 单GPU版本  
26.  model.summary()  # 可视化模型  
27.  model.compile(loss = "sparse_categorical_crossentropy",  # 多分类  
28.              optimizer = "adam",  
29.              metrics = ["accuracy"])  
30.    
31.  history = model.fit(  
32.            x_train,   
33.            y_train,  
34.            batch_size=batch_size,  
35.            epochs=epochs,  
36.            validation_split = 0.2  
37.            # 训练集的20%用作验证集  
38.          )

4) 保存模型

1.  from keras.utils import plot_model  
2.  # 保存模型  
3.  model.save('model_CNN_text.h5')  #  生成模型文件 'my_model.h5'  
4.  # 模型可视化  
5.  plot_model(model, to_file='model_CNN_text.png', show_shapes=True)

5) 模型的预测功能

1.  from keras.models import load_model  
2.  # 加载模型  
3.  # model = load_model('model_CNN_text.h5')  
4.  print(x_train[0])  
5.  y_new = model.predict(x_train[0].reshape(1, 50))  
6.  print(list(y_new[0]).index(max(y_new[0])))  
7.  print(y_train[0])

6) 训练过程可视化

1.  import matplotlib.pyplot as plt  
2.  # 绘制训练 & 验证的准确率值  
3.  plt.plot(history.history['acc'])  
4.  plt.plot(history.history['val_acc'])  
5.  plt.title('Model accuracy')  
6.  plt.ylabel('Accuracy')  
7.  plt.xlabel('Epoch')  
8.  plt.legend(['Train', 'Valid'], loc='upper left')  
9.  plt.savefig('Valid_acc.png')  
10.  plt.show()  
11.    
12.  # 绘制训练 & 验证的损失值  
13.  plt.plot(history.history['loss'])  
14.  plt.plot(history.history['val_loss'])  
15.  plt.title('Model loss')  
16.  plt.ylabel('Loss')  
17.  plt.xlabel('Epoch')  
18.  plt.legend(['Train', 'Valid'], loc='upper left')  
19.  plt.savefig('Valid_loss.png')  
20.  plt.show()

3. 结果分析

在迭代了1个epochs之后,验证集的损失loss和acc,趋于平稳,这时,我们得到的模型已经是最优的了。所以讲epoch设置为1即可。

下一期,我们将继续介绍

CNN卷积神经网络|图像分类

happy valentine's day~

 

关注我的微信公众号~不定期更新相关专业知识~

内容 |阿力阿哩哩 

编辑 | 阿璃 

点个“在看”,作者高产似那啥~

发布了76 篇原创文章 · 获赞 5 · 访问量 6223

猜你喜欢

转载自blog.csdn.net/Chile_Wang/article/details/104322578