使用神经网络进行讽刺检测

2025年3月17日 | 阅读 12 分钟

讽刺被定义为用来侮辱或嘲讽某人的词语或语言。它表现出愤怒或恼怒的个性。讽刺可能被用来让谈话变得有趣。

带有讽刺意味的对话可能会用积极或有趣的方式传达负面情绪。有时听起来可能不太好。这一代人使用社交媒体平台直接或间接、用讽刺的方式来嘲讽别人。Twitter 近年来越来越受欢迎,人们在 Twitter 上分享他们的想法,并用讽刺的言语互相嘲讽。利用神经网络,我们可以通过构建不同的机器学习模型来检测 Twitter 上的这种讽刺。

问题陈述

我们将借助多个机器学习模型来构建使用神经网络的讽刺检测。然后,我们将输入的文本分类为讽刺或非讽刺。

问题陈述的方法

  1. 导入所需的库:我们将导入多个库,如 numpy、matplotlib、NLTK 等。
  2. 加载数据集:导入库后,我们将加载包含不同讽刺或非讽刺推文的数据集。
  3. 预处理数据:数据预处理是分析数据、其结构、数据可视化等的重要步骤。
  4. 数据清理:在分析完数据的基本结构及其各个方面后,我们将通过检查空值并处理它们(如果存在)来清理数据或文本,方法是用其他值替换。由于这是文本数据,我们将加载停用词。停用词是一些常用词,在处理数据时需要忽略。数据清理也是数据预处理的一部分。
  5. 训练和测试数据:现在,我们将数据集分割为训练数据和测试数据。
  6. 构建模型:我们将通过添加不同的层来构建我们的模型或神经网络,然后用训练数据集拟合模型。
  7. 评估:现在我们将评估模型的准确性。我们还将使用不同的图表来分析它。
  8. 预测结果:我们将预测输入的文本是否具有讽刺意味。
  9. 在预测之后,我们将创建一个混淆矩阵和分类报告来进一步分析我们的结果。我们还可以单独检查每段文本的讽刺程度。

在实现使用神经网络的讽刺检测器之前,我们必须更深入地了解其结构。

我们正在讨论的问题陈述是一个分类问题。文本语句和讽刺分析是自然语言处理的一部分。自然语言处理是人工智能的一个分支,它帮助机器理解和处理人类语言

我们正在使用神经网络来构建模型,以预测推文中的讽刺。神经网络是人工智能中的一个过程,它教会机器理解人类语言。

使用神经网络实现讽刺检测器

步骤 1

导入库

代码

说明

  • NLTK(自然语言工具包)库可以去除停用词、词形还原等。
  • re(正则表达式)库可以从文本中删除特殊字符和符号。
  • 分词器用于分词并将文本分解成词元。

步骤 2

加载数据集

代码

输出

                                        article_link  \
0  https://www.huffingtonpost.com/entry/versace-b...   
1  https://www.huffingtonpost.com/entry/roseanne-...   
2  https://local.theonion.com/mom-starting-to-fea...   
3  https://politics.theonion.com/boehner-just-wan...   
4  https://www.huffingtonpost.com/entry/jk-rowlin...   

                                        tweet                                   is_sarcastic  
0  former versace store clerk sues over secret 'b...             0  
1  the 'roseanne' revival catches up to our thorn...             0  
2  mom starting to fear son's web series closest ...             1  
3  boehner just wants wife to listen, not come up...            1  
4  j.k. rowling wishes snape happy birthday in th...             0  

步骤 3

数据预处理

代码

输出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26709 entries, 0 to 26708
Data columns (total 3 columns):
 #   Column        Non-Null Count  Dtype 
---  ------        --------------  ----- 
 0   article_link  26709 non-null  object
 1   tweet         26709 non-null  object
 2   is_sarcastic  26709 non-null  int64 
dtypes: int64(1), object(2)
memory usage: 626.1+ KB

说明

info() 函数用于定义数据的结构。

检查数据中的空值

输出

article_link    0
headline        0
is_sarcastic    0
dtype: int64

检查数据集中讽刺和非讽刺词的数量

输出

0    14985
1    11724
Name: is_sarcastic, dtype: int64

我们将根据其中的讽刺推文来可视化数据.

代码

输出

Sarcasm Detection Using Neural Networks

说明

我们制作了一个计数图,它告诉我们数据集中有多少讽刺和非讽刺文本。

检查单词数量的最小值和最大值

输出

(2, 39)

可视化单词数量

输出



Sarcasm Detection Using Neural Networks

数据集中单词的最大长度

输出

254

创建一个包含唯一单词的独特词汇表

输出

36599

步骤 4

数据清理

代码

说明

使用 nltk 库,我们下载了英语停用词语料库,这些是处理数据时需要忽略的常用词。

现在,我们将通过删除特殊字符和标点符号来清理数据。

代码

输出

airline passengers tackle man who rushes cockpit in bomb threat
Out[ ]:
'airline passengers tackle man rushes cockpit bomb threat'

说明

我们创建了一个 clean() 函数,它将清理我们的数据。使用 re 对象,我们删除了标点符号、特殊字符等。

