近年来,随着越来越多的新闻通过在线渠道传播,辨别新闻真伪变得至关重要。本文以一种有趣的方式探讨了如何使用Python中的深度学习方法来解决这一问题。文章分为五个部分:数据描述、预处理、嵌入层、模型架构和结果分析。
本任务的数据来源于Kaggle的一个数据集,包含约45K的新闻文章。其中大约一半的数据是从被事实核查组织认定为不可靠的美国网站中抽取的虚假文章,另一半则是从路透社这个美国新闻网站抽取的真实文章。这些文章的例子如下所示。由于所有文章都来自美国来源,且所有真实文章都来自同一个美国来源,这显然不是一个完美的假新闻数据集。其他人也识别出了数据集中的一些泄露问题。泄露是指在模型的训练数据中存在信息,但在现实世界中模型无法访问这些信息。在预处理中将采取措施尽量减少这种泄露的影响。尽管存在这些不足,产生该数据集的原始论文在Google Scholar上已有近200次引用,并且似乎是唯一公开可用的假新闻数据集。
预处理的第一步是加载数据并创建一个字段来指示文章是否为虚假(1)或真实(0)。使用每个文章的标题和文本字段去重,然后将它们合并到一个长的“all_text”字段中。为了解决之前识别的泄露问题,删除了日期和主题列,以及一些信息性关键词(如“reuters”、“politifact”等)。
# 导入库
import pandas as pd
# 读取数据
fake = pd.read_csv('Fake.csv')[:1000] # 仅取1000个值以快速计算
true = pd.read_csv('True.csv')[:1000]
# 添加列以指示是否为虚假(1)或真实(0)
fake["fake_news"] = 1
true["fake_news"] = 0
# 合并
df = pd.concat([fake, true])
# 创建一个合并的文本列
df["all_text"] = df.title.str.strip() + " " + df.text.str.strip()
# 删除与信息泄露相关的某些词汇
df["all_text"] = df["all_text"].str.replace("reuters|true|false|washington|verified|politifact|donald trump|21st century wire","",case = False,regex = True)
# 删除重复的文本
df = df.drop_duplicates(subset = "text").reset_index(drop = True)
# 删除重复的标题
df = df.drop_duplicates(subset = "title").reset_index(drop = True)
# 选择相关列
df = df[["all_text", "fake_news"]]
print(df.head())
预处理的下一步是整理文本数据并将其转换为数字序列。神经网络需要数字才能学习/预测,因此数据集中的每个唯一单词都需要首先转换为数字。Keras的Tokenizer和pad_sequences函数可以非常容易地为处理这个问题。Tokenizer过滤掉特殊字符并将文本转换为小写。然后它将每个唯一单词(即令牌)映射到一个数字,以便所有文章中的每个单词现在都可以用一个单一的数字表示。pad_sequences确保所有这些数字序列的长度相同(500个令牌长),通过预填充太短的文章或通过后截断太长的文章。这是必要的,因为Keras需要输入长度相同(有关更全面的讨论,请参阅此处)。