使用 Python 和机器学习检测假新闻

一、前言

该文章仅作为个人学习使用

项目源代码:使用 Python 和机器学习检测假新闻 - DataFlair (data-flair.training)

数据集:news.zip - Google 云端硬盘

二、理论知识

1、什么是假新闻?

假新闻是指故意编造、歪曲事实、不实信息或误导性内容的新闻报道。这些新闻通常旨在误导读者、操纵舆论、获得点击量或推动特定议程。假新闻可能会混淆事实和观点,制造虚假危机,破坏公信力,甚至对社会造成负面影响。因此,识别并避免传播假新闻对于确保信息的准确性和保护社会公共利益至关重要。

2、什么是 TfidfVectorizer?

TfidfVectorizer 是一种常用于文本特征提取和向量化的工具。它是指 “Term Frequency-Inverse Document Frequency Vectorizer” 的缩写。

具体说,TfidfVectorizer 主要用于将文本数据转换成文档-词项矩阵,其中每个文档由词项向量表示,向量中的每个元素是对应词项的 TF-IDF 权重。这些权重反映了词项在文档集合中的重要性,考虑到了词项在文档中的频率以及在整个文档集合中的频率。这种方法有助于突出在单个文档中频繁出现但在整个文档集合中罕见的词项,从而提供更好的文本表示。

总结说,TfidfVectorizer 通过计算每个词项的 TF-IDF 权重,将文本数据转换为可供机器学习算法处理的数值特征表示,是文本挖掘自然语言处理中常用的工具之一。

TF(术语频率):一个单词在文档中出现的次数就是它的术语频率。值越高意味着某个术语比其他术语出现得更频繁,因此,当该术语是搜索词的一部分时,该文档是很好的匹配项。

TF(术语频率)是指在文本挖掘和信息检索中用于衡量一个词项在文档中出现频率的指标。具体而言,TF 表示某个词项在文档中出现的次数,它是一个词项频率的度量。TF 的计算公式如下:

[ \text{TF}(t, d) = \frac{\text{词项 } t \text{ 在文档 } d \text{ 中出现的次数}}{\text{文档 } d \text{ 的总词项数}} ]

其中,( t ) 是要计算的词项(术语),( d ) 是文档。TF 反映了词项在单个文档中的重要程度,通常用于衡量一个词项对于文档内容的贡献度。

在文本挖掘中,TF 被用作特征表示的一部分,结合其他信息(如 IDF,逆文档频率)可以计算 TF-IDF 权重,用于更准确地表示和分析文本数据。

IDF(反转文档频率):在文档中出现多次的单词,以及在许多其他文档中多次出现的单词,可能是无关紧要的。IDF 是衡量一个术语在整个语料库中的重要性的指标。

IDF(Inverse Document Frequency,反转文档频率)是用于衡量一个词项在文档集合中重要性的指标,通常与TF(术语频率)一起使用来计算TF-IDF(术语频率-反转文档频率)权重。

具体而言,IDF 指标反映了一个词项在整个文档集合中的普遍重要程度。它的计算公式如下所示:

[ \text{IDF}(t) = \log \left( \frac{N}{df(t)} \right) ]

其中,

  • ( N ) 是文档集合中总文档数;
  • ( df(t) ) 是包含词项 ( t ) 的文档数目。

IDF 的核心思想是,如果一个词项在很多文档中出现(即 ( df(t) ) 较大),那么它的IDF值将较小,表明该词项对文档内容的区分能力较弱。相反,如果一个词项在少数文档中出现(即 ( df(t) ) 较小),那么它的IDF值将较大,表明该词项在文档集合中具有较高的区分能力和重要性。

在计算TF-IDF时,TF和IDF的乘积可以有效地减少常见词项(如“的”、“是”等)的权重,同时增强在单个文档中频繁出现但在整个文档集合中较为罕见的词项的权重,从而更好地表征文本内容的关键特征。

总结来说,IDF是一种用于衡量词项重要性的方法,常用于文本挖掘、信息检索和自然语言处理中的特征表示和权重计算。

