计算机毕设 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录

  • 1 前言
    • 1.1 背景
  • 2 数据集
  • 3 实现过程
  • 4 CNN网络实现
  • 5 模型训练部分
  • 6 模型评估
  • 7 预测结果
  • 8 最后

1 前言

Hi,大家好,这里是丹成学长,今天向大家介绍 一个深度学习项目

基于CNN实现谣言检测

1.1 背景

社交媒体的发展在加速信息传播的同时,也带来了虚假谣言信息的泛滥,往往会引发诸多不安定因素,并对经济和社会产生巨大的影响。

2 数据集

本项目所使用的数据是从新浪微博不实信息举报平台抓取的中文谣言数据,数据集中共包含1538条谣言和1849条非谣言。

如下图所示,每条数据均为json格式,其中text字段代表微博原文的文字内容。

在这里插入图片描述

每个文件夹里又有很多新闻文本。

在这里插入图片描述
每个文本又是json格式,具体内容如下:

在这里插入图片描述

3 实现过程

步骤入下:

*(1)解压数据,读取并解析数据,生成all_data.txt
*(2)生成数据字典,即dict.txt
*(3)生成数据列表,并进行训练集与验证集的划分,train_list.txt 、eval_list.txt
*(4)定义训练数据集提供器train_reader和验证数据集提供器eval_reader

import zipfile
import os
import io
import random
import json
import matplotlib.pyplot as plt
import numpy as np
import paddle
import paddle.fluid as fluid
from paddle.fluid.dygraph.nn import Conv2D, Linear, Embedding
from paddle.fluid.dygraph.base import to_variable#解压原始数据集,将Rumor_Dataset.zip解压至data目录下
src_path="/home/aistudio/data/data36807/Rumor_Dataset.zip" #这里填写自己项目所在的数据集路径
target_path="/home/aistudio/data/Chinese_Rumor_Dataset-master"
if(not os.path.isdir(target_path)):z = zipfile.ZipFile(src_path, 'r')z.extractall(path=target_path)z.close()#分别为谣言数据、非谣言数据、全部数据的文件路径
rumor_class_dirs = os.listdir(target_path+"非开源数据集") # 这里填写自己项目所在的数据集路径
non_rumor_class_dirs = os.listdir(target_path+"非开源数据集")
original_microblog = target_path+"非开源数据集"
#谣言标签为0,非谣言标签为1
rumor_label="0"
non_rumor_label="1"#分别统计谣言数据与非谣言数据的总数
rumor_num = 0
non_rumor_num = 0
all_rumor_list = []
all_non_rumor_list = []#解析谣言数据
for rumor_class_dir in rumor_class_dirs: if(rumor_class_dir != '.DS_Store'):#遍历谣言数据,并解析with open(original_microblog + rumor_class_dir, 'r') as f:rumor_content = f.read()rumor_dict = json.loads(rumor_content)all_rumor_list.append(rumor_label+"\t"+rumor_dict["text"]+"\n")rumor_num +=1
#解析非谣言数据
for non_rumor_class_dir in non_rumor_class_dirs: if(non_rumor_class_dir != '.DS_Store'):with open(original_microblog + non_rumor_class_dir, 'r') as f2:non_rumor_content = f2.read()non_rumor_dict = json.loads(non_rumor_content)all_non_rumor_list.append(non_rumor_label+"\t"+non_rumor_dict["text"]+"\n")non_rumor_num +=1print("谣言数据总量为:"+str(rumor_num))
print("非谣言数据总量为:"+str(non_rumor_num))#全部数据进行乱序后写入all_data.txt
data_list_path="/home/aistudio/data/"
all_data_path=data_list_path + "all_data.txt"
all_data_list = all_rumor_list + all_non_rumor_listrandom.shuffle(all_data_list)#在生成all_data.txt之前,首先将其清空
with open(all_data_path, 'w') as f:f.seek(0)f.truncate() with open(all_data_path, 'a') as f:for data in all_data_list:f.write(data) 
print('all_data.txt已生成')

在这里插入图片描述

接下来就是生成数据字典。

# 生成数据字典
def create_dict(data_path, dict_path):with open(dict_path, 'w') as f:f.seek(0)f.truncate() dict_set = set()# 读取全部数据with open(data_path, 'r', encoding='utf-8') as f:lines = f.readlines()# 把数据生成一个元组for line in lines:content = line.split('\t')[-1].replace('\n', '')for s in content:dict_set.add(s)# 把元组转换成字典,一个字对应一个数字dict_list = []i = 0for s in dict_set:dict_list.append([s, i])i += 1# 添加未知字符dict_txt = dict(dict_list)end_dict = {"<unk>": i}dict_txt.update(end_dict)# 把这些字典保存到本地中with open(dict_path, 'w', encoding='utf-8') as f:f.write(str(dict_txt))print("数据字典生成完成!",'\t','字典长度为:',len(dict_list))

我们可以查看一下dict_txt的内容

在这里插入图片描述

接下来就是数据列表的生成

# 创建序列化表示的数据,并按照一定比例划分训练数据与验证数据
def create_data_list(data_list_path):with open(os.path.join(data_list_path, 'dict.txt'), 'r', encoding='utf-8') as f_data:dict_txt = eval(f_data.readlines()[0])with open(os.path.join(data_list_path, 'all_data.txt'), 'r', encoding='utf-8') as f_data:lines = f_data.readlines()i = 0with open(os.path.join(data_list_path, 'eval_list.txt'), 'a', encoding='utf-8') as f_eval,\open(os.path.join(data_list_path, 'train_list.txt'), 'a', encoding='utf-8') as f_train:for line in lines:title = line.split('\t')[-1].replace('\n', '')lab = line.split('\t')[0]t_ids = ""if i % 8 == 0:for s in title:temp = str(dict_txt[s])t_ids = t_ids + temp + ','t_ids = t_ids[:-1] + '\t' + lab + '\n'f_eval.write(t_ids)else:for s in title:temp = str(dict_txt[s])t_ids = t_ids + temp + ','t_ids = t_ids[:-1] + '\t' + lab + '\n'f_train.write(t_ids)i += 1print("数据列表生成完成!")

定义数据读取器

def data_reader(file_path, phrase, shuffle=False):all_data = []with io.open(file_path, "r", encoding='utf8') as fin:for line in fin:cols = line.strip().split("\t")if len(cols) != 2:continuelabel = int(cols[1])wids = cols[0].split(",")all_data.append((wids, label))if shuffle:if phrase == "train":random.shuffle(all_data)def reader():for doc, label in all_data:yield doc, labelreturn readerclass SentaProcessor(object):def __init__(self, data_dir,):self.data_dir = data_dirdef get_train_data(self, data_dir, shuffle):return data_reader((self.data_dir + "train_list.txt"), "train", shuffle)def get_eval_data(self, data_dir, shuffle):return data_reader((self.data_dir + "eval_list.txt"), "eval", shuffle)def data_generator(self, batch_size, phase='train', shuffle=True):if phase == "train":return paddle.batch(self.get_train_data(self.data_dir, shuffle),batch_size,drop_last=True)elif phase == "eval":return paddle.batch(self.get_eval_data(self.data_dir, shuffle),batch_size,drop_last=True)else:raise ValueError("Unknown phase, which should be in ['train', 'eval']")

总之在数据处理这一块需要我们注意的是一共生成以下的几个文件。

在这里插入图片描述

4 CNN网络实现

接下来就是构建以及配置卷积神经网络(Convolutional Neural Networks, CNN),开篇也说了,其实这里有很多模型的选择,之所以选择CNN是因为让我们熟悉CNN的相关实现。 输入词向量序列,产生一个特征图(feature map),对特征图采用时间维度上的最大池化(max pooling over time)操作得到此卷积核对应的整句话的特征,最后,将所有卷积核得到的特征拼接起来即为文本的定长向量表示,对于文本分类问题,将其连接至softmax即构建出完整的模型。在实际应用中,我们会使用多个卷积核来处理句子,窗口大小相同的卷积核堆叠起来形成一个矩阵,这样可以更高效的完成运算。另外,我们也可使用窗口大小不同的卷积核来处理句子。具体的流程如下:

在这里插入图片描述
首先我们构建单层CNN神经网络。

#单层
class SimpleConvPool(fluid.dygraph.Layer):def __init__(self,num_channels, # 通道数num_filters,  # 卷积核数量filter_size,  # 卷积核大小batch_size=None): # 16super(SimpleConvPool, self).__init__()self.batch_size = batch_sizeself._conv2d = Conv2D(num_channels = num_channels,num_filters = num_filters,filter_size = filter_size,act='tanh')self._pool2d = fluid.dygraph.Pool2D(pool_size = (150 - filter_size[0]+1,1),pool_type = 'max',pool_stride=1)def forward(self, inputs):# print('SimpleConvPool_inputs数据纬度',inputs.shape) # [16, 1, 148, 128]x = self._conv2d(inputs)x = self._pool2d(x)x = fluid.layers.reshape(x, shape=[self.batch_size, -1])return xclass CNN(fluid.dygraph.Layer):def __init__(self):super(CNN, self).__init__()self.dict_dim = train_parameters["vocab_size"]self.emb_dim = 128   #emb纬度self.hid_dim = [32]  #卷积核数量self.fc_hid_dim = 96  #fc参数纬度self.class_dim = 2    #分类数self.channels = 1     #输入通道数self.win_size = [[3, 128]]  # 卷积核尺寸self.batch_size = train_parameters["batch_size"] self.seq_len = train_parameters["padding_size"]self.embedding = Embedding( size=[self.dict_dim + 1, self.emb_dim],dtype='float32', is_sparse=False)self._simple_conv_pool_1 = SimpleConvPool(self.channels,self.hid_dim[0],self.win_size[0],batch_size=self.batch_size)self._fc1 = Linear(input_dim = self.hid_dim[0],output_dim = self.fc_hid_dim,act="tanh")self._fc_prediction = Linear(input_dim = self.fc_hid_dim,output_dim = self.class_dim,act="softmax")def forward(self, inputs, label=None):emb = self.embedding(inputs) # [2400, 128]# print('CNN_emb',emb.shape)  emb = fluid.layers.reshape(   # [16, 1, 150, 128]emb, shape=[-1, self.channels , self.seq_len, self.emb_dim])# print('CNN_emb',emb.shape)conv_3 = self._simple_conv_pool_1(emb)fc_1 = self._fc1(conv_3)prediction = self._fc_prediction(fc_1)if label is not None:acc = fluid.layers.accuracy(prediction, label=label)return prediction, accelse:return prediction

接下来就是参数的配置,不过为了在模型训练过程中更直观的查看我们训练的准确率,我们首先利用python的matplotlib.pyplt函数实现一个可视化图,具体的实现如下:

def draw_train_process(iters, train_loss, train_accs):title="training loss/training accs"plt.title(title, fontsize=24)plt.xlabel("iter", fontsize=14)plt.ylabel("loss/acc", fontsize=14)plt.plot(iters, train_loss, color='red', label='training loss')plt.plot(iters, train_accs, color='green', label='training accs')plt.legend()plt.grid()plt.show()

5 模型训练部分

def train():with fluid.dygraph.guard(place = fluid.CUDAPlace(0)): # 因为要进行很大规模的训练,因此我们用的是GPU,如果没有安装GPU的可以使用下面一句,把这句代码注释掉即可# with fluid.dygraph.guard(place = fluid.CPUPlace()):processor = SentaProcessor( data_dir="data/")train_data_generator = processor.data_generator(batch_size=train_parameters["batch_size"],phase='train',shuffle=True)model = CNN()sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=train_parameters["adam"],parameter_list=model.parameters())steps = 0Iters,total_loss, total_acc = [], [], []for eop in range(train_parameters["epoch"]):for batch_id, data in enumerate(train_data_generator()):steps += 1#转换为 variable 类型doc = to_variable(np.array([np.pad(x[0][0:train_parameters["padding_size"]],  #对句子进行padding,全部填补为定长150(0, train_parameters["padding_size"] - len(x[0][0:train_parameters["padding_size"]])),'constant',constant_values=(train_parameters["vocab_size"])) # 用 <unk> 的id 进行填补for x in data]).astype('int64').reshape(-1))#转换为 variable 类型label = to_variable(np.array([x[1] for x in data]).astype('int64').reshape(train_parameters["batch_size"], 1))model.train() #使用训练模式prediction, acc = model(doc, label)loss = fluid.layers.cross_entropy(prediction, label)avg_loss = fluid.layers.mean(loss)avg_loss.backward()sgd_optimizer.minimize(avg_loss)model.clear_gradients()if steps % train_parameters["skip_steps"] == 0:Iters.append(steps)total_loss.append(avg_loss.numpy()[0])total_acc.append(acc.numpy()[0])print("eop: %d, step: %d, ave loss: %f, ave acc: %f" %(eop, steps,avg_loss.numpy(),acc.numpy()))if steps % train_parameters["save_steps"] == 0:save_path = train_parameters["checkpoints"]+"/"+"save_dir_" + str(steps)print('save model to: ' + save_path)fluid.dygraph.save_dygraph(model.state_dict(),save_path)# breakdraw_train_process(Iters, total_loss, total_acc)

训练的过程以及训练的结果如下:

在这里插入图片描述

6 模型评估

def to_eval():with fluid.dygraph.guard(place = fluid.CUDAPlace(0)):processor = SentaProcessor(data_dir="data/") #写自己的路径eval_data_generator = processor.data_generator(batch_size=train_parameters["batch_size"],phase='eval',shuffle=False)model_eval = CNN() #示例化模型model, _ = fluid.load_dygraph("data//save_dir_180.pdparams") #写自己的路径model_eval.load_dict(model)model_eval.eval() # 切换为eval模式total_eval_cost, total_eval_acc = [], []for eval_batch_id, eval_data in enumerate(eval_data_generator()):eval_np_doc = np.array([np.pad(x[0][0:train_parameters["padding_size"]],(0, train_parameters["padding_size"] -len(x[0][0:train_parameters["padding_size"]])),'constant',constant_values=(train_parameters["vocab_size"]))for x in eval_data]).astype('int64').reshape(-1)eval_label = to_variable(np.array([x[1] for x in eval_data]).astype('int64').reshape(train_parameters["batch_size"], 1))eval_doc = to_variable(eval_np_doc)eval_prediction, eval_acc = model_eval(eval_doc, eval_label)loss = fluid.layers.cross_entropy(eval_prediction, eval_label)avg_loss = fluid.layers.mean(loss)total_eval_cost.append(avg_loss.numpy()[0])total_eval_acc.append(eval_acc.numpy()[0])print("Final validation result: ave loss: %f, ave acc: %f" %(np.mean(total_eval_cost), np.mean(total_eval_acc) ))   

评估准确率如下:

在这里插入图片描述

7 预测结果

# 获取数据
def load_data(sentence):# 读取数据字典with open('data/dict.txt', 'r', encoding='utf-8') as f_data:dict_txt = eval(f_data.readlines()[0])dict_txt = dict(dict_txt)# 把字符串数据转换成列表数据keys = dict_txt.keys()data = []for s in sentence:# 判断是否存在未知字符if not s in keys:s = '<unk>'data.append(int(dict_txt[s]))return datatrain_parameters["batch_size"] = 1
lab = [ '谣言', '非谣言']with fluid.dygraph.guard(place = fluid.CUDAPlace(0)):data = load_data('兴仁县今天抢小孩没抢走,把孩子母亲捅了一刀,看见这车的注意了,真事,车牌号辽HFM055!!!!!赶紧散播! 都别带孩子出去瞎转悠了 尤其别让老人自己带孩子出去 太危险了 注意了!!!!辽HFM055北京现代朗动,在各学校门口抢小孩!!!110已经 证实!!全市通缉!!')data_np = np.array(data)data_np = np.array(np.pad(data_np,(0,150-len(data_np)),"constant",constant_values =train_parameters["vocab_size"])).astype('int64').reshape(-1)infer_np_doc = to_variable(data_np)model_infer = CNN()model, _ = fluid.load_dygraph("data/save_dir_900.pdparams")model_infer.load_dict(model)model_infer.eval()result = model_infer(infer_np_doc)print('预测结果为:', lab[np.argmax(result.numpy())])

在这里插入图片描述

8 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/121272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGLM3 本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Java 将list集合的字符串格式转为Map

Java 将list集合的字符串格式转为Map List<Object> list new ArrayList<>(); Map<String,String> map1 new HashMap<>(); map1.put("fileName","测试1"); map1.put("level","1"); list.add(map1);Map<S…

[Java]前中后序遍历二叉树/递归与非递归

一、递归方法 首先&#xff0c;树形结构都是由递归方式定义的。那么递归是怎么用的&#xff1f; 1、终止条件&#xff1b;2、调用自身 分析 1、什么时候停止&#xff1f; 当结点值为空的时候&#xff0c;返回null&#xff1b; 2、如何调用自身&#xff1f; 以前序遍历为例&…

php之 角色的权限管理(RBAC)详解

RBAC&#xff08;Role-based access control&#xff09;是一种常见的权限管理模型&#xff0c;通过将用户分配至特定的角色&#xff0c;以及为角色分配访问权限&#xff0c;实现了权限管理的目的。以下是关于RBAC的详细解释&#xff1a; 角色&#xff1a;RBAC模型的核心是角色…

Ubuntu编译 PCL 1.13.1 详细流程

Ubuntu编译 PCL 1.13. 详细流程 一、编译环境二、虚拟机准备1. 虚拟机扩容2. 配置交换分区 三、Cmake - gui 生成 MakeFile1. 解决 flann 依赖问题2. 配置 Cmake 四、编译安装1.编译&#xff1a;2. 安装 一、编译环境 Ubuntu&#xff1a;Ubuntu 20.04 VMware&#xff1a;VMwar…

如何学好C++?学习C和C++的技巧是什么?

如何学好C?学习C和C的技巧是什么&#xff1f; 你这三个问题&#xff0c;前两个都是意思是差不多的&#xff0c;那么怎么怎么学习C/C我来问答一下&#xff1a;最近很多小伙伴找我&#xff0c;说想要一些C资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜搞了几个通…

【嵌入式开源库】timeslice的使用,完全解耦的时间片轮询框架构

完全解耦的时间片轮询框架构 简介项目代码timeslice.htimeslice.clist.hlist.c 创建工程移植代码实验函数说明timeslice_task_inittimeslice_task_addtimeslice_tak_deltimeslice_get_task_num 结尾 简介 timeslice是一个时间片轮询框架&#xff0c;他是一个完全解耦的时间片轮…

三十七、【进阶】验证索引的效率

1、准备工作&#xff1a; 创建一张表&#xff0c;该表中有一千万条数据&#xff0c;名为tb_sku&#xff1b; 2、使用主键查询&#xff1a; select * from tb_stu where id1\G; 3、使用非索引查询&#xff1a; 4、给sn字段创建索引&#xff1a; 在创建过程中&#xff0c;发现…

如何使用 nvm-windows 这个工具来管理你电脑上的Node.js版本

nvm-windows 是一个用于管理在 Windows 上安装的多个 Node.js 版本的工具。以下是安装和使用 nvm-windows 的步骤&#xff1a; 第1步&#xff1a;下载 nvm-windows 访问 nvm-windows 的 GitHub发布页面.下载最新版本的 nvm-setup.zip 文件。 第2步&#xff1a;安装 nvm-wind…

conda虚拟环境笔记收录

1、安装conda 增加执行权限&#xff1a; chmod x Anaconda3-2023.03-1-Linux-x86_64.sh 开始执行&#xff1a;./Anaconda3-2023.03-1-Linux-x86_64.sh2、查看版本 conda --version3、查看当前虚拟环境 虚拟环境和全局环境有前缀可见 如果不进行设置&#xff0c;重新启动就变成…

MySQL的基础(一)

MySQL的基础&#xff08;一&#xff09; SQLSQL的语法特点主要包括以下几点&#xff1a;一、 SQL - DDL -- 数据定义语言1.1 数据库操作1.1 显示现有的数据库1.2 创建数据库1.3 删除数据库1.4 使用 1.2 数据表操作1.2.1 表查询1.2.2 表创建1.2.3 修改表 1.2.4 小结 二、SQL - D…

calcite 校验层总结

1、校验的作用 1&#xff09;完善语义信息 例如在SQL语句中&#xff0c;如果碰到select * 这样的指令&#xff0c;在SQL的语义当中&#xff0c;“*” 指的是取出对应数据源中所有字段的信息&#xff0c;因此就需要根据元数据信息来展开。 2&#xff09;结合元数据信息来纠偏…

特殊类设计[下] --- 单例模式

文章目录 5.只能创建一个对象的类5.1设计模式[2.5 万字详解&#xff1a;23 种设计模式](https://zhuanlan.zhihu.com/p/433152245)5.2单例模式1.饿汉模式1.懒汉模式 6.饿汉模式7.懒汉模式7.1饿汉模式优缺点:7.2懒汉模式1.线程安全问题2.单例对象的析构问题 8.整体代码9.C11后可…

UVa129 Krypton Factor(困难的串)

1、题目 2、题意 如果一个字符串包含两个相邻的重复子串&#xff0c;则称它是“容易的串”&#xff0c;其他串称为“困难的串”。例如&#xff0c;BB、ABCDACABCAB、ABCDABCD都是容易的的串&#xff0c;而D、DC、ABDAB、CBABCBA 都是困难的串。 输入正整数 k k k 和 L L L&a…

Linux虚拟机部署与发布项目(Windows版本)

目录 前言 一、虚拟机部署项目的流程 二、单机项目 1. 本机测试 2.虚拟机部署项目 三、前后端分离项目 前言 在软件开发过程中&#xff0c;部署和发布项目是非常重要的一环。使用虚拟机技术可以方便、灵活且可重复使用地部署和发布项目。本篇博客将介绍如何在 Windows 环…

【密评】商用密码应用安全性评估从业人员考核题库(十四)

商用密码应用安全性评估从业人员考核题库&#xff08;十四&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 3251 单项选择题 根据GB/T 39786《信息安全技术 信息系统密码应用…

Go基础——基础语法

1、简介 Go&#xff08;又称Golang&#xff09;是Google开发的一种静态强类型、编译型、并发型&#xff0c;并具有垃圾回收功能的编程语言。语法类似于C&#xff0c;专为高性能和并发程序而设计。通常用于网络编程、云服务器、游戏服务器、DevOps、Web应用、分布式系统、容器虚…

mysql-linux归档版安装

什么是归档版安装&#xff1f;简单来说就是编译好的软件压缩打包版。 说明&#xff1a;我这里服务器之前已经装过一个不同版本的mysql&#xff0c;已经占用了3306端口&#xff0c;所以这里我用3307端口来演示&#xff0c;命令和官方的稍有不同&#xff0c;不过步骤都是差不多的…

搜索引擎搜索技巧总结

晚上在B站上刷到一个关于搜索技巧的干货视频&#xff0c;这个视频真的不错&#xff0c;结尾还提到了AI时代的搜索思路之前自己也零碎的探索出了一些搜索技巧&#xff0c;但是没有总结&#xff0c;就没法稳定的加入自己的工作流&#xff0c;持续提高效率受到这个视频的启发&…

计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理

一、简述 激光雷达是目前正在改变世界的传感器。它集成在自动驾驶汽车、自主无人机、机器人、卫星、火箭等中。该传感器使用激光束了解世界,并测量激光击中目标返回所需的时间,输出是点云信息,利用这些信息,我们可以从3D点云中查找障碍物。 从自动驾驶汽车的角度看激光雷达…