当前位置:   article > 正文

【Python文本数据系列】使用TextCNN模型进行文本情感分析(案例+源码)_textcnn情感分析实验

textcnn情感分析实验

这是我的第273篇原创文章。

一、引言

当使用深度学习处理文本分类任务时,遵循的流程如下:

  • 首先,准备数据,而且数据量要大,才能发挥神经网络的优势;

  • 再者,进行文本预处理,将文本数据转化成向量化数据,划分训练集、验证集和测试集;

  • 其次,依据分析目标选择合适的神经网络模型,搭建网络、进行参数设置;

  • 最后,训练模型,通过评估指标确定模型效果。

本文基于具体的实例采用TextCNN(利用卷积神经网络对文本进行分类的算法)模型进行文本情感分析。

二、实现过程

2.1 准备数据

读取数据:

  1. reviews = pd.read_csv('dataset.csv')
  2. print(reviews.head())

图片

2.2 文本预处理

将影评情感转为0和1的数值,并将影评和情感转化为numpy数组:

  1. reviews['sentiment'] = np.where(reviews['sentiment'] == 'positive', 1, 0)
  2. sentences = reviews['review'].to_numpy()
  3. labels = reviews['sentiment'].to_numpy()

划分训练集和测试集:

  1. X_train, X_test, y_train, y_test = train_test_split(sentences, labels, test_size=0.25)
  2. print("Training Data Input Shape: ", X_train.shape)
  3. print("Training Data Output Shape: ", y_train.shape)
  4. print("Testing Data Input Shape: ", X_test.shape)
  5. print("Testing Data Output Shape: ", y_test.shape)

构建分词器,构建单词索引,将字符串转化成整数索引组成的列表:

  1. vocab_size = 10000
  2. oov_tok = "<OOV>"
  3. tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok)
  4. tokenizer.fit_on_texts(X_train)
  5. train_sequences = tokenizer.texts_to_sequences(X_train)

将整数列表转化为二维数值张量,相同的操作对测试集再执行一遍:

  1. sequence_length = 200
  2. train_padded = pad_sequences(train_sequences, maxlen=sequence_length, padding='post', truncating='post')
  3. test_sequences = tokenizer.texts_to_sequences(X_test)
  4. test_padded = pad_sequences(test_sequences, maxlen=sequence_length, padding='post', truncating='post')

2.3 模型搭建

使用Model类定义TextCNN模型:

  1. embedding_dim = 16
  2. lstm_out = 32
  3. inputs = Input(name='inputs',shape=[sequence_length], dtype='float64')
  4. ## 词嵌入使用预训练的词向量
  5. layer = Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=sequence_length)(inputs)
  6. ## 词窗大小分别为3,4,5
  7. cnn1 = Convolution1D(256, 3, padding='same', strides = 1, activation='relu')(layer)
  8. cnn1 = MaxPool1D(pool_size=4)(cnn1)
  9. cnn2 = Convolution1D(256, 4, padding='same', strides = 1, activation='relu')(layer)
  10. cnn2 = MaxPool1D(pool_size=4)(cnn2)
  11. cnn3 = Convolution1D(256, 5, padding='same', strides = 1, activation='relu')(layer)
  12. cnn3 = MaxPool1D(pool_size=4)(cnn3)
  13. # 合并三个模型的输出向量
  14. cnn = concatenate(...)
  15. flat = Flatten()(...)
  16. drop = Dropout(0.2)(flat)
  17. main_output = Dense(1, activation='sigmoid')(drop)
  18. model = Model(inputs=inputs, outputs=main_output)
  19. model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

2.4 模型训练及评估

模型自动判断迭代次数,防止过拟合,然后开始模型训练和测试:

  1. checkpoint_filepath = os.getcwd()
  2. model_checkpoint_callback = ModelCheckpoint(filepath=checkpoint_filepath, save_weights_only=False, monitor='val_loss', mode='min', save_best_only=True)
  3. callbacks = [EarlyStopping(patience=2), model_checkpoint_callback]
  4. history = model.fit(train_padded, y_train, epochs=10, validation_data=(test_padded, y_test), callbacks=callbacks)
  5. metrics_df = pd.DataFrame(history.history)
  6. print(metrics_df)

图片

打印模型结果,可以看到我们定义的是迭代10次,实际上4次之后就过拟合了。所以,在没有进行网络参数调优的情况下,获得了87%的准确率,深度学习的能力确实是非常惊艳。

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号