在本千年,技术发展迅速,带来了众多新闻渠道的出现,包括电子媒体(如在线和电视)和印刷媒体。平台和渠道数量的增加也带来了日益激烈的竞争。为了吸引观众的注意力,尤其是电子媒体,有时会采用耸人听闻的方式来吸引眼球,有时甚至涉及到假新闻。机器学习在区分真实新闻和假新闻方面显示出了潜力。本文将使用数据集来探讨机器学习在检测假新闻中的技术细节。
本文使用的数据集包含了真假新闻,可以通过以下链接下载:
https://www.kaggle.com/datasets/clmentbisaillon/fake-and-real-news-dataset
首先,将导入以下代码行中提到的依赖项:
import numpy as np
import pandas as pd
import re
from nltk.corpus import stopwords
from nltk.stem.wordnet import WordNetLemmatizer
import string
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
首先导入numpy、pandas和re。‘re’是一个内置包,代表正则表达式。然后,将导入nltk中的stopwords,stopwords是一些不太重要的词,如a、an等。接下来,将导入WordNetLemmatizer进行词形还原,这是一种将词转换为其基本形式的过程。
词形还原是将词转换为其基本形式的过程。还有一个过程叫做词干提取,它也做同样的事情,但词形还原比词干提取更具上下文相关性。将使用nltk.stem中的WordNetLemmatizer进行词形还原。
在开发数据模型之前,需要对数据进行预处理。使用shape函数,可以识别数据的行数和列数。
data.shape
数据显示有44898行和5列。然后,使用head()函数打印数据的前5行。
data.head()
使用isnull()函数查找数据集中的缺失值。
data.isnull()
输出显示数据集中没有缺失或空值。接下来,将列合并到一个名为‘content’的公共pandas数据框中。
data['content'] = data['title'] + ' ' + data['text']
然后,使用print函数生成content的输出。
print(data['content'])
现在,将数据和目标分开。
X = data.drop(columns='Target', axis=1)Y = data['Target']
然后,打印存储在变量X和Y中的数据和目标。
print(X)print(Y)
将进行词形还原,将词转换为其基本形式。
def clean(doc):
stop = stopwords.words('english')
punct = string.punctuation
wnl = WordNetLemmatizer()
stopwords_free = " ".join([i for i in doc.lower().split() if i not in stop])
punctuations_free = "".join(ch for ch in stopwords_free if ch not in punct)
normalized = " ".join(wnl.lemmatize(word) for word in punctuations_free.split())
return normalized
然后,打印content数据框。
print(data['content'])
接下来,将使用.values方法查看字典的值作为列表。还将分离存储在X和Y中的数据和目标,并打印两者。
X = data['content'].valuesY = data['Target'].valuesprint(X)print(Y)
现在,将使用TfidfVectorizer将文本数据转换为数值数据。
vectorizer = TfidfVectorizer()vectorizer.fit(X)X = vectorizer.transform(X)
已经对X进行了转换。现在,将打印X以查看转换结果。
print(X)
从上述输出中,可以推断出‘X’已成功转换。接下来,将数据集分割为训练和测试数据。
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, stratify= Y, random_state=5)
在上述代码行中,测试数据将是数据集的20%。
模型开发的第一步是训练模型。这里,将使用逻辑回归分类算法来区分假新闻和真新闻。这将通过拟合数据来完成。
model = LogisticRegression()model.fit(X_train, Y_train)
模型已经开发完成,现在将评估模型。
模型评估是通过准确度分数和混淆矩阵来完成的。首先,将使用以下代码行获得训练数据集的准确度分数。
X_train_prediction= model.predict(X_train)training_data_accuracy = accuracy_score(X_train_prediction, Y_train)
然后,将找到训练数据集的准确度分数。
print('训练数据的准确度分数 : ', training_data_accuracy)
从上述输出中,训练数据集的准确度为99.19%,几乎达到了完美的100%。接下来,将找到测试数据集的准确度分数,代码与为训练数据集所做的非常相似。
X_test_prediction = model.predict(X_test)test_data_accuracy = accuracy_score(X_test_prediction, Y_test)
然后,将找到测试数据集的准确度分数。
print('测试数据的准确度分数 : ', test_data_accuracy)
从上述输出中,测试数据集的准确度为98.99%,几乎达到了99%。最后一步是生成一个混淆矩阵,以识别数据集被分类为真阳性、真阴性、假阳性和假阴性的百分比。混淆矩阵如下所示:
预测:是
预测:否
总计
实际:是
a (T.P)
b (F.N)
a+b (实际是)
实际:否
c (F.P)
d (T.N)
c+d (实际否)
总计
a+c (预测是)
b+d (预测否)
a+b+c+d
在这里,T.P = 真阳性,F.N = 假阴性,F.P = 假阳性,T.N = 真阴性。
print(confusion_matrix(X_test_prediction,Y_test))
在这个数据集中,模型可以将4243分类为T.P,将4647分类为F.P,表明误分类的百分比很小。