基于IMDB评论数据集的情感分析

文章目录

前言

本文的主要内容是基于IMDB评论数据集的情感分析,文中包括大型电影评论数据集介绍、环境配置、实验代码、运行结果以及遇到的问题这几个部分,该实验采用了多层感知器 (MLP)、递归神经网络 (RNN) 和长短期记忆 (LSTM) 等深度学习模型分别进行了测试,其中长短期记忆模型效果最好,测试准确率达到了86.4%。

一、大型影评数据集介绍

[En]

I. introduction of large-scale film review data sets

大型电影评论数据集(Large Movie Review Dataset):点此跳转下载
该数据集是一个用于二元情感分类的数据集,即它既包含正面评论又包含负面评论,并且包含的数据比之前的基准数据集多得多。有25000个用于培训的高度极端的电影评论,25000个用于测试的评论,以及一些可用的未标记的数据。

[En]

The data set is a data set for binary emotion classification, that is, it contains both positive and negative reviews, and contains much more data than the previous benchmark data set. There are 25000 highly polar film reviews for training, 25000 for testing, and some untagged data available.

从下载的数据集中解压的文件如下图所示。

[En]

The files that are unzipped from the downloaded dataset are shown in the following figure.

基于IMDB评论数据集的情感分析
test文件夹下包含的文件信息如下,其中neg文件夹下包含12500条负面评价,pos文件夹下包含12500条正面评价。
基于IMDB评论数据集的情感分析
train文件夹下包含的文件信息如下,其中neg文件夹下包含12500条负面评价,pos文件夹下包含12500条正面评价,unsup文件夹下包含50000条未标记的评价可供使用。
基于IMDB评论数据集的情感分析

; 二、环境配置

本实验在上一个实验:基于 PyTorch 的 cifar-10 图像分类 环境配置的基础上再安装 tensorflow 和 keras 即可,我这里安装的 tensorflow 版本是2.1.0,keras版本是2.3.1,安装适应自己环境的版本即可。
Tensorflow是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习算法的编程实现。Tensorflow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算。
Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,它试图简化复杂算法的实现难度。Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型。在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件。

三、实验模型及流程

1.实验模型

本实验采用的模型包括多层感知器 (MLP)、递归神经网络 (RNN) 和长短期记忆 (LSTM) 深度学习模型,模型的具体介绍如下。
多层感知器又称前馈神经网络。它的最低层是输入层,中间层是隐藏层,顶层是输出层,各层完全相连。其结构图如下图所示。

[En]

Multilayer perceptron is also called feedforward neural network. Its lowest layer is the input layer, the middle layer is the hidden layer, the top layer is the output layer, and the layers are fully connected. Its structure diagram is shown in the following figure.

基于IMDB评论数据集的情感分析
多层前馈神经网络的结构如下图所示。
[En]

The structure of the multi-layer feedforward neural network is shown in the following figure.

基于IMDB评论数据集的情感分析
递归神经网络是循环神经网络在有向无环图上的推广。递归神经网络的总体结构为树状递阶结构。下图是递归神经网络的一般结构和退化结构示意图。
[En]

Recurrent neural network is the extension of cyclic neural network on directed acyclic graph. The general structure of recurrent neural network is tree-like hierarchical structure. The following figure is a schematic diagram of the general structure and degenerate structure of the recurrent neural network.

基于IMDB评论数据集的情感分析
在一般结构中,隐藏层h1由两个输入层x1和x2计算得到,h2由另外两个输入层x3和x4计算得到,h3由两个隐藏层h1和h2计算得到。
当递归神经网络的结构简化为线性序列结构时,递归神经网络等价于简单的循环网络。
[En]

When the structure of the recurrent neural network is reduced to a linear sequence structure, the recurrent neural network is equivalent to a simple cyclic network.

长短期记忆是一种时间循环神经网络,它是为了解决一般的循环神经网络存在的长期依赖问题而专门设计出来的,可以有效地解决简单循环神经网络的梯度爆炸或消失问题。下图是LSTM网络的循环单元结构。

