基于机器学习的虚假新闻智能检测系统

news2024/11/24 22:45:08

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        随着互联网的普及和社交媒体的发展,虚假新闻(fake news)问题日益严重,对社会和个人产生了诸多负面影响。传统的新闻审核方法通常依赖于人工审核,这种方法不仅耗时耗力,而且容易受到主观因素的影响。近年来,机器学习技术在自然语言处理领域取得了显著进展,能够从大量的文本数据中自动学习和提取特征,从而实现高效、准确的虚假新闻检测。

        本项目旨在开发一个基于机器学习的虚假新闻智能检测系统,通过构建新闻文本的 BoW 词袋模型,并训练朴素贝叶斯和Xgboost两种模型,经性能优化,虚假新闻检测准确率达到 97%,实现了利用先进的自然语言处理技术对新闻文本进行智能检测。

        B站系统演示视频:基于机器学习的虚假新闻智能检测系统_哔哩哔哩_bilibili

基于机器学习的虚假新闻智能检测系统

2. 读取数据与数据预处理

        利用 pandas 读取虚假新闻数据集,并去除字段缺失的样本,将新闻的标题和正文内容进行拼接:

df = pd.read_csv('./WELFake_Dataset.csv')

# 去除字段缺失的样本
df.dropna(subset = ['text', 'title'], inplace = True)

# 将标题与正文内容进行拼接
df["title_text"] = df["title"] + df["text"]

df.info()

df.head()

3. 数据探索式可视化分析 

3.1 标签样本数量分布

df['label'].value_counts(normalize=True).rename({1: '真实新闻', 0: '虚假新闻'})

plt.figure(figsize = (10,6))
sns.countplot(x = df['label'], palette = 'Set1', alpha = 0.8)
plt.title('虚假新闻样本类别分布直方图 - 0 /虚假新闻 - 1 真实新闻', fontsize=15)
plt.show()

        可以看出,类别标签样本数量基本平衡,真实新闻占51%,虚假新闻占49%。

3.2 新闻长度分布分析

plt.figure(figsize = (16,8))

bins = np.linspace(0, 10000, 100)
plt.hist(df[df["label"]== 0]["body_len"], bins, alpha=0.5, label="虚假新闻", color="#FF5733")
plt.hist(df[df["label"]== 1]["body_len"], bins, alpha=0.5, label="真实新闻", color="#33FFB8")
plt.legend(loc="upper left")
plt.title('真实新闻/虚假新闻的长度分布', fontsize=15)
plt.show()

3.3 新闻关键词词云分析

        通过对新闻的文本进行分词、去除停用词处理后,统计每个词token的词频,将词频更高的通过词云进行可视化:

fake_texts = ' '.join(text for text in fake_news)
wordcloud = WordCloud(
    background_color='white', 
    max_words=300,
    width=600, 
    height=300,
).generate(fake_texts)

