龙空技术网

小白学AI之深度学习:如何用Python keras分析影评的情绪倾向

python小白社区 69

前言:

而今朋友们对“基于python的影评数据分析”大致比较注重,你们都需要了解一些“基于python的影评数据分析”的相关资讯。那么小编同时在网上搜集了一些关于“基于python的影评数据分析””的相关文章,希望你们能喜欢,兄弟们快快来学习一下吧!

Keras是目前最受欢迎的深度学习库之一,为人工智能的商品化做出了巨大贡献。它使用简单,只需几行代码即可构建强大的神经网络。在这篇文章中,您将了解如何使用Keras构建神经网络,通过将用户评论分为两类:正面或负面来预测用户评论的情绪。这称为情感分析,我们将使用着名的imdb评论数据集。我们将构建的模型也可以应用于其他机器学习问题,只需进行一些更改。

请注意,不会详细介绍Keras或Deep Learning。本文旨在为您提供Keras神经网络的蓝图,并使您熟悉其实施。

目录:

什么是Keras?什么是情感分析?imdb数据集导入依赖项并获取数据探索数据数据准备建立和培训模型

什么是Keras?

Keras是一个开源的python库,可以让您轻松构建神经网络。该库能够在TensorFlow,Microsoft Cognitive Toolkit,Theano和MXNet之上运行。Tensorflow和Theano是Python中用于构建深度学习算法的最常用数值平台,但它们可能非常复杂且难以使用。相比之下,Keras提供了一种简单方便的方法来构建深度学习模型。它的创建者FrançoisChollet开发了它,使人们能够尽可能快速,轻松地构建神经网络。他把重点放在可扩展性,模块化,极简主义和python的支持上。Keras可以与GPU和CPU一起使用,它支持Python 2和3.Google Keras为深度学习和人工智能的商品化做出了巨大贡献,因为它已经商品化了强大的功能,

什么是情感分析?

通过情感分析,我们想要确定例如关于文档,交互或事件的说话者或作者的态度(例如情绪)。因此,需要理解文本是一种自然的语言处理问题,以预测潜在的意图。情绪主要分为积极,消极和中性两类。通过使用情感分析,我们希望根据他撰写的关于产品的评论来预测客户对产品的看法和态度。因此,情感分析广泛应用于评论,调查,文档等等。

imdb数据集

imdb数据集

imdb情绪分类数据集包含来自imdb用户的50,000个电影评论,这些评论被标记为正(1)或负(0)。对评论进行预处理,并将每个评论编码为整数形式的单词索引序列。评论中的单词由其在数据集中的整体频率编制索引。例如,整数“2”编码数据中第二个最常用的字。50,000条评论分为25,000条培训和25,000条测试。该数据集由斯坦福大学的研究人员创建,并于2011年在一篇论文中发表,他们的准确率达到88.89%。它也被用于2011年的“Bag of Words Meets Bags of Popcorn”Kaggle比赛中。

导入依赖项并获取数据

通过导入所需的依赖,预处理数据,并建立的模型。

%matplotlib inlineimport matplotlibimport matplotlib.pyplot as pltimport numpy as npfrom keras.utils import to_categoricalfrom keras import modelsfrom keras import layers

接下来下载imdb数据集,幸运的是已经内置到Keras中。由于我们不希望进行50/50平分测试拆分,因此会在下载后立即将数据合并到数据和目标中,

以便稍后可以进行80/20拆分。

from keras.datasets import imdb(training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000)data = np.concatenate((training_data, testing_data), axis=0)targets = np.concatenate((training_targets, testing_targets), axis=0)

探索数据

现在可以开始探索数据集了:

print("Categories:", np.unique(targets))print("Number of unique words:", len(np.unique(np.hstack(data))))Categories: [0 1]Number of unique words: 9998length = [len(i) for i in data]print("Average Review length:", np.mean(length))print("Standard Deviation:", round(np.std(length)))Average Review length: 234.75892Standard Deviation: 173.0

可以在上面的输出中看到,数据集被标记为两个类别,0或1,表示评论的情绪。整个数据集包含9998个不同的单词,平均每个评论长度为234个单词,标准差为173个单词。

现在来看一个单一的训练示例:

print("Label:", targets[0])Label: 1print(data[0])[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

在上面,可以看到数据集的第一个评论,标记为正数(1)。下面的代码检索字典映射字索引回原始单词,以便我们可以读取它们。

它用“#”替换每个未知单词。它通过使用get_word_index()函数完成此操作。

index = imdb.get_word_index()reverse_index = dict([(value, key) for (key, value) in index.items()]) decoded = " ".join( [reverse_index.get(i - 3, "#") for i in data[0]] )print(decoded) # this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert # is an amazing actor and now the same being director # father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for # and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also # to the two little boy's that played the # of norman and paul they were just brilliant children are often left out of the # list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all

数据准备

现在是时候准备我们的数据了。将对每个评论进行矢量化并用零填充它,以便它包含正好10,000个数字。这意味着用零填充每个短于10,000的评论。这样做是因为最大的评论几乎就是这么长,我们的神经网络的每个输入都需要具有相同的大小。(所谓的数据规整)还将目标转换为浮点数。

def vectorize(sequences, dimension = 10000): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1return results data = vectorize(data)targets = np.array(targets).astype("float32")

现在将数据分成训练和测试集。培训集将包含40,000条评论,测试集10,000条。(如何理解训练集呢,可以理解为教小孩学习的教材,测试集就是考卷,用来评估小孩的学习效果的)

test_x = data [:10000] test_y = targets [:10000]train_x = data [10000:] train_y = targets [10000:]

建立和培训模型

现在可以建立简单的神经网络。首先定义我们想要构建的模型类型。

Keras中有两种类型的模型:Sequential模型和像使用功能API一样的Model类。

然后简单地添加输入层,隐藏层和输出层。在隐藏层和输出层之间,正在使用dropout来防止过度拟合。请注意,应始终使用20%到50%之间的dropout。

在每一层,我们使用“Dense”,这意味着单元完全连接。

在隐藏层中,使用relu函数,因为这始终是一个良好的开端,并且在大多数情况下产生令人满意的结果。(我是这么理解的,深度学习需要将线性数据变成非线性的数据,所以需要这么不太线性的处理函数来进行数据转换)随意尝试其他激活功能。

在输出层,使用sigmoid函数,它将值映射到0和1.请注意,在输入层将输入形状设置为10,000,因为我们的评论长度为10,000个整数。输入层需要10,000作为输入,并以50的形状输出。

最后,在Keras中打印出刚刚建立的模型的摘要model.summary()

# Input - Layermodel.add(layers.Dense(50, activation = "relu", input_shape=(10000, )))# Hidden - Layersmodel.add(layers.Dropout(0.3, noise_shape=None, seed=None))model.add(layers.Dense(50, activation = "relu")model.add(layers.Dropout(0.2, noise_shape=None, seed=None))model.add(layers.Dense(50, activation = "relu"))# Output- Layermodel.add(layers.Dense(1, activation = "sigmoid"))model.summary()model.summary()_________________________________________________________________Layer (type) Output Shape Param # =================================================================dense_1 (Dense) (None, 50) 500050 _________________________________________________________________dropout_1 (Dropout) (None, 50) 0 _________________________________________________________________dense_2 (Dense) (None, 50) 2550 _________________________________________________________________dropout_2 (Dropout) (None, 50) 0 _________________________________________________________________dense_3 (Dense) (None, 50) 2550 _________________________________________________________________dense_4 (Dense) (None, 1) 51 =================================================================Total params: 505,201Trainable params: 505,201Non-trainable params: 0_________________________________________________________________

现在需要编译定义的模型,这只是为训练配置模型。使用“adam”优化器。优化器是在训练期间改变权重和偏差的算法。还选择二元 - 交叉熵作为损失(因为我们处理二进制分类)和准确性作为评估指标。

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

现在就可以开始训练模型了。

使用500的batch_size并且仅用于两个时期,因为认识到如果训练更长时间,模型会过度拟合。好比孩子学多了特定的教材,没接触社会,即使考试好,以后能力也不行:-)。

批量大小定义将通过网络传播的样本数,而时期是整个训练数据的迭代。通常,al arger批量大小会导致更快的训练,但并不总是快速收敛。较小的批量大小在训练中较慢,但它可以更快地收敛。这些设定参数是依赖于具体问题的,所以您需要尝试一些不同的值。如果您是第一次遇到问题,建议您首先使用32的批量大小,这是标准大小。

results = model.fit(train_x,train_y,epochs = 2,batch_size = 500,validation_data =(test_x,test_y))训练40000个样本,验证10000个样本Epoch 1/2 40000/40000 [==============================] - 5s 129us /步 - 损失:0.4051 - acc:0.8212 - val_loss:0.2635 - val_acc:0.8945 Epoch 2/2 40000/40000 [======================= =======] - 4s 90us /步 - 损失:0.2122 - acc:0.9190 - val_loss:0.2598 - val_acc:0.8950

是时候评估我们的模型了:

print(np.mean(results.history [ “val_acc”]))0.894750000536

真棒!有了这个简单的模型,已经超过了很多数据高手2011年的顶尖研究成果。

随意尝试超参数和层数。

可以在下面看到整个模型的代码:

import numpy as npfrom keras.utils import to_categoricalfrom keras import modelsfrom keras import layersfrom keras.datasets import imdb(training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000)data = np.concatenate((training_data, testing_data), axis=0)targets = np.concatenate((training_targets, testing_targets), axis=0)def vectorize(sequences, dimension = 10000): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1 return results data = vectorize(data)targets = np.array(targets).astype("float32")test_x = data[:10000]test_y = targets[:10000]train_x = data[10000:]train_y = targets[10000:]model = models.Sequential()# Input - Layermodel.add(layers.Dense(50, activation = "relu", input_shape=(10000, )))# Hidden - Layersmodel.add(layers.Dropout(0.3, noise_shape=None, seed=None))model.add(layers.Dense(50, activation = "relu"))model.add(layers.Dropout(0.2, noise_shape=None, seed=None))model.add(layers.Dense(50, activation = "relu"))# Output- Layermodel.add(layers.Dense(1, activation = "sigmoid"))model.summary()# compiling the modelmodel.compile( optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"])results = model.fit( train_x, train_y, epochs= 2, batch_size = 500, validation_data = (test_x, test_y))print("Test-Accuracy:", np.mean(results.history["val_acc"]))

摘要

在这篇文章中,您了解了情感分析是什么以及为什么Keras是最常用的深度学习库之一。

最重要的是,你更可以了解到Keras在深度学习和人工智能的实用性做出了巨大贡献。

您学习了如何构建一个简单的神经网络,其中包含六层,可以预测电影评论的情绪,准确率达到89%。您现在可以使用此模型对其他文本源进行二元情感分析,但您需要将它们全部更改为10,000的长度,或者更改输入图层的输入形状。

您也可以将此模型应用于其他相关的机器学习问题,只需进行一些更改。

如何?已经入门python 的同学们,一起进入ai时代吧,就从keras开始,附带的一句话,tensorflow的新版本已经融合keras,keras成为tf的御用框架了,未来 ai更简单,更容易让更多的新人学习并应用于工作中。

老铁们觉得呢?一起来吧,进入ai时代,一起评论high起来。

标签: #基于python的影评数据分析