基于IMDB评论数据集的情感分析
LSTM网络引入门控机制(Gating Mechanism)来控制信息传递的路径,遗忘门𝒇𝑡 、输入门𝒊𝑡和输出门𝒐𝑡 的作用分别为:遗忘门𝒇𝑡 控制上一个时刻的内部状态𝒄𝑡−1 需要遗忘多少信息;输入门𝒊𝑡控制当前时刻的候选状态𝒄𝑡̃ 有多少信息需要保存;输出门𝒐𝑡 控制当前时刻的内部状态𝒄𝑡 有多少信息需要输出给外部状态𝒉𝑡。
当𝒇𝑡 = 0, 𝒊𝑡 = 1时,记忆单元将历史信息清空,并将候选状态向量𝒄𝑡̃ 写入,但此时记忆单元𝒄𝑡 依然和上一时刻的历史信息相关;当𝒇𝑡 = 1, 𝒊𝑡 = 0 时,记忆单元将复制上一时刻的内容,不写入新的信息。
LSTM网络的循环单元结构的计算过程如下:
1)首先利用上一时刻的外部状态𝒉𝑡−1和当前时刻的输入𝒙𝑡,计算出三个门和候选状态𝒄𝑡̃ ;
2)结合遗忘门𝒇𝑡 和输入门𝒊𝑡 来更新记忆单元𝒄𝑡;
3)结合输出门𝒐𝑡,将内部状态的信息传递给外部状态𝒉𝑡。

; 2.实验流程

此实验的一般流程如下图所示。

[En]

The general flow of this experiment is shown in the following figure.

基于IMDB评论数据集的情感分析

四、实验代码

该实验采用了多层感知器 (MLP)、递归神经网络 (RNN) 和长短期记忆 (LSTM) 深度学习模型,代码如下。

1.多层感知器模型代码

基于多层感知器模型的代码如下。

[En]

The code based on the multilayer perceptron model is as follows.


import urllib.request
import os
import tarfile
import re
import numpy as np
import matplotlib.pyplot as plt
from keras.preprocessing.text import Tokenizer
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.embeddings import Embedding

url = "http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
filepath = r"G:\PycharmProjects\aclImdb_v1.tar.gz"
if not os.path.isfile(filepath):
    result = urllib.request.urlretrieve(url, filepath)
    print('downloaded:', result)

if not os.path.exists(r"G:\PycharmProjects\aclImdb"):
    tfile = tarfile.open(filepath, 'r:gz')
    result = tfile.extractall(r"G:/PycharmProjects/")

def rm_tags(text):
    re_tag = re.compile(r']+>')
    return re_tag.sub('', text)

def read_file(filetype):
    path = "G:/PycharmProjects/aclImdb/"
    file_list = []

    positive_path = path + filetype + '/pos/'
    for f in os.listdir(positive_path):
        file_list += [positive_path + f]

    negative_path = path + filetype + '/neg/'
    for f in os.listdir(negative_path):
        file_list += [negative_path + f]

    print('read', filetype, 'files:', len(file_list))

    all_labels = ([1] * 12500 + [0] * 12500)
    all_texts = []

    for fi in file_list:
        with open(fi, encoding='utf8') as file_input:

            all_texts += [rm_tags(" ".join(file_input.readlines()))]
    return all_labels, all_texts

y_train, train_text = read_file("train")
y_test, train_test = read_file("test")

y_train = np.array(y_train)
y_test = np.array(y_test)
test_text = train_test

token = Tokenizer(num_words=2000)

token.fit_on_texts(train_text)

x_train_seq = token.texts_to_sequences(train_text)
x_test_seq = token.texts_to_sequences(test_text)

x_train = sequence.pad_sequences(x_train_seq, maxlen=100)
x_test = sequence.pad_sequences(x_test_seq, maxlen=100)

model = Sequential()
model.add(Embedding(output_dim=32, input_dim=2000, input_length=100))