plt.figure(figsize=(18, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")

plt.title('虚假新闻的词云可视化', fontsize=20)
plt.show()

4. 构建 Bag of Words 模型

Bag of Words (BoW) 模型是一种在自然语言处理(NLP)和信息检索(IR)领域常用的技术,用于文本的数据表示。BoW模型的核心思想是将文本简化为单词的集合,即“词袋”,而忽略掉文本中单词的顺序和语法结构。在这个模型中,每个文档可以被视为一组无序的词项的集合,并且每个词项的出现被认为是相互独立的。

Bag of Words 的工作流程:

  • 构建词典:
    • 首先,从训练集中收集所有独特的单词,并创建一个包含这些单词的词典。词典可以是基于整个语料库的,也可以是特定文档的。
  • 文档向量化:
    • 对于每篇文档,统计词典中每个词在文档中出现的次数。
    • 根据这些计数,可以将文档表示为一个向量,向量的长度等于词典中单词的数量,每个元素对应一个特定单词的出现频率。

        BoW模型尽管简单,但它依然是许多现代NLP技术的基础,并且在某些应用中仍然非常有用。随着深度学习的发展,诸如Word2Vec、GloVe等嵌入方法以及RNN、LSTM等序列模型逐渐取代了BoW在某些任务中的地位,但BoW仍然是理解文本数据表示的重要起点。

count_vectorizer = CountVectorizer(stop_words='english', max_features=10000, min_df=10)
count_vectorizer.fit(X_train)

count_train = count_vectorizer.transform(X_train)
count_valid = count_vectorizer.transform(X_valid)
count_test = count_vectorizer.transform(X_test)

# 保存 BoW 模型
with open('./saved_model/count_vectorizer.pickle','wb') as f:
    pickle.dump(count_vectorizer, f)

 5. 朴素贝叶斯 Naive Bayes 模型

朴素贝叶斯(Naive Bayes)模型是一种基于贝叶斯定理的概率分类算法,它假设特征之间相互独立。尽管这个假设在实际情况中很少成立,但朴素贝叶斯分类器在很多场景下都能取得很好的效果,尤其是在文本分类、垃圾邮件过滤等领域。

贝叶斯定理描述了条件概率之间的关系。具体来说,如果已知某个事件 B 发生的概率,那么我们可以通过贝叶斯定理计算另一个事件 A 在事件 B 已经发生的条件下发生的概率。数学上表示为:

其中,

  • P(A∣B) 是在事件 B 发生的条件下 A 发生的概率(后验概率)。
  • P(B∣A) 是在事件 A 发生的条件下 B 发生的概率(似然度)。
  • P(A) 是事件 A 发生的概率(先验概率)。
  • P(B) 是事件 B 发生的概率,通常是一个归一化常数。
from sklearn.naive_bayes import MultinomialNB

nb_classifier = MultinomialNB()
nb_classifier.fit(count_train, y_train)

nb_pred = nb_classifier.predict(count_test)

        可以看出,朴素贝叶斯模型的预测准确率可以达到 88%。

 6. 构建并训练 XGBoost 模型

        XGBoost(Extreme Gradient Boosting)是一种先进的梯度提升框架,它优化了传统的梯度提升决策树(Gradient Boosting Decision Trees, GBDT)算法,以提高效率、准确性和可扩展性。XGBoost 是专门为速度和性能设计的,适用于多种机器学习任务,包括分类、回归、排名等。

6.1 模型训练

print('===> feature count: {}'.format(len(feature_names)))

xgb_params = {
    'eta': 0.1,
    'colsample_bytree': 0.4,
    'max_depth': 8,
    'lambda': 2.0,
    'eval_metric': 'auc',
    'objective': 'binary:logistic',
    'nthread': -1,
    'booster': 'gbtree'
}

dtrain = xgb.DMatrix(count_train, y_train, feature_names=feature_names)
dvalid = xgb.DMatrix(count_valid, y_valid, feature_names=feature_names)

watchlist = [(dtrain, 'train'), (dvalid, 'valid')]

xgb_model = xgb.train(dict(xgb_params),
                      dtrain,
                      evals=watchlist,
                      verbose_eval=50,
                      early_stopping_rounds=100,
                      num_boost_round=4000)
[0]	train-auc:0.85446	valid-auc:0.84750
[50]	train-auc:0.99286	valid-auc:0.98667
[100]	train-auc:0.99655	valid-auc:0.99012
[150]	train-auc:0.99805	valid-auc:0.99180
[200]	train-auc:0.99883	valid-auc:0.99296
[250]	train-auc:0.99926	valid-auc:0.99353
[300]	train-auc:0.99950	valid-auc:0.99392
......
[1150]	train-auc:1.00000	valid-auc:0.99535
[1200]	train-auc:1.00000	valid-auc:0.99537
[1250]	train-auc:1.00000	valid-auc:0.99534
[1300]	train-auc:1.00000	valid-auc:0.99535
[1319]	train-auc:1.00000	valid-auc:0.99536

6.2 特征重要程度情况 

data = scores[:40][::-1]
# 解包数据
labels, values = zip(*data)

# 创建图形和轴对象
fig, ax = plt.subplots(figsize=(10, 10))

# 绘制柱状图
bars = ax.barh(labels, values)

# 添加标题和标签
ax.set_title('特征词重要程度分布', fontsize=16)
ax.set_xlabel('Words')
ax.set_ylabel('Frequency')

# 显示图表
plt.xticks(rotation=45, ha='right')  # 旋转 x 轴标签以适应
plt.tight_layout()  # 自动调整子图参数,使之填充整个图像区域
plt.show()

6.3 模型性能评估

# predict test
dtest = xgb.DMatrix(count_test, feature_names=feature_names)
xgb_pred = xgb_model.predict(dtest)

xgb_pred = (xgb_pred > 0.5).astype(int)

print(classification_report(y_test, xgb_pred))

        可以看出,Xgboost 模型测试预测准确率达到了 97%!

        绘制模型预测混淆矩阵:

plt.figure(figsize = (8,6))

sns.heatmap(confusion_matrix(y_test, xgb_pred), annot=True, 
            fmt='', cmap='Blues')

plt.xlabel('Predicted Labels')
plt.ylabel('Real Labels')
plt.show()

7. 虚假新闻智能检测系统

7.1 系统首页

        系统首页提供简洁明了的界面设计,包括系统名称、主要功能简介以及使用指南等内容。用户可以通过主页快速了解系统的基本流程及注意事项。

7.2 虚假新闻特征分析

        虚假新闻特征分析模块中,将 jupyter notebook 中可视化分析结果进行综合展示:

7.3 虚假新闻在线检测

        (1)虚假新闻样本检测

        (2)真实新闻样本检测

8. 总结

        本项目旨在开发一个基于机器学习的虚假新闻智能检测系统,通过构建新闻文本的 BoW 词袋模型,并训练朴素贝叶斯和Xgboost两种模型,经性能优化,虚假新闻检测准确率达到 97%,实现了利用先进的自然语言处理技术对新闻文本进行智能检测。

欢迎大家赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的学长 QQ 名片 :)

精彩专栏推荐订阅:

1. Python-数据挖掘实战案例

2. Python-深度学习实战案例

3. Python-管理系统实战案例

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

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

相关文章

基于gewechat制作第一个微信聊天机器人

Gewe 个微框架 GeWe(个微框架)是一个创新性的软件开发框架,为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程,使开发者能够高效、灵活地构建和定制通信协议,以满足不同应用场景的需求…

SSL---SSL certificate problem

0 Preface/Foreword 0.1 SSL certificate problem 开发过程中,gitlab-runner连接gitlab时候出现SSL 证书问题。 场景:公司的gitlab runner服务器引入了SSL证书,每年都会主动更新一次。当前的gitlab-runner运行在PC机器上,但是g…

ZYNQ使用XGPIO驱动外设模块(前半部分)

目录 目录 一、新建BD文档,添加ZYNQ处理器 1.BD文档: 2.在Vivado中,BD文件的生成过程通常包括以下步骤: 1)什么是Tcl Console: 3.PL部分是FPGA可编程逻辑部分,它提供了丰富的IO资源,可以用于实现各种硬件接口和功…