现在,我们将制作词云。这意味着数据集中使用的频繁字符。

对于讽刺文本

代码

输出

Sarcasm Detection Using Neural Networks

对于非讽刺文本

代码

输出

Sarcasm Detection Using Neural Networks

步骤 5

训练和测试数据

代码

说明

我们将数据转换为列表,以便将数据集分割为测试和训练数据集。

将数据集分割为训练和测试数据

代码

输出

Training dataset : 21367 21367
Validation dataset : 2671 2671
Testing dataset : 2671 2671

说明

我们将数据集分割为训练、测试和验证数据,比例为80:10:10,这意味着 80% 的数据用于训练,10% 用于验证,其余 10% 用于测试。它将计算并打印从数据集中提取文本后的子集大小。

为训练数据集分配参数

代码

说明

我们分配了40000 的词汇表大小,300 的嵌入维度,以及80 的句子最大长度。填充类型设置为 post。未知词标记设置为<OOV>(词汇外)。它包含一个未知词列表。然后,我们将这些参数用于分词和填充。分词器使用定义的词汇表大小和 OOV 标记将单词映射到训练数据集中的索引。分词器会将文本转换为序列。

让我们详细了解这些参数

  • 分词:将文本分解成不同词元的过程。它可以是句子、单词或字符。
  • 填充:它通过向不同长度的序列添加词元和值等参数来保持维度。
  • 填充序列:tensorflow 提供的 pad_sequence 函数用于检查词元的相同长度。

使用分词器制作单词索引

代码

输出

{'': 1,
 'to': 2,
 'of': 3,
 'the': 4,
 'in': 5,
 'for': 6,
 'a': 7,
 'on': 8,
 'and': 9,
 'with': 10,
 'is': 11,
 'new': 12,
 'trump': 13,
 'man': 14,
 'from': 15,
 'at': 16,
 'about': 17,
 'you': 18,
 'by': 19,
 'this': 20,
 'after': 21,
 'up': 22,
 'out': 23,
 'be': 24,
 'how': 25,
 'that': 26,
 'it': 27,
 'as': 28,
 'not': 29,
 'are': 30,
 'your': 31,
 'what': 32,
 'his': 33,
 'all': 34,
 'he': 35,
 'who': 36,
 'just': 37,
 'has': 38,
 'will': 39,
 'more': 40,
 'into': 41,
 'one': 42,
 'year': 43,
 'report': 44,
 'have': 45,
 'over': 46,
 'area': 47,
 'why': 48,
 'donald': 49,
 'u': 50,
 'day': 51,
 'can': 52,
 'says': 53,
 's': 54,
 'first': 55,...}

说明

我们创建了单词索引,为数据集中存在的单词提供索引。

将训练数据集转换为序列

代码

输出

[[320, 13336, 681, 3589, 2357, 46, 381, 2358, 13337, 6, 2750, 9270],
 [4, 7191, 2989, 2990, 22, 2, 154, 9271, 388, 2751, 6, 265, 9, 965],
 [156, 924, 2, 865, 1530, 2097, 599, 5049, 220, 135, 39, 45, 2, 9272],
 [1352, 37, 218, 382, 2, 1680, 29, 294, 22, 10, 2359, 1416, 5903, 1004],
 [715, 682, 5904, 1005, 9273, 662, 583, 5, 4, 95, 1292, 90],
 [9274, 4, 383, 71],
 [4, 7192, 372, 6, 470, 3590, 1979, 1467]]

通过将训练数据集排序到固定长度进行填充

输出

[[  320 13336   681 ...     0     0     0]
 [    4  7191  2989 ...     0     0     0]
 [  156   924     2 ...     0     0     0]
 ...
 [ 1020  3614     5 ...     0     0     0]
 [ 3702 12639    12 ...     0     0     0]
 [ 1247  1017  1087 ...     0     0     0]

将验证和测试数据分词为索引序列

代码

输出

Training vector : (21367, 80)
Validation vector : (2671, 80)
Testing vector : (2671, 80)

说明

在这里,我们将测试和验证数据转换为索引序列,然后进行填充,使形状和大小相等。

检查填充的训练数据中的任意随机索引

输出

['brian boitano sobs quietly in dark                                                                          ']

说明

我们解码了索引为 1200 的训练向量。它将首先使用反向映射将索引序列转换为文本。我们将最大长度固定为 80,这将匹配长度。

步骤 6

构建模型

使用神经网络的不同层,我们将构建模型。我们正在构建一个具有密集层、dropout 层和嵌入层的顺序模型。

  • 顺序模型:层只有单个输入和输出的模型。
  • 嵌入层:此层形成输入的词嵌入。然后,它将单词索引转换为向量,以理解文本及其含义。
  • 池化层:池化从嵌入的单词中提取关键特征。我们使用了全局最大池化,它从每个特征图中选择最高值。
  • 密集层:此层处理池化后的特征。这用于形成全连接层。
  • Dropout 层:此层会忽略或删除模型中的一些神经元。
  • 输出层:此层使用激活函数给出输出。

代码

输出

Model: "sequential_7"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding_8 (Embedding)     (None, 80, 300)           12000000  
                                                                 
 global_max_pooling1d_5 (Gl  (None, 300)               0         
 obalMaxPooling1D)                                               
                                                                 
 dense_23 (Dense)            (None, 30)                12040     
                                                                 
 dropout_16 (Dropout)        (None, 30)                0         
                                                                 
 dense_24 (Dense)            (None, 40)                820       
                                                                 
 dropout_17 (Dropout)        (None, 40)                0         
                                                                 
 dense_25 (Dense)            (None, 20)                210       
                                                                 
 dropout_18 (Dropout)        (None, 20)                0         
                                                                 
 dense_26 (Dense)            (None, 1)                 11        
                                                                 
=================================================================
Total params: 12013081 (45.83 MB)
Trainable params: 12013081 (45.83 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

说明

summary() 函数将总结并提供用于构建模型的层的概述。

编译模型

代码

说明

我们使用 Adam 优化器、二元交叉熵损失函数和准确率矩阵编译了模型。

步骤 7

部署和评估模型

代码

输出

Epoch 1/10
668/668 [==============================] - 287s 430ms/step - loss: 0.0106 - accuracy: 0.9978 - val_loss: 1.1091 - val_accuracy: 0.8540
Epoch 2/10
668/668 [==============================] - 277s 414ms/step - loss: 0.0103 - accuracy: 0.9977 - val_loss: 1.0149 - val_accuracy: 0.8502
Epoch 3/10
668/668 [==============================] - 254s 380ms/step - loss: 0.0063 - accuracy: 0.9984 - val_loss: 1.4693 - val_accuracy: 0.8495
Epoch 4/10
668/668 [==============================] - 236s 354ms/step - loss: 0.0049 - accuracy: 0.9989 - val_loss: 1.5654 - val_accuracy: 0.8510
Epoch 5/10
668/668 [==============================] - 270s 404ms/step - loss: 0.0045 - accuracy: 0.9990 - val_loss: 1.2844 - val_accuracy: 0.8499
Epoch 6/10
668/668 [==============================] - 243s 364ms/step - loss: 0.0055 - accuracy: 0.9985 - val_loss: 1.9587 - val_accuracy: 0.8476
Epoch 7/10
668/668 [==============================] - 259s 387ms/step - loss: 0.0081 - accuracy: 0.9978 - val_loss: 1.9838 - val_accuracy: 0.8510
Epoch 8/10
668/668 [==============================] - 233s 349ms/step - loss: 0.0050 - accuracy: 0.9987 - val_loss: 1.7891 - val_accuracy: 0.8472
Epoch 9/10
668/668 [==============================] - 235s 352ms/step - loss: 0.0036 - accuracy: 0.9993 - val_loss: 2.2813 - val_accuracy: 0.9502
Epoch 10/10
668/668 [==============================] - 242s 362ms/step - loss: 0.0045 - accuracy: 0.9987 - val_loss: 0.2687 - val_accuracy: 0.9854

说明

我们通过设置多个 epoch(此处为 10)并使用 fit() 方法来训练模型,然后评估其准确性。我们发现验证准确率为 98%。

可视化模型的准确性

代码

输出

Sarcasm Detection Using Neural Networks

说明

我们绘制了验证损失与训练损失以及验证准确率与训练准确率的两张图。

评估模型

代码

输出

84/84 [==============================] - 0s 670us/step - loss: 0.2684 - accuracy: 0.9739
The Accuracy on the test dataset : 97.39%

说明

我们计算了模型的准确率,发现准确率为 97.39%。

步骤 8

预测

代码

输出

84/84 [==============================] - 1s 5ms/step
[1, 0, 0, 1, 0, 0, 1, 1]

说明

我们预测了测试数据并打印了标签。

制作混淆矩阵

代码

输出

Sarcasm Detection Using Neural Networks

创建分类报告

代码

输出

Classification Report:
               precision    recall  f1-score   support

Not Sarcastic       0.84      0.89      0.87      1536
    Sarcastic       0.84      0.77      0.81      1135

     accuracy                           0.84      2671
    macro avg       0.84      0.83      0.84      2671
 weighted avg       0.84      0.84      0.84      2671

预测不同语句的讽刺程度

代码

输出

Enter a headline for prediction (type 'no' to quit): hello
1/1 [==============================] - 0s 58ms/step
Headline: hello
Prediction: Text is Not Sarcastic
Enter a headline for prediction (type 'no' to quit): you are a good person
1/1 [==============================] - 0s 46ms/step
Headline: you are a good person?
Prediction: Text is Sarcastic
Enter a headline for prediction (type 'no' to quit): are you doing the work?
1/1 [==============================] - 0s 33ms/step
Headline: are you doing the work?
Prediction: Text is Not Sarcastic
Enter a headline for prediction (type 'no' to quit): no.

最后,我们检测了文本中的讽刺。通过输入任何输入文本,我们现在都可以预测它是否具有讽刺意味。


下一主题SARSA 强化学习