【实训目的】
通过本次实训,要求了解第三工具包的应用,同时了解深度学习算法中循环神经网络在自然语言处理中的应用。
【实训环境】
PyCharm环境、Python 3.7、Pandas、NumPy、Matplotlib、scikit-learn、TensorFlow、Keras
【实训内容】使用循环神经网络识别IMDB影评数据的情感
IMDB评论数据进行情感分析有很多的应用场景。比如:做一个电商网站,卖家需要时刻关心用户对于商品的评论是否是正面的。再比如做一个电影的宣传和策划,电影在观众中的口碑也至关重要。
IMDB是电影评论情感数据,这些数据标识有情感标签(正面/负面)。数据包含50000条电影评论,其中有25000条训练数据以及25000条评估数据,有着相同数量的正面与负面评论。IMDB中的数据已经被预处理好,为整数序列,每个整数代表着一个特定单词。用0和1来确定label的种类。其中0表示负面影评,1表示正面影评。
对IMDB中的电影评论进行分类,是一个二分类的问题,这是一种重要且广泛适用的机器学习问题。其参考代码如下所示:
| import numpy as np import pandas as pd from keras.preprocessing import sequence from keras.models import Sequential from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional from keras.datasets import imdb from sklearn.metrics import accuracy_score,classification_report # Max features are limited max_features = 15000 # 设置最大特征为15000 max_len = 300 #单个句子最大长度为300 batch_size = 64#每个批次大小 # 加载数据 (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features) print(len(x_train), 'train observations') print(len(x_test), 'test observations') # 使得数据长度保持一致 x_train_2 = sequence.pad_sequences(x_train, maxlen=max_len) x_test_2 = sequence.pad_sequences(x_test, maxlen=max_len) print('x_train shape:', x_train_2.shape) print('x_test shape:', x_test_2.shape) y_train = np.array(y_train) y_test = np.array(y_test) # 构建模型 model = Sequential() model.add(Embedding(max_features, 128, input_length=max_len)) model.add(LSTM(64)) model.add(Dense(1, activation='sigmoid')) model.compile('adam', 'binary_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train_2, y_train,batch_size=batch_size,epochs=4,validation_split=0.2) # 模型预测 y_train_predclass = model.predict_classes(x_train_2,batch_size=100) y_test_predclass = model.predict_classes(x_test_2,batch_size=100) y_train_predclass.shape = y_train.shape y_test_predclass.shape = y_test.shape # 输出模型评估结果 print (("\nLSTM Bidirectional Sentiment Classification - Test accuracy:"),(round(accuracy_score(y_test,y_test_predclass),3))) print ("\nLSTM Bidirectional Sentiment Classification of Test data\n",classification_report(y_test, y_test_predclass)) print ("\nLSTM Bidirectional Sentiment Classification - Test Confusion Matrix\n\n",pd.crosstab(y_test, y_test_predclass,rownames = ["Actuall"],colnames = ["Predicted"])) |
运行过程数据如下所示:

运行结果如下所示,其中测试集的预测精确率约为84.2%。

根据以上运行结果,选择更为合适的参数以期获得更好的结果。