刘文超数量关系笔记

第一章解题技巧 第一节代入排除法 代入排除是数量关系第一大法。 代入排除顾名思义是将答案选项代入原题目,与题意不符的选项即可排除, 最终得出正确答案。 优先使用代入排除的题型: (1)多位数问题、余数问题、年龄…

node.js服务器基础

node.js的事件循环 node.js是基于事件驱动的,通常在代码中注册想要等待的事件,设定好回调函数,当事件触发的时候就会调用回调函数。如果node.js没有要处理的事件了,那整个就结束了;事件里面可以继续插入事件,如果有事…

【2021】知识图谱导论(陈华钧)——阅读思考与笔记

tips:其中所有【】表示的内容为博主本人想法,非作者观点,请注意辨别。 这是一本全面覆盖知识图谱多个方面的书籍。书中不仅详细介绍了知识图谱的表示、存储、获取、推理、融合、问答和分析等七大方面,还深入探讨了多模态知识图谱…

【Nginx系列】Nginx启动失败

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

[⑦5G NR]: PSS/SSS同步信号学习

在5G中,PSS(Primary Synchronization Signal) 主同步信号和SSS(Secondary Synchronization Signal)辅同步信号是用于物理层的信号,用于小区的搜索。 PSS 跟据协议38.211 7.4.2.2章节,PSS是3条长度为127的m序列,分别对应 N I D (…

空间解析几何4-空间中线段到圆的距离【附MATLAB代码】

目录 理论公式 matlab代码 理论公式 对于解一元4次方程,请详见我的博客 一元四次方程求解 -【附MATLAB代码】-CSDN博客文章浏览阅读1.4k次,点赞41次,收藏4次。最近在研究机器人的干涉(碰撞)检测,遇到了一…

义堂镇韦家巷村第十六届老人节暨孝善互助基金启动仪式成功举行

金秋十月爽,浓浓敬老情。10月11日晚,以“孝善韦家巷情暖重阳节”为主题的兰山区义堂镇韦家巷村第十六届老人节暨韦家巷村孝善互助基金启动仪式在韦家巷村文化广场盛大举行。 山东省民间文艺家协会副主席、临沂市民间文艺家协会主席、临沂市文联办公室主…

使用git页面如何用旧项目创建一个新项目出来并且保留所有分支内容和提交历史

使用git页面如何用旧项目创建一个新项目出来并且保留所有分支内容和提交历史 1、点击创建项目 2、点击导入项目

antd table合并复杂单元格、分组合并行、分组合并列、动态渲染列、嵌套表头

项目里遇到个需求,涉及到比较复杂的单元格合并 、嵌套表头、分组合并行、合并列等,并且数据列还是动态的,效果图如下: 可以分组设置【显示列】例如:当前组为【合同约定】,显示列为【合同节点】和【节点金额…

Milvus向量数据库管理工具[Attu]实践

Attu是一款专为Milvus向量数据库打造的开源数据库管理工具,提供了便捷的图形化界面,极大地简化了对Milvus数据库的操作与管理流程。阿里云Milvus集成了Attu,以便更加高效地管理数据库、集合(Collection)、索引&#xf…

protobufJavascrip编码解码演示

protobuf&Javascrip编码解码演示 start 写一下 protobuf 相关知识记录在 python 环境和 js 环境中如何处理 protobuf。 1. protobuf是什么? 1.1 介绍 Protocol Buffers(简称Protobuf) ,是Google出品的序列化框架,与开发语言无关&…

【Go】GO语言知识总结浅析

Go语言是一种现代化的编程语言,由Google于2007年设计并于2009年发布。它旨在使编程变得简单、高效,并且可以在多核处理器上轻松构建高性能应用。Go语言的编程思想、发展历史、版本特点、运行原理、数据类型、应用场景,以及在web开发、网络编程…

C语言内存分配

概要 C语言的内存存储是一个复杂但非常重要的主题,涉及到静态内存、动态内存、指针、堆栈等多种机制,明白了c语言的内存分配,可以帮助我们更好的编程和学习c语言。 一.内存分配的类型 在C/C中内存分为5个区,分别为栈区、堆区、…

上海大爷惹恼韭菜不敢现身了

国庆节前股市暴涨,立即掀起了一股“全民炒股”热浪,但天不遂人愿,有大量韭菜散户很快就被套牢。 这与满嘴跑火车的上海大爷网红“爱在深秋”,曾鼓吹“A股会涨到上万点”多少有些关联。10月9日股市暴跌后,就不见他人影…

MySQL进阶 - SQL优化

01 插入数据 【一】insert优化: ① 不要一行一行插入数据,直接批量插入多行数据(但一个insert语句不要插入超过一千条)。 insert into 表名 (字段列表) values (xx,xx...),(xx,xx...)...; ② 在进行插入操作时手动提交事务,避免频…

【代码】集合set

哈喽大家好,我是学霸小羊,今天来讲一讲集合(set)。 在数学上,集合长这样: 那今天就来讲一讲编程上的集合。 集合的定义:把一些元素按照某些规律放在一起,就形成了一个集合。比如说…

PostgreSQL的学习心得和知识总结(一百五十四)|高级数据结构和算法之快速排序算法quicksort的实现及使用

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…