温馨提示:文末有 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 名片 :)
精彩专栏推荐订阅: