使用神经网络进行讽刺检测2025年3月17日 | 阅读 12 分钟 讽刺被定义为用来侮辱或嘲讽某人的词语或语言。它表现出愤怒或恼怒的个性。讽刺可能被用来让谈话变得有趣。 带有讽刺意味的对话可能会用积极或有趣的方式传达负面情绪。有时听起来可能不太好。这一代人使用社交媒体平台直接或间接、用讽刺的方式来嘲讽别人。Twitter 近年来越来越受欢迎,人们在 Twitter 上分享他们的想法,并用讽刺的言语互相嘲讽。利用神经网络,我们可以通过构建不同的机器学习模型来检测 Twitter 上的这种讽刺。 问题陈述我们将借助多个机器学习模型来构建使用神经网络的讽刺检测。然后,我们将输入的文本分类为讽刺或非讽刺。 问题陈述的方法
在实现使用神经网络的讽刺检测器之前,我们必须更深入地了解其结构。 我们正在讨论的问题陈述是一个分类问题。文本语句和讽刺分析是自然语言处理的一部分。自然语言处理是人工智能的一个分支,它帮助机器理解和处理人类语言。 我们正在使用神经网络来构建模型,以预测推文中的讽刺。神经网络是人工智能中的一个过程,它教会机器理解人类语言。 使用神经网络实现讽刺检测器步骤 1 导入库 代码 说明
步骤 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 我们将根据其中的讽刺推文来可视化数据. 代码 输出 ![]() 说明 我们制作了一个计数图,它告诉我们数据集中有多少讽刺和非讽刺文本。 检查单词数量的最小值和最大值 输出 (2, 39) 可视化单词数量 输出 ![]() 数据集中单词的最大长度 输出 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 对象,我们删除了标点符号、特殊字符等。 现在,我们将制作词云。这意味着数据集中使用的频繁字符。 对于讽刺文本 代码 输出 ![]() 对于非讽刺文本 代码 输出 ![]() 步骤 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 标记将单词映射到训练数据集中的索引。分词器会将文本转换为序列。 让我们详细了解这些参数
使用分词器制作单词索引 代码 输出 {' 说明 我们创建了单词索引,为数据集中存在的单词提供索引。 将训练数据集转换为序列 代码 输出 [[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 层和嵌入层的顺序模型。
代码 输出 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%。 可视化模型的准确性 代码 输出 ![]() 说明 我们绘制了验证损失与训练损失以及验证准确率与训练准确率的两张图。 评估模型 代码 输出 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] 说明 我们预测了测试数据并打印了标签。 制作混淆矩阵 代码 输出 ![]() 创建分类报告 代码 输出 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 强化学习 |
我们请求您订阅我们的新闻通讯以获取最新更新。