TfidfVectorizer 将原始文档集合转换为 TF-IDF 特征矩阵。

3、什么是 PassiveAggressiveClassifier?

被动攻击算法是在线学习算法。这种算法对于正确的分类结果保持被动,并在计算错误、更新和调整时变得积极。与大多数其他算法不同,它不会收敛。其目的是进行更新以纠正损失,使权重向量的范数变化很小。

PassiveAggressiveClassifier 是一种机器学习算法,属于在线学习(online learning)的一种形式。它主要用于处理大规模数据流或在线学习环境下的分类问题

具体来说,Passive Aggressive Classifier(PAC)的名称源自其处理错误的方式。在训练过程中,当模型预测错误时,PAC会“ passively ”接受新的观察结果,然后“ aggressively ”调整模型以适应这些新的观察结果,使其能够正确分类当前的实例。这种特性使得PAC在处理动态数据流时特别有效,因为它可以快速适应数据的变化。

Passive Aggressive Classifier可以用于二分类多分类问题,并且在处理大规模数据集时通常表现出色。它的一大优势是不需要大量存储空间来保存训练数据,因为它可以通过增量学习的方式逐步更新模型,而不是在每次迭代中都保留完整的数据集。

总结来说,Passive Aggressive Classifier是一种适用于在线学习场景的分类算法,特别适合于需要处理大数据流并实时调整模型的应用环境。

三、使用 Python 检测假新闻

建立一个模型,准确地将一条新闻分类为真实或虚假。

1、关于使用 Python 检测假新闻

这个检测假新闻的高级 python 项目处理假新闻和真新闻。使用 sklearn,我们在数据集上构建了一个 TfidfVectorizer。然后,我们初始化一个 PassiveAggressive 分类器并拟合模型。最后,准确率分数和混淆矩阵告诉我们模型的表现如何。

2、假新闻数据集

我们将用于此 python 项目的数据集 - 我们称之为 news.csv。此数据集的形状为 7796×4。第一列标识新闻,第二列和第三列是标题和文本,第四列有标签表示新闻是真实的还是假的。数据集占用29.2MB空间,您可以在此处下载

3、项目先决条件

(1)、首先需要使用 pip 安装以下库:

pip install numpy pandas sklearn

(2)需要安装 Jupyter Lab 才能运行代码。转到命令提示符并运行以下命令:

(3)将会打开一个新的浏览器窗口

数据集可以不必放在同一目录下,这里为了我方便寻找,放在了这里,在C盘下

4、使用 Python 检测假新闻的步骤

按照以下步骤检测假新闻并完成该高级 Python 项目 

(1)、进行必要的导入:

截图:

解释:

  1. 导入库
    • import numpy as np:导入NumPy库,并使用别名np。NumPy通常用于Python中的数值操作。
    • import pandas as pd:导入Pandas库,并使用别名pd。Pandas用于数据处理和分析。
    • import itertools:导入itertools模块,提供了用于迭代和组合的函数。
    • from sklearn.model_selection import train_test_split:从Scikit-learn(sklearn)库中导入train_test_split函数,用于将数据数组随机拆分为训练集和测试集。
    • from sklearn.feature_extraction.text import TfidfVectorizer:同样从Scikit-learn中导入TfidfVectorizer,用于将原始文档集合转换为TF-IDF特征矩阵。
    • from sklearn.linear_model import PassiveAggressiveClassifier:从Scikit-learn中导入PassiveAggressiveClassifier,这是一种适用于大规模学习的分类算法。
    • from sklearn.metrics import accuracy_score, confusion_matrix:从Scikit-learn的metrics模块中导入accuracy_scoreconfusion_matrixaccuracy_score计算分类准确率,而confusion_matrix计算混淆矩阵,用于评估分类的准确性。

每个导入语句都引入了相应库(numpy、pandas、sklearn)中的特定功能,这些功能在后续代码中将用于数据处理、机器学习任务和评估指标。

(2)、将数据读取到 DataFrame 中,并获取数据的形状和前 5 条记录。

