Python 假新闻检测器

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

现代民主国家面临着假新闻传播的严峻问题。不准确的信息会影响人们的健康和福祉,尤其是在 COVID-19 疫情的艰难时期。虚假信息还通过阻止人们根据核实信息做出明智的结论,从而破坏公众对民主制度的信心。令人不安的研究表明,假新闻比真实新闻传播得更快,触及的人更多,尤其是在社交媒体上。麻省理工学院的研究人员称,在 Twitter 和 Facebook 等社交媒体平台上,假新闻的传播几率比真实新闻高出 70%。

Fake News Detector using Python

国家和其他组织将假新闻行动作为一种现代信息战形式,以削弱其对手的力量和权威。欧盟官员声称,中国和俄罗斯的虚假信息活动已经瞄准欧洲国家,传播关于包括 COVID-19 疫情在内的各种主题的不实信息。为解决这个问题,成立了东部战略沟通工作组,通过观察和消除关于欧盟成员国的虚假信息。

核实已发布新闻准确性的人被称为事实核查员。这些专家通过指出其不准确之处来揭露假新闻。研究表明,计算机学习和自然语言处理 (NLP) 算法可以增强传统的事实核查。在本教程中,我们将介绍如何使用 Python 编程语言创建一个可以识别虚假新闻文章的 Web 应用程序。

项目目标:由于社会欺骗,在当今环境下,要确定我们收到的新闻是否真实变得越来越困难。因此,我们可以利用机器学习来识别新闻的原创性,以确定所提供的新闻是真实的还是虚假的。如果不是,这些新闻报道可能会做出不正确或夸大的陈述,通过计算变得虚拟化,读者可能会遇到“过滤气泡”。

被动攻击分类器

机器学习中用于检测方法的类包括被动攻击分类器。它对准确分类做出被动响应,对错误分类做出积极响应。系统通过顺序、单独或以称为小批量(mini-batches)的小组形式馈送示例,使用检测方法被动攻击分类器进行逐步训练。可以说,它对错误的预测做出强烈反应,而对正确的预测保持被动。现在,让我们看看如何使用 Python 编程语言创建攻击性被动分类器。

工具和库

在 Python 假新闻检测项目中,我们使用以下库

  • Python - 3.x
  • Pandas - 1.2.4
  • Scikit-learn - 0.24.1
  • spacy
  • streamlit
  • matplotlib

假新闻数据集

每个人工智能项目都需要一个合适且值得信赖的数据集才能成功。有许多公开可用的假新闻数据库,例如 LIAR3 和 FakeNewsNet4,但遗憾的是,大多数只包含英语项目。我选择创建自己的数据集,因为我们找不到包含文章的数据集。假新闻数据集由原始和虚假新闻文章组成,除用于文本分类模型训练外,还可用于各种 NLP 应用。

构建数据集的方法如下。首先,使用可信的出版物和网站收集新闻报道。我更新了新闻,主要集中在关于政治、经济、 COVID-19 疫情和国际事务的故事。我使用了 Ellinika Hoaxes,这是一个被国际事实核查网络 (IFCN) 批准的事实核查网站,以检测虚假新闻报道。该数据集还包括已证明有误的报道样本。随后,将该过程产生的数据集用于训练假新闻检测应用程序的文本分类模型。

构建假新闻检测模型的主要步骤

步骤 1:导入数据集

现在正在读取 CSV 文件 fake__or__real__news.csv。我们将使用此数据集来尝试确定一条新闻是真实的还是假的。它有三列 - id、title、text 和 label - 以及 20800 列,即条目数。

源代码片段

输出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20800 entries, 0 to 20799
Data columns (total three columns):
id       20800 non-null int64
title    20242 non-null object
label    20800 non-null object
dtypes: int64(1), object(2)
memory usage: 487.6+ KB

步骤 2:数据清理

文本数据包含许多不恰当的词语、特殊符号和其他因素,导致我们无法直接使用。如果我们不进行清理直接使用文本,ML 算法会很难发现其中的模式,有时甚至会产生错误。因此,我们必须始终先对文本数据进行清理。在此项目中,我们正在创建一个名为“cleaning_data”的函数来清理数据。

源代码片段

正如我们所见,需要执行以下操作

  • 删除停用词:停用词是无论事实如何都不会为任何文本添加任何内容的词。例如,“I”、“a”、“am”等。通过减少语料库的大小,我们可以从语料库中排除这些词,以便只为具有真正信息价值的词和标记腾出空间。
  • 词干提取:词形还原和词干提取是两种将词还原为其词干或词根的策略。此过程的主要好处是减小词汇量。例如,“Play”将替换“Play”、“Playing”和“Played”等词。
  • 词干提取会忽略文本的语法结构,并将单词缩短到可能的最小长度。另一方面,词形还原也考虑语法因素并产生更好的结果。词形还原必须查阅词典并考虑语法因素。因此,它通常比词干提取慢。
  • 消除除字母值以外的所有内容:由于非字母值在此情况下没有用,因此可以将其删除。您可以进一步研究是否存在数值或其他类型的数据会影响目标。
  • 小写以下内容:为了减小词汇量,将单词小写。
  • 通过创建标记来标记句子。

Python 库 spaCy

有许多先进的 Python 库可用于 NLP 任务。最著名的是 spaCy,这是一个 NLP 库,包含预训练模型,并支持 60 多种语言的标记化和指令。spaCy 包包含词形还原、形态分析、词性标注、句子分割、文本分类、命名实体识别等功能。此外,spaCy 是可靠的、可用于生产的软件,可应用于实际产品。Jtp 虚假新闻检测应用程序的文本分类模型就是使用此库开发的。

首先导入 Streamlit、spaCy 和其他必需的库。然后,我们定义 get__nlp__model() 方法,该方法加载早期训练的 spaCy 文本分类模型。@st.cache 装饰器用于指定函数,允许 Streamlit 将设计存储在本地缓存中,从而提高效率。然后,使用 markdown() 方法和一些标准 HTML 标记,我们构建 generate__output() 函数,该函数输出分类结果。然后,文章内容会生成可选的词云进行可视化。

Streamlit 框架

借助 Python 框架 Streamlit,您可以轻松地为数据科学项目创建 Web 应用程序。您只需几行代码即可使用各种小部件快速设计用户界面。此外,Streamlit 是创建出色的数据可视化和将机器学习模型公开到 Web 的绝佳工具。Streamlit 包含一个强大的缓存系统,可增强程序的性能。此外,库的创建者还提供一项名为 Streamlit Sharing 的免费服务,让您可以快速启动应用程序并与他人共享。

步骤 3:构建 Web 应用程序(训练模型)

创建虚假信息检测器有许多因素。为了提高我的技能并作为一名专业人士取得进步,我们决定使用 Streamlit,因为它非常适合这项工作。现在,我们将从文本分类模型的开发开始,概述源代码的功能。出于本教程的目的,代码已从 Jupyter notebook 更改为遵循 Python 文件 gfn__train.py 的代码。

源代码片段

输出

Training the model...
LOSS 	  P  	  R  	  F  
- - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - 
0.669	0.714	1.000	0.322
0.246	0.714	1.000	0.322
0.232	0.322	1.000	0.909
0.273	0.714	1.000	0.322
0.120	0.322	1.000	0.909
0.063	0.322	1.000	0.909
0.022	0.714	1.000	0.322
0.005	0.714	1.000	0.322
0.001	0.714	1.000	0.322
0.002	0.714	1.000	0.322
0.025	0.714	1.000	0.322
0.004	0.714	1.000	0.322
0.001	0.322	1.000	0.909
0.004	0.714	1.000	0.322
0.022	0.714	1.000	0.322
0.005	0.714	1.000	0.322
0.001	0.714	1.000	0.322
0.002	0.714	1.000	0.322
0.002	0.714	1.000	0.322
0.016	0.714	1.000	0.322
0.004	0.714	1.000	0.322
0.024	0.714	1.000	0.322
0.005	0.714	1.000	0.322
0.000	0.322	1.000	0.909

说明:在导入必要的 Python 模块之前,我们定义了两个辅助函数。load__data() 方法将数据集分成测试集和训练集,打乱数据,并为每条新闻分配一个类别。evaluate() 函数计算可用于评估文本分类器性能的多种指标,包括精确率、召回率和 F 分数。在定义了辅助函数之后,我们加载了预训练的 spaCy 模型。考虑到我们处理的是语言文章,我使用了 el__core__news__md 模型。

