使用神经网络的短语情感分析

大家好!

但是,所有接受高等教育而没有被开除的人都达到了写文凭的阶段。我也不例外。我想实现一些有趣的东西并掌握迄今尚未探索的东西,因此我提请大家注意神经网络和人工智能的主题。而我借助它解决的任务是分析文本的音调,该音调已经在各种监视系统中广泛使用。我将在本文中尝试描述其解决方案的过程。

简而言之,目标是了解一个短语是正面的含义还是负面的含义。我想马上说这个问题可以通过多种方式解决,而不仅仅是通过神经网络。我们可以制作标记了单词位置的字典,等等。(中心上有很多方法),但根据文章,每种方法都可能会更进一步,因此我们将留待以后进行审查。

数据


我的第一项任务原来是收集和预处理数据以进行培训。Yu。Rubtsova 短文本语料库是此类案例的一个很好的数据集,以前它在Twitter上分为否定句和肯定句。特别方便的是-所有这些都以CSV格式存在。

培训准备


注意数据的显示形式-许多表情符号,链接,不必要的字符,匹配。所有这些都不是重要的信息,只会干扰学习,此外,所有内容都必须用拉丁语删除。因此,文本将是很好的预处理。

def preprocessText(text):
    text = text.lower().replace("", "")
    text = re.sub('((www\.[^\s]+)|(https?://[^\s]+))', ' ', text)
    text = re.sub('@[^\s]+', ' ', text)
    text = re.sub('[^a-zA-Z--1-9]+', ' ', text)
    text = re.sub(' +', ' ', text)
    return text.strip()

删除了文件中的所有句子后,我们将它们改为小写,将“”替换为“ e”,并引用,提及,我们只是删除了英文单词中缺乏含义的单词。简而言之,我们将它们设为相同类型,以清除多余的“垃圾”以进行培训。

工具类


当然,如果您在家中有一台超级计算机,则可以进一步向下滚动此部分,寻找有趣的部分。我建议使用Google Colab的其余服务,该服务可让您仅使用浏览器来运行Jupyter Notebook(尚未听说过,可帮助搜索引擎),所有工作都在云中的虚拟机上完成。
分配给您的工作阶段的临时大小限制为12小时-您可以提前完成,然后重置所有内容。

我们编写漂亮的代码


像任何其他机器学习的新手一样,我选择了Python-因为它很简单,并且库是一个完整的云。

首先,程序包管理器将执行一个重要的命令,稍后将解释其含义。

图片

接下来,我们导入在训练网格和准备数据时将使用的库,我想其中许多对于您来说都是熟悉的。

图片

终于到了重点。

那么,为什么我们要下载并导入Tensorflow文本库?事实是,短语无法以我们可读的形式“馈入”到网格中。这就是单词嵌入的意思,我没有找到一个合适的翻译词,总的来说,我怀疑它的存在。但粗略地说,我们正在谈论将向量与单词进行比较。这里说得好

我们需要将整个句子转换为向量,因此我们使用Google提供的现成解决方案-Universal Sentence Encoder。

图片

您可以从此处的中心下载它。顺便说一下,那里有很多有趣的现成的解决方案,可以在学习神经网络时使用,以免打扰自己。

图片

所有推文均按类别分类-不好/很好。我们创建了一个pandas-dataframe,在其中按类对它们进行排序(由于它们适合,因此在图中看不到坏的)。

图片

我们准备了数据-让我们深入到模型本身。为此,请使用Keras框架。

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential, load_model
model = tf.keras.Sequential()

model.add(
  tf.keras.layers.Dense(
    units=256,
    input_shape=(X_train.shape[1], ),
    activation='relu'
  )
)
model.add(
  tf.keras.layers.Dropout(rate=0.5)
)

model.add(
  tf.keras.layers.Dense(
    units=128,
    activation='relu'
  )
)
model.add(
  tf.keras.layers.Dropout(rate=0.5)
)

model.add(tf.keras.layers.Dense(2, activation='softmax'))
model.compile(
    loss='categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(0.001),
    metrics=['accuracy']
)

history = model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=16,
    validation_split=0.1,
    verbose=1,
    shuffle=True
)

model.evaluate(X_test, y_test)

关于模型本身的一些知识。它具有输入,隐藏和输出层。

每层都有自己的激活功能。

一点解释:在人工神经网络中,神经元激活函数确定输出信号,该输出信号由输入信号或一组输入信号确定。您可以在这里阅读更多内容,尽管其中很多内容可以完成不同的任务,但我们只能使用2。我们

将激活功能ReLu分配给前两层休息日Softmax

除了添加图层,您还可以注意到“ Dropout”一词。它是什么?奇怪的是,除了神经网络学习不足的问题外,当神经网络的预测不正确时,还存在过度训练的问题-模型仅很好地说明了训练样本中的示例,适合了训练示例,而不是学习对未参与训练的示例进行分类。这在新数据上很老套,您的漂亮模特曾经做过出色的工作,只是“飞起来”,开始让您不愉快。因此Dropout参与了这样一个事实,即它以某种指定的概率“关闭”了网格中的神经元,从而使它们不再参与学习过程。然后,对来自多个网络的结果进行平均(当神经元从网络中排除时,会获得一个新的神经元)。

顺便说一句,对那些感兴趣的人来说是一篇很棒的文章

您可以开始学习!

Train on 53082 samples, validate on 5898 samples
Epoch 1/10
53082/53082 [==============================] - 12s 223us/sample - loss: 0.5451 - accuracy: 0.7207 - val_loss: 0.5105 - val_accuracy: 0.7397
Epoch 2/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.5129 - accuracy: 0.7452 - val_loss: 0.5000 - val_accuracy: 0.7523
Epoch 3/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4885 - accuracy: 0.7624 - val_loss: 0.4914 - val_accuracy: 0.7538
Epoch 4/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4686 - accuracy: 0.7739 - val_loss: 0.4865 - val_accuracy: 0.7589
Epoch 5/10
53082/53082 [==============================] - 11s 214us/sample - loss: 0.4474 - accuracy: 0.7889 - val_loss: 0.4873 - val_accuracy: 0.7616
Epoch 6/10
53082/53082 [==============================] - 11s 216us/sample - loss: 0.4272 - accuracy: 0.8004 - val_loss: 0.4878 - val_accuracy: 0.7603
Epoch 7/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.4081 - accuracy: 0.8111 - val_loss: 0.4986 - val_accuracy: 0.7594
Epoch 8/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3899 - accuracy: 0.8241 - val_loss: 0.5101 - val_accuracy: 0.7564
Epoch 9/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3733 - accuracy: 0.8315 - val_loss: 0.5035 - val_accuracy: 0.7633
Epoch 10/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3596 - accuracy: 0.8400 - val_loss: 0.5239 - val_accuracy: 0.7620
6554/6554 [==============================] - 0s 53us/sample - loss: 0.5249 - accuracy: 0.7524
[0.5249265961105736, 0.752365]

因此,十个时代过去了。对于那些根本不熟悉此类概念的人,我将在Internet上解释其定义:这个时代是学习过程中的一次迭代,包括呈现训练集中的所有示例,并可能检查控制集中的训练质量。因此,我们的所有数据在整个过程中都进行了10次。

结果


图片

当然,将不止一次需要该网络,并且很高兴知道如何将其保存以供后代使用,这样他们就不必重新培训它了。

该结构以JSON格式保存,权重写入h5文件

搜索引擎上有很多指南,说明如何启动从这些文件初始化网络的反向过程,因此我将不对其进行描述。

使用预测方法,我们将尝试找出网络的观点以及这方面两个明显不同的短语的音调成分。的确,仍然需要首先将它们简化为矩阵形式,但是我们已经知道如何使用现成的解决方案来做到这一点。

在输出中,我们看到2个数字-该短语属于“负” /“正”类别的概率。我认为图片清楚地表明了两者之间的区别。所以最后是相似的词,网络在与班级的关系方面做得很好。

结论


因此,我想说的是,掌握用于开发神经网络和解决简单问题的高级工具,正确确定解决问题的必要步骤并稍微读懂理论似乎是一件容易的事。我想指出的是,我在Habré上看到了几篇有关音调分析的文章,但是尝试更简单且没有大量文本的尝试仍然很有趣,尽管必须无条件地研究该理论:) 如果在项目上加上星号,

可以在这里找到代码,那将是很棒的。如果需要具有权重和网络结构的文件以及已处理的数据,请在注释中写入内容,然后添加到存储库中。

All Articles