#Read the data
df=pd.read_csv('C:\\Users\\11767\\Work\\Python 检测假新闻\\news.csv') #注意该代码位置要根据自己的进行修改

#Get shape and head
df.shape
df.head()

截图:

解释:

当然,请让我逐行解释您提供的代码:

# 读取数据
df = pd.read_csv('C:\\Users\\11767\\Work\\Python 检测假新闻\\news.csv')

# 获取数据的形状(行数和列数)
df.shape

# 显示数据的前几行
df.head()
```

1. **读取数据**:
   - `df = pd.read_csv('C:\\Users\\11767\\Work\\Python 检测假新闻\\news.csv')`:使用Pandas库中的`read_csv`函数从指定路径读取名为'news.csv'的CSV文件,并将其存储在名为`df`的DataFrame对象中。文件路径'C:\\Users\\11767\\Work\\Python 检测假新闻\\news.csv'需要根据实际情况修改。

2. **获取数据形状和显示前几行**:
   - `df.shape`:返回DataFrame `df` 的形状,即行数和列数。这个操作没有被赋值给任何变量,所以形状信息会被显示出来。
   - `df.head()`:显示DataFrame `df` 的前几行数据,默认显示前5行。这个方法也没有被赋值给变量,因此会直接在控制台或Notebook中显示出来。

这些操作用于读取和查看数据,以便在后续的数据处理和机器学习任务中使用。

(3)、 从 DataFrame 中获取标签。
#DataFlair - Get the labels
labels=df.label
labels.head()
截图:
解释:
  1. 获取标签

    • labels = df.label:从DataFrame df 中获取名为label的列,并将其存储在名为labels的变量中。这假设df中有一个名为label的列,用于存储数据的标签信息。
  2. 显示标签的前几行

    • labels.head():显示存储在labels变量中的数据的前几行。这个方法默认显示前5行的数据,用于快速查看标签数据的样式和内容。
(4)、 将数据集拆分为训练集和测试集。
#DataFlair - Split the dataset
x_train,x_test,y_train,y_test=train_test_split(df['text'], labels, test_size=0.2, random_state=7)

截图:

解释:
  1. 分割数据集

    • df['text']:从DataFrame df 中选择名为text的列,这列通常包含文本数据,假设这是用于训练或测试的文本特征。
    • labels:存储数据集中相应文本的标签信息,前面已经从DataFrame df 中提取过。
    • train_test_split():这是一个用于将数据集分割成训练集和测试集的函数,来自于sklearn.model_selection模块。
      • test_size=0.2:表示将数据集的20%分配给测试集,剩余80%用作训练集。
      • random_state=7:为了确保每次运行时分割的结果都相同,设置一个随机种子值。
  2. 变量分配

    • x_train:训练集中的文本特征数据,是一个Series对象,包含了训练集的文本内容。
    • x_test:测试集中的文本特征数据,也是一个Series对象,包含了测试集的文本内容。
    • y_train:训练集中的标签数据,与x_train中的文本一一对应。
    • y_test:测试集中的标签数据,与x_test中的文本一一对应。
(5)、初始化  TfidfVectorizer 

 让我们使用来自英语的停用词初始化一个 TfidfVectorizer,最大文档频率为 0.7(文档频率较高的术语将被丢弃)。

停用词是语言中最常见的单词,在处理自然语言数据之前要过滤掉这些单词。TfidfVectorizer 将原始文档集合转换为 TF-IDF 特征矩阵。

现在,在训练集上拟合和变换矢量化器,并在测试集上变换矢量化器。

#DataFlair - Initialize a TfidfVectorizer
tfidf_vectorizer=TfidfVectorizer(stop_words='english', max_df=0.7)

#DataFlair - Fit and transform train set, transform test set
tfidf_train=tfidf_vectorizer.fit_transform(x_train) 
tfidf_test=tfidf_vectorizer.transform(x_test)

截图:

解释:
  1. 初始化一个 TfidfVectorizer

    • TfidfVectorizer 是用于将文本集合转换为 TF-IDF 特征矩阵的工具,来自于 sklearn.feature_extraction.text 模块。
    • stop_words='english':表示在构建文本特征矩阵时要过滤掉英文常用停用词,例如 “the”, “is”, “at” 等。
    • max_df=0.7:表示忽略出现在超过70%文档中的高频词语,可以帮助去除频繁出现但对区分文档无帮助的词语。
  2. 拟合和转换训练集,转换测试集

    • tfidf_vectorizer.fit_transform(x_train):对训练集 x_train 进行拟合和转换,即构建训练集的 TF-IDF 特征矩阵 tfidf_trainfit_transform 方法会学习训练集中的词汇表,并将训练集文本转换为 TF-IDF 特征表示。
    • tfidf_vectorizer.transform(x_test):对测试集 x_test 进行转换,即根据训练集的词汇表构建测试集的 TF-IDF 特征矩阵 tfidf_test
    • transform 方法将测试集文本转换为与训练集相同的特征表示,确保了训练和测试数据使用相同的词汇表和特征转换方式。
(6)、 初始化 PassiveAggressiveClassifier

我们将初始化 PassiveAggressiveClassifier。这是。我们会把它放在tfidf_train和y_train上。

然后,我们将从 TfidfVectorizer 对测试集进行预测,并使用 sklearn.metrics 中的 accuracy_score() 计算准确率。

#DataFlair - Initialize a PassiveAggressiveClassifier
pac=PassiveAggressiveClassifier(max_iter=50)
pac.fit(tfidf_train,y_train)

#DataFlair - Predict on the test set and calculate accuracy
y_pred=pac.predict(tfidf_test)
score=accuracy_score(y_test,y_pred)
print(f'Accuracy: {round(score*100,2)}%')

截图:

解释:
  1. 初始化一个 PassiveAggressiveClassifier

    • PassiveAggressiveClassifier 是一种在线学习算法,用于处理大数据流并适应变化,来自于 sklearn.linear_model 模块。
    • max_iter=50:指定模型的最大迭代次数为50次,控制模型的训练过程。
  2. 在训练集上拟合模型

    • pac.fit(tfidf_train, y_train):使用训练集的 TF-IDF 特征矩阵 tfidf_train 和对应的标签 y_train 来训练 PassiveAggressiveClassifier 模型。
  3. 在测试集上进行预测并计算准确率

    • pac.predict(tfidf_test):使用训练好的模型在测试集的 TF-IDF 特征矩阵 tfidf_test 上进行预测,得到预测结果存储在 y_pred 中。
    • accuracy_score(y_test, y_pred):使用真实标签 y_test 和模型预测结果 y_pred 计算模型在测试集上的准确率。
    • print(f'准确率: {round(score*100,2)}%'):将计算得到的准确率打印输出,保留两位小数,显示在百分比形式下。

(7)、 我们用这个模型得到了 92.82% 的准确率。最后,让我们打印出一个混淆矩阵,以深入了解假负和真负和正的数量。

#DataFlair - Build confusion matrix
confusion_matrix(y_test,y_pred, labels=['FAKE','REAL'])

截图:

因此,使用此模型,我们有 589 个真阳性、587 个真阴性、42 个假阳性和 49 个假阴性。

解释:
  1. 构建混淆矩阵
    • confusion_matrix():这是一个用于计算混淆矩阵的函数,来自于 sklearn.metrics 模块。
    • y_test:测试集的真实标签,包含了实际的类别信息。
    • y_pred:模型在测试集上的预测结果,包含了模型预测的类别信息。
    • labels=['FAKE', 'REAL']:指定了混淆矩阵中各行和列的标签顺序,即混淆矩阵的类别标签。这里的顺序是预测结果为“FAKE”和“REAL”。

该函数的输出是一个二维数组,展示了分类器在测试集上预测结果与真实标签之间的对应关系,用于评估分类器的性能。

四、总结

通过学习 Python 检测假新闻。获取了一个数据集,实现了一个 TfidfVectorizer,初始化了一个 PassiveAggressiveClassifier,并拟合了我们的模型。我们最终获得了 92.82% 的准确率。

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值