我们通过删除一些额外的字符来清理 GFN 数据集,然后再将其加载到 pandas 数据框中。然后将文本组件添加到我们之前训练好的模型中。GFN 数据集将训练此组件并生成文本识别模型。然后,由于文本需要训练,我们禁用其他组件。然后加载数据集,并分别使用 load__data() 和 update() 方法训练模型。使用我们之前构建的 evaluate() 方法打印性能和训练指标。模型训练完成后,to__disk() 方法将模型存储起来。现在将检查 Streamlit Web 应用程序的主 app.py 文件。

整合代码:使用 Python 构建假新闻检测器(在 Jupytor Notebook 上运行此代码以查看相应输入的输出)

输出

array([1716, 1722, 122, 363, 311, 322, 236, 228, 220, 226, 223, 220, 206, 202, 283, 282, 280, 278, 275, 266, 266, 261, 262, 256, 255, 253, 252, 215, 211, 213, 237, 233, 232, 232, 230, 226, 228, 225, 221, 223, 222, 222, 220, 226, 228, 227, 226, 221, 222, 220, 206, 208, 206, 205, 201, 203, 202, 202, 200, 66, 68, 67, 66, 65, 61, 63, 62, 60, 86, 88, 87, 86, 81, 83, 82, 76, 78, 77, 76, 75, 71, 73, 72, 72, 70, 66, 68, 67, 66, 65, 61, 63, 62, 62, 60, 56, 58, 57, 56, 55, 51, 53, 52, 52, 50, 16, 18, 17, 16, 15, 11, 13, 12, 12, 10, 36, 38, 37, 36, 35, 31, 33, 32, 32, 30, 26, 28, 27, 26, 25, 21, 23, 22, 221, 223, 222, 222, 220, 226, 228, 227, 226, 221, 222, 220, 206, 208, , 280, 278, 275, 266, 266, 261, 262, 256, 255, 253, 252, 215, 211, 213, 237, 233, 232, 232, 230, 226, 228, 225, 221, 223, 222, 222, 220, 226, 228, 227, 226, 221, 222, 206, 205, 201, 203, 202, 202, 200, 66, 68, 67, 66, 65, 61, 63, 62, 60, 86, 88, 87, 86, 81, 83, 82, 76, 78, 77, 76, 22, 20, 26, 28, 27, 26, 25, 21, 23, 22, 22, 20, 6, 8, 7, 6, 5, 1, 3, 2, 2])

输出

Training the model...
LOSS 	  P  	  R  	  F  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
0.669	0.714	1.000	0.322
0.246	0.714	1.000	0.322
0.232	0.322	1.000	0.909
0.273	0.714	1.000	0.322
0.120	0.322	1.000	0.909
0.063	0.322	1.000	0.909
0.025	0.714	1.000	0.322
0.004	0.714	1.000	0.322
0.001	0.322	1.000	0.909
0.004	0.714	1.000	0.322
0.022	0.714	1.000	0.322
0.005	0.714	1.000	0.322
0.001	0.714	1.000	0.322
0.002	0.714	1.000	0.322
0.002	0.714	1.000	0.322
0.016	0.714	1.000	0.322
0.004	0.714	1.000	0.322
0.024	0.714	1.000	0.322
0.005	0.714	1.000	0.322
0.000	0.322	1.000	0.909

输出

{'REAL': 1.9296246378530668e-08, 'FAKE': 1.0}

说明:然后使用各种 Streamlit 小部件创建程序的布局。首先设置页面横幅和描述。其次,我们开发了一个按钮作为单选小部件,用于选择输入类型。然后,用户可以选择提供文章链接或文本。如果用户选择文章 URL 作为输入类型,则使用 get__page__text() 方法收集文本。用户还可以将内容粘贴到多行文本输入框中。generate__output() 方法在两种情况下均由按钮小部件调用,对文章进行分类并报告结果。最后,我们可以使用 streamlit run app.py 命令在本地运行应用程序,或使用免费的 Sharing Service 程序进行发布。

结论

阅读完本教程后,我们希望您能更好地理解应用机器学习和自然语言处理来解决假新闻这一重大问题的可能性。此外,我们使用了 TF-IDF1 向量化器来向量化文本数据。有多种向量化器,如 Hashes Vectorizer、Count Vectorizer 等,它们可以更好地完成这项任务。为了确定您是否能获得更好的结果,请尝试并测试不同的算法和策略。