model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(units=256, activation='relu'))
model.add(Dropout(0.35))
model.add(Dense(units=1, activation='sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

train_history=model.fit(x=x_train, y=y_train, validation_split=0.2, epochs=10, batch_size=300, verbose=1)

def show_train_history(train_history, train, validation):
    plt.plot(train_history.history[train])
    plt.plot(train_history.history[validation])
    plt.title('Train History')
    plt.ylabel(train)
    plt.xlabel('Epoch')
    plt.legend(['train', 'validation'], loc='upper left')
    plt.show()

show_train_history(train_history, 'accuracy', 'val_accuracy')
show_train_history(train_history, 'loss', 'val_loss')

scores = model.evaluate(x_test, y_test)
print(scores)
print('Test loss: ', scores[0])
print('Test accuracy: ', scores[1])

2.递归神经网络模型代码

基于递归神经网络模型的代码如下。

[En]

The code based on the recurrent neural network model is as follows.


import urllib.request
import os
import tarfile
import re
import numpy as np
import matplotlib.pyplot as plt
from keras.preprocessing.text import Tokenizer
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import SimpleRNN

url = "http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
filepath = r"G:\PycharmProjects\aclImdb_v1.tar.gz"
if not os.path.isfile(filepath):
    result = urllib.request.urlretrieve(url, filepath)
    print('downloaded:', result)

if not os.path.exists(r"G:\PycharmProjects\aclImdb"):
    tfile = tarfile.open(filepath, 'r:gz')
    result = tfile.extractall(r"G:/PycharmProjects/")

def rm_tags(text):
    re_tag = re.compile(r']+>')
    return re_tag.sub('', text)

def read_file(filetype):
    path = "G:/PycharmProjects/aclImdb/"
    file_list = []

    positive_path = path + filetype + '/pos/'
    for f in os.listdir(positive_path):
        file_list += [positive_path + f]

    negative_path = path + filetype + '/neg/'
    for f in os.listdir(negative_path):
        file_list += [negative_path + f]

    print('read', filetype, 'files:', len(file_list))

    all_labels = ([1] * 12500 + [0] * 12500)
    all_texts = []

    for fi in file_list:
        with open(fi, encoding='utf8') as file_input:

            all_texts += [rm_tags(" ".join(file_input.readlines()))]
    return all_labels, all_texts

y_train, train_text = read_file("train")
y_test, train_test = read_file("test")

y_train = np.array(y_train)
y_test = np.array(y_test)
test_text = train_test

token = Tokenizer(num_words=2000)

token.fit_on_texts(train_text)

x_train_seq = token.texts_to_sequences(train_text)
x_test_seq = token.texts_to_sequences(test_text)

x_train = sequence.pad_sequences(x_train_seq, maxlen=380)
x_test = sequence.pad_sequences(x_test_seq, maxlen=380)

model = Sequential()
model.add(Embedding(output_dim=32, input_dim=3800, input_length=380))

model.add(Dropout(0.35))
model.add(SimpleRNN(16))
model.add(Dense(units=256, activation='relu'))
model.add(Dropout(0.35))
model.add(Dense(units=1, activation='sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

train_history = model.fit(x=x_train, y=y_train, validation_split=0.2, epochs=10, batch_size=300, verbose=1)

def show_train_history(train_history, train, validation):
    plt.plot(train_history.history[train])
    plt.plot(train_history.history[validation])
    plt.title('Train History')
    plt.ylabel(train)
    plt.xlabel('Epoch')
    plt.legend(['train', 'validation'], loc='upper left')
    plt.show()

show_train_history(train_history, 'accuracy', 'val_accuracy')
show_train_history(train_history, 'loss', 'val_loss')

scores = model.evaluate(x_test, y_test)
print(scores)
print('Test loss: ', scores[0])
print('Test accuracy: ', scores[1])

3.长短期记忆模型代码

基于长期和短期记忆模型的代码如下。

[En]

The code based on the long-and short-term memory model is as follows.


import urllib.request
import os
import tarfile
import re
import numpy as np
import matplotlib.pyplot as plt
from keras.preprocessing.text import Tokenizer
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM

url = "http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
filepath = r"G:\PycharmProjects\aclImdb_v1.tar.gz"
if not os.path.isfile(filepath):
    result = urllib.request.urlretrieve(url, filepath)
    print('downloaded:', result)

if not os.path.exists(r"G:\PycharmProjects\aclImdb"):
    tfile = tarfile.open(filepath, 'r:gz')
    result = tfile.extractall(r"G:/PycharmProjects/")

def rm_tags(text):
    re_tag = re.compile(r']+>')
    return re_tag.sub('', text)

def read_file(filetype):
    path = "G:/PycharmProjects/aclImdb/"
    file_list = []

    positive_path = path + filetype + '/pos/'
    for f in os.listdir(positive_path):
        file_list += [positive_path + f]

    negative_path = path + filetype + '/neg/'
    for f in os.listdir(negative_path):
        file_list += [negative_path + f]

    print('read', filetype, 'files:', len(file_list))

    all_labels = ([1] * 12500 + [0] * 12500)
    all_texts = []

    for fi in file_list:
        with open(fi, encoding='utf8') as file_input:

            all_texts += [rm_tags(" ".join(file_input.readlines()))]
    return all_labels, all_texts

y_train, train_text = read_file("train")
y_test, train_test = read_file("test")

y_train = np.array(y_train)
y_test = np.array(y_test)
test_text = train_test

token = Tokenizer(num_words=2000)

token.fit_on_texts(train_text)

x_train_seq = token.texts_to_sequences(train_text)
x_test_seq = token.texts_to_sequences(test_text)

x_train = sequence.pad_sequences(x_train_seq, maxlen=380)
x_test = sequence.pad_sequences(x_test_seq, maxlen=380)

model = Sequential()
model.add(Embedding(output_dim=32, input_dim=3800, input_length=380))

model.add(Dropout(0.2))
model.add(LSTM(32))
model.add(Dense(units=256, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(units=1, activation='sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

train_history = model.fit(x=x_train, y=y_train, validation_split=0.2, epochs=10, batch_size=300, verbose=1)

def show_train_history(train_history, train, validation):
    plt.plot(train_history.history[train])
    plt.plot(train_history.history[validation])
    plt.title('Train History')
    plt.ylabel(train)
    plt.xlabel('Epoch')
    plt.legend(['train', 'validation'], loc='upper left')
    plt.show()

show_train_history(train_history, 'accuracy', 'val_accuracy')
show_train_history(train_history, 'loss', 'val_loss')

scores = model.evaluate(x_test, y_test)
print(scores)
print('Test loss: ', scores[0])
print('Test accuracy: ', scores[1])

五、实验结果

1.多层感知器模型运行结果

多层感知器模型参数的训练如下图所示。

[En]

The training of multilayer perceptron model parameters is shown in the following figure.

基于IMDB评论数据集的情感分析
多层感知器模型的精度随学习周期变化的折线图。
[En]

A line chart in which the accuracy of the multilayer perceptron model varies with the learning cycle.

基于IMDB评论数据集的情感分析
一种折线图,其中多层感知器模型的损失函数值随学习周期而变化。
[En]

A line chart in which the value of the loss function of the multilayer perceptron model varies with the learning cycle.

基于IMDB评论数据集的情感分析
多层感知器模型的最终测试损失函数值和测试精度。
[En]

The final test loss function value and test accuracy of the multi-layer perceptron model.

基于IMDB评论数据集的情感分析

; 2.递归神经网络模型运行结果

递归神经网络模型参数的训练如下图所示。

[En]

The training of recurrent neural network model parameters is shown in the following figure.

基于IMDB评论数据集的情感分析
递归神经网络模型的精度随学习周期变化的折线图。
[En]

The line chart in which the accuracy of the recurrent neural network model varies with the learning cycle.

基于IMDB评论数据集的情感分析
一种折线图,其中递归神经网络模型的损失函数值随学习周期而变化。
[En]

A line chart in which the value of the loss function of a recurrent neural network model varies with the learning cycle.

基于IMDB评论数据集的情感分析
最终测试回归神经网络模型的损失函数值和测试精度。
[En]

The final test loss function value and test accuracy of the recurrent neural network model.

基于IMDB评论数据集的情感分析

3.长短期记忆模型运行结果

长时和短时记忆模型参数的训练如下图所示。

[En]

The training of long-term and short-term memory model parameters is shown in the following figure.

基于IMDB评论数据集的情感分析
长时和短时记忆模型的准确性随学习周期而变化的折线图。
[En]

The line chart in which the accuracy of the long-term and short-term memory model varies with the learning cycle.

基于IMDB评论数据集的情感分析
长时和短时记忆模型的损失函数值随学习周期变化的折线图。
[En]

The line chart in which the value of the loss function of the long-term and short-term memory model varies with the learning cycle.

基于IMDB评论数据集的情感分析
最后对长期记忆模型和短期记忆模型的损失函数值和检验精度进行了检验。
[En]

The final test loss function value and test accuracy of the long-term and short-term memory model.

基于IMDB评论数据集的情感分析
实验结果表明,多层感知器模型的测试正确率为82.01%,回归神经网络模型的正确率为82.79%,长期和短期记忆模型的正确率为86.39%。其中,长时记忆模型和短时记忆模型的测试准确率是三个模型中最高的。
[En]

Through the experimental results of these models, the test accuracy of multilayer perceptron model is 82.01%, that of recurrent neural network model is 82.79%, and that of long-term and short-term memory model is 86.39%. Among them, the test accuracy of long-term and short-term memory model is the highest of the three models.

; 六、遇到的问题

在环境中安装tensorflow时,直接使用下面命令安装时不太行,Solving environment一直在转动,不会出现done。

conda install tensorflow

所以我先使用下面的命令检查所有的tensorflow版本。

anaconda show anaconda/tensorflow

输出结果如下图所示。

基于IMDB评论数据集的情感分析
再选择和自己python版本相兼容的tensorflow版本进行安装,命令如下。

conda install –channel https://conda.anaconda.org/anaconda tensorflow=2.1.0

第二个错误是运行程序后出现错误:Warning! HDF5 library version mismatched error
解决方法:先后使用下面两条命令,先卸载h5py,再安装与环境兼容的h5py版本。

pip uninstall h5py
pip install h5py

总结

以上就是基于IMDB评论数据集情感分析的所有内容了,找到合适的开源代码并配置正确的环境是在自己电脑上成功运行代码的关键一环,希望本文对你的学习有所帮助!
参考网址:
TensorFlow 百度百科
Keras 百度百科
IMDb网络电影数据集处理与LSTM情感分析
参考代码:点此跳转

Original: https://blog.csdn.net/weixin_42570192/article/details/125162583
Author: 西岸贤
Title: 基于IMDB评论数据集的情感分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/496182/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球