基于机器学习的虚假新闻智能检测系统

发布于:2024-10-13 ⋅ 阅读:(51) ⋅ 点赞:(0)

温馨提示:文末有 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 名片 :)

精彩专栏推荐订阅:

1. Python-数据挖掘实战案例

2. Python-深度学习实战案例

3. Python-管理系统实战案例