news 2026/9/28 12:47:04

Python虚假新闻检测系统:从模型选型到Web部署的完整实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python虚假新闻检测系统:从模型选型到Web部署的完整实践

简介:基于Python的虚假新闻检测完整项目,面向计算机专业毕业设计、课程设计以及希望上手NLP文本分类的开发者,提供从数据清洗、特征构造、模型训练到Web端结果展示的闭环参考方案。压缩包共16个文件,以9个Python脚本为核心,分别对应数据处理(construct系列)、多模型实现(CNN、LSTM、BERT、传统机器学习)、AUC指标评估以及Web部署,另含4个CSV数据文件、依赖清单、LICENSE和说明文档,整体约6.07MB。已有204人学习下载,适合用作算法对比和系统扩展的基础。项目源码经过严格测试,可直接运行;配套开发文档和README说明清晰,便于在此基础上替换数据、调参或增加新模型,亦可直接提炼为毕业设计或课程设计报告素材。

1. 虚假新闻检测:这套 python 源码包的技术栈与适用场景

虚假新闻检测这几年在毕业设计和课程设计里出现频率很高,技术链路完整:文本处理、特征工程、深度学习、Web 可视化一条线全通。我拿到这套基于 python 开发的虚假新闻检测源码包后,先把文件过了一遍——ML_model.py、lstm_model.py、cnn_model_sen.py、bert_model_sen.py 四个模型,加上 construct.py 数据构造、calc_AUC.py 评估脚本和 web.py 前端入口,开箱就能看到完整技术栈。

这套资源适合两类人:选毕业设计题目的本科生,需要能跑通、能讲清原理的基线项目;做课程设计或项目开发,想拿完整文本分类样例来改的从业者。开发文档覆盖了环境配置和运行步骤,比网上零散贴代码的教程完整得多,LICENSE 也给了,拿来改不会惹版权麻烦。

但拿到手直接跑大概率翻车,依赖版本、数据路径、Python 环境都是坑。后面几章我把运行流程、参数设置和踩坑记录拆开讲,争取让你少走三五个晚上的弯路。

2. 模型选型与数据构造:四个模型文件如何分工

压缩包里的文件不算多,但每个文件名都直接暴露了职责。我的拆解顺序是「数据处理 → 模型训练 → 评估 → 展示」四层,其中模型层是答辩时最容易被追问的部分。四个模型文件看起来都在做二分类,实际定位完全不同,混着用会浪费机器时间,选错主模型还会让精度一直上不去。

2.1 四个模型的定位:传统基线、序列模型、卷积模型与预训练模型

ML_model.py 是传统机器学习基线。常见做法是拿 TF-IDF 把新闻文本转成稀疏词频向量,再喂给逻辑回归或 SVM。这类模型的最大优势是训练快、可解释性强,几秒出结果,适合作为整个项目的精度下限。毕设做模型对比时必须有这样一个「传统方法」作参照物,否则评委没法判断深度学习模型到底提升了几个点。

lstm_model.py 走的是序列建模路线。LSTM 擅长捕捉文本的前后依赖关系,虚假新闻里常见的话术转折、句式套路,本质上都藏在序列逻辑里。代价是训练比 CNN 慢,而且短文本上优势不明显,数据量不够时容易欠拟合。

cnn_model_sen.py 里的 sen 是 sentence 的意思,它做的是句子级别卷积。多个卷积核在词向量序列上滑动,本质是在提取局部 n-gram 特征,训练速度比 LSTM 快不少,在短文本分类场景里经常是性价比最高的选择。

bert_model_sen.py 是精度上限担当。BERT 是预训练语言模型,会把词的上下文语义完整编码进向量,对「真假新闻这种需要理解语义才能判断」的任务提升非常明显。代价是模型体积大、训练慢,而且需要加载预训练权重。我的建议是把它定位成「证明你理解前沿方法」的加分项,而不是默认主模型,否则光训练等待就能耗掉你两天时间。

2.2 construct.py 三件套:原始数据是怎么变成训练样本的

construct.py、construct_train.py、construct_test.py 三个文件组成数据流水线。construct.py 负责核心逻辑,比如读原始 CSV、清洗文本、按比例切分;construct_train.py 和 construct_test.py 分别产出训练集和测试集。我按常见的数据构造流程给你示意一下:

# construct.py 核心逻辑示意:原始 CSV -> 训练集/测试集 import pandas as pd from sklearn.model_selection import train_test_split def load_raw_data(path="data/raw.csv"): # 原始数据至少包含 text(新闻正文)和 label(0 真实 / 1 虚假)两列 df = pd.read_csv(path, encoding="utf-8") return df def build_dataset(df, train_ratio=0.8): train, test = train_test_split( df, test_size=1 - train_ratio, random_state=42, stratify=df["label"], # 按标签分层抽样,避免正负样本比例失衡 ) train.to_csv("data/train.csv", index=False) test.to_csv("data/test.csv", index=False) print(f"train={len(train)}, test={len(test)}")

train_test_split 里的 stratify 参数是这套流程里最关键的细节。如果原始数据里真实新闻和虚假新闻比例是 6:4,分层抽样能保证切出来的训练集和测试集都保持 6:4,否则跑出来的 AUC 没有参考价值。random_state 固定成 42 是为了结果可复现,答辩时你重新跑一遍,指标应该和文档里一致。

2.3 requirements.txt 依赖清单:版本选型的三个原则

requirements.txt 里通常会锁定这几个库:torch、transformers、flask、pandas、scikit-learn、numpy,中文场景还会用到 jieba。版本号每个项目锁得不一样,我一般不看具体版本,而是先看本机 Python 版本再决定装哪套,因为 torch 对新版 Python 的支持是滞后的。

版本选型我遵循三个原则。第一,PyTorch 优先装 CPU 版起步,除非你确定机器有可用 NVIDIA 显卡,很多毕设机器根本没有 CUDA 环境,默认装 GPU 版会直接报错。第二,transformers 和 torch 的版本要匹配,transformers 老版本加载不了新格式权重,新版本又可能要求更高版本的 torch。第三,flask 不要装太新的版本,2.x 足够用,3.x 有些写法变动反而容易踩兼容坑。

3. 从零跑通:依赖安装、数据构造与 web.py 启动全流程

这一章按我实际跑项目的顺序来:先准备环境,再构造数据,接着训练模型,最后启动 web.py 做可视化检测。每一步都给你能直接复制的命令和代码,同时说明每个参数为什么这么设。

3.1 环境准备:先建虚拟环境再装依赖

我拿到这类 python 项目的第一动作永远是建虚拟环境,而不是直接 pip install。很多翻车案例都是因为系统 Python 环境里已经躺着一堆旧版本包,新项目一装依赖就把全局环境搞乱了。

# 创建并激活虚拟环境(Windows 用 venv 目录下的 activate.bat) python -m venv venv source venv/bin/activate # Linux / macOS # Windows: venv\Scripts\activate # 安装依赖 pip install -r requirements.txt # 核对关键库版本 pip list | grep -E "torch|transformers|flask|scikit-learn"

第一行创建虚拟环境,第三行激活,第五行安装依赖,最后一行核对版本。核对这步别省,因为 requirements.txt 锁的版本和你实际装上的可能不一致,尤其是 torch 这种大件。用 VS Code 的话,记得在右下角选择解释器时指向 venv 里的 python,否则你跑脚本时用的还是全局环境。

3.2 数据检查与构造:先跑 construct_train.py 再跑 construct_test.py

依赖装完先别急着训模型,先确认 data 目录里有什么。原包里 data 目录放的是原始数据,需要先跑构造脚本生成训练集和测试集。

# 先看数据目录结构 ls -R data # 执行训练集构造(假设脚本内部调用了 construct.py 的核心函数) python construct_train.py # 执行测试集构造 python construct_test.py # 确认产出文件 ls data/train.csv data/test.csv

跑之前我一般先用 Python 快速读一下原始 CSV,确认列名是不是 text 和 label。很多项目实际用的列名是 content 和 is_fake,不改对列名的话后面所有模型脚本都会报 KeyError。如果你发现列名对不上,最简单的做法是在 construct.py 里加一行重命名映射:

# 在 construct.py 的 load_raw_data 里补上列名映射 df = df.rename(columns={"content": "text", "is_fake": "label"})

这一步花两分钟,能避免后面所有模型脚本连环报错。跑完构造脚本后,data 目录下应该多出 train.csv 和 test.csv 两个文件,行数加起来等于原始数据总数。

3.3 训练与评估:ML 基线先行,calc_AUC.py 出指标

数据就绪后,训练顺序我建议 strict 按「ML → CNN → LSTM → BERT」来。ML 跑得最快,先拿它验证数据链路没问题,再上深度学习模型,不然一上来训 BERT,跑了两小时发现前面数据就错了,心态直接崩。

# ML_model.py 示意:TF-IDF + 逻辑回归基线 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score vectorizer = TfidfVectorizer(max_features=5000, ngram_range=(1, 2)) X_train = vectorizer.fit_transform(train_text) X_test = vectorizer.transform(test_text) clf = LogisticRegression(C=1.0, max_iter=500) clf.fit(X_train, train_label) y_prob = clf.predict_proba(X_test)[:, 1] print(f"ML baseline AUC={roc_auc_score(test_label, y_prob):.4f}")

TF-IDF 的 max_features 限制特征维度,5000 是文本分类里比较稳妥的起点;ngram_range=(1, 2) 同时保留单词和相邻词组合特征,对中文这种没有天然空格的语言,配合 jieba 分词后效果更明显。跑完 ML 基线,再用 calc_AUC.py 统一评估深度学习模型的输出:

# calc_AUC.py 示意:统一评估入口 import numpy as np from sklearn.metrics import roc_auc_score, accuracy_score def evaluate(y_true, y_prob): auc = roc_auc_score(y_true, y_prob) acc = accuracy_score(y_true, (np.array(y_prob) > 0.5).astype(int)) print(f"AUC={auc:.4f} Accuracy={acc:.4f}") return auc

AUC 比 Accuracy 更能反映类别不平衡下的真实能力。如果测试集里 80% 是真实新闻,模型全猜真实新闻 Accuracy 也有 80%,但 AUC 只有 0.5,直接露馅。

3.4 启动 web.py:本地可视化检测入口

模型训练完,就可以启动 web.py 做可视化演示了。这个文件通常用 Flask 实现一个简易页面,输入新闻文本,返回检测结果。

# 启动 Flask 服务 python web.py # 服务默认跑在 5000 端口,浏览器打开 http://127.0.0.1:5000
# web.py 示意:Flask 提供检测接口 from flask import Flask, request, jsonify, render_template import joblib app = Flask(__name__) model = joblib.load("model.pkl") # 训练保存的模型 vectorizer = joblib.load("vectorizer.pkl") # 对应的 TF-IDF 向量器 @app.route("/", methods=["GET"]) def index(): return render_template("index.html") @app.route("/predict", methods=["POST"]) def predict(): text = request.form.get("text", "") vec = vectorizer.transform([text]) prob = model.predict_proba(vec)[0][1] label = 1 if prob > 0.5 else 0 return jsonify({"label": label, "probability": round(float(prob), 4)}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=False)

几点说明:host 设为 0.0.0.0 是方便局域网里其他机器访问,如果只在本地演示,改成 127.0.0.1 更安全;debug=False 是必须的,开着 debug 模式容易暴露代码细节,线上环境更是高风险。预测接口里 label=1 表示判定为虚假新闻,probability 是对应的置信度,方便前端做展示。

4. 避坑实操:运行这套项目必踩的五个高频问题

这些年帮人调这类文本分类项目,百分之八十的报错集中在环境、数据、模型加载三个层面。下面按我亲测的频率排序,每条按「现象 → 原因 → 解决」写清楚。

4.1 环境层:torch、transformers 与 Python 版本三方打架

现象:pip install -r requirements.txt后,跑 cnn_model_sen.py 报ModuleNotFoundError: No module named 'torch',或者 transformers 加载权重时报版本不兼容错误。

原因:requirements.txt 里的版本锁是针对作者本机的,你自己的 Python 版本如果差了一个大版本,torch 的安装包可能根本选不到,或者装上了但 transformers 版本太旧,读不了新格式的模型文件。

解决:先python --version确认版本,然后单独装 torch:CPU 机器用pip install torch --index-url https://download.pytorch.org/whl/cpu,这是 PyTorch 官方 CPU 源,不依赖 CUDA。装完 torch 再重装一遍 transformers,让 pip 自动解析兼容版本。我踩过一次最狠的坑是 transformers 4.30 和 torch 1.10 组合,BERT 加载时一直报 shape 不匹配,升到 1.13 后就好了。

4.2 数据层:路径、列名与中文编码三联坑

现象:python construct_train.py报FileNotFoundError: [Errno 2] data/train.csv,或者数据读进来后中文全是乱码,模型精度比随机猜还低。

原因:路径报错通常是没在项目根目录跑脚本,构造脚本里的相对路径指向 data/ 子目录,你在别的目录执行就找不到;中文乱码基本可以锁定是编码问题,很多公开中文数据集的 CSV 是 gbk 编码而不是 utf-8。

解决:先pwd确认当前目录在项目根目录,然后ls data看原始文件到底叫什么名字,有的数据集叫 news.csv 有的叫 data.csv,脚本里写死的路径不一定和你手上的文件对得上。编码问题就用pd.read_csv(path, encoding="gbk")或"utf-8"轮着试,哪个不报错用哪个。列名问题前面说过,提前在 construct.py 里做 rename,不要指望所有脚本列名都一样。

4.3 模型层:BERT 权重加载失败与显存不足

现象:跑 bert_model_sen.py 报OSError: Can't load weights for bert-base-chinese,或者训练到一半报CUDA out of memory。

原因:前者是 transformers 需要从远程仓库下载预训练权重,网络受限或本地缓存缺失都会失败;后者是 batch_size 设太大,GPU 显存扛不住,CPU 机器硬跑 BERT 则是慢到怀疑人生。

解决:权重加载失败有两个办法。一是手动下载权重文件放到项目本地目录,然后用from_pretrained("./bert-base-chinese")指向本地路径,离线也能加载;二是设置环境变量HF_ENDPOINT=https://hf-mirror.com,这是 HuggingFace 的国内加速镜像,改完再跑下载就能走通。显存不足就把 batch_size 从 32 降到 8 或 4,同时在模型初始化里显式指定device="cpu"或device="cuda",别让框架自动猜。我的建议是 BERT 放最后跑,先用 ML 和 CNN 把整个链路验证通,BERT 单独调一次足够。

5. 参数调优与效果验证:用 calc_AUC.py 量化每个改动

模型能跑通只是及格线,毕业设计想拿高分,得让评委看到你有调参的思路和验证的习惯。这一章给出一张参数清单、一张模型对比表,以及一套我常用的调优顺序。

5.1 关键参数清单:哪些参数值得动

参数所在文件常见初始值调优方向
max_lencnn/lstm 模型128短文本用 64,长新闻用 256,超过 256 提升很小
embed_dimcnn/lstm 模型128数据量小用 100,量大可以上 200
batch_size所有深度模型32显存不够降到 8/16,CPU 训练优先 16
learning_rate深度模型1e-3CNN/LSTM 用 1e-3,BERT 必须降到 2e-5
epochs所有深度模型5~10观察 val_loss 下降曲线,连续 3 轮不降就停
max_featuresML_model.py5000数据量大可以提到 10000,但训练时间翻倍
ngram_rangeML_model.py(1, 2)想抓长尾表达可以试 (1, 3),会有维度爆炸风险

这里最值得强调的 learning_rate 差异:CNN 和 LSTM 用 1e-3 没问题,但 BERT 这类预训练模型微调,学习率超过 2e-5 很容易让权重震荡,精度反而不如随机初始化模型。我第一次跑 BERT 就是偷懒没改学习率,AUC 直接掉了 0.08,白白浪费了三个小时。

5.2 四模型效果对比与选型建议

模型训练耗时(万级样本)精度区间优缺点
ML(TF-IDF + LR)秒级0.75~0.85快、可解释,但抓不住复杂语义
CNN(句子级卷积)分钟级0.82~0.90性价比最高,最适合做默认主模型
LSTM(序列建模)分钟级~小时级0.82~0.90长文本略优,但训练慢、过拟合风险高
BERT(预训练微调)小时级(CPU)0.90~0.95精度上限最高,但别说环境要求高

上面精度区间是我在多个公开新闻数据集上跑出来的大致范围,具体数值取决于数据质量和类别比例。选型的核心逻辑是:如果数据量不到一万条,直接上 BERT 很容易过拟合,CNN 反而更稳;如果数据量五万以上且你有 GPU 时间,BERT 值得冲。答辩时把这四个模型的 AUC 画成柱状图,评委一眼就看明白梯度提升路径。

5.3 调优路径:先动数据还是先动模型

我调这类项目的固定顺序是「数据 → 基线 → 单模型 → 对比」。先确认数据质量没问题,再跑 ML 基线拿一个参考 AUC;然后单独调 CNN,因为它是性价比之王,把它的 AUC 拉到接近 LSTM 的水平;最后跑 LSTM 和 BERT 做对比。

每次只改一个参数,改完立刻用 calc_AUC.py 重新评估。比如先改 max_len 从 128 到 256,记录 AUC 变化;再改 embed_dim,记录下一组数。同时改三个参数,出了问题你根本不知道是哪个改动导致的回落。训练曲线也要看,如果 val_loss 先降后升,就是过拟合,对策是加大 dropout 或数据增强,而不是继续加 epochs。

6. 进阶用法:把检测模型迁移到自己的新闻数据上

项目源码跑通只是第一步,真正能体现价值的是把它迁移到自己的数据集上。做课程设计或项目开发时,你大概率要用它处理自己爬下来的新闻数据,而不是永远用包里的 demo 数据。

6.1 数据格式对齐与重新训练

迁移的第一步是把你的数据整理成和原项目一样的格式:两列 CSV,text 列放新闻正文,label 列放 0 或 1。如果自己标数据,我建议先标 2000 条跑通全流程,确认链路没问题再补标到一万条以上,否则容易白标。

# 迁移示意:读取自己的数据并复用构造流程 import pandas as pd from construct import build_dataset df = pd.read_csv("my_news.csv", encoding="utf-8") df = df.rename(columns={"news_content": "text", "is_true": "label"}) df["label"] = df["label"].map({True: 1, False: 0}) # 统一标签取值 build_dataset(df, train_ratio=0.8)

这里要特别提醒:自己爬的新闻数据往往类别极不平衡,虚假新闻可能只占 15%。遇到这种情况别直接训,先考虑对多数类做下采样或对少数类做简单过采样,让训练集比例接近 7:3,AUC 才有意义。跑完重新执行 ML 基线和 CNN 训练,用 calc_AUC.py 对比新旧数据上的表现差异,这个对比结果写进开发文档里就是很好的加分项。

6.2 结果验证与落地技巧

迁移完成后,验证环节不要只看 AUC,我还会额外做两件事。第一是跑一个混淆矩阵,把「真实新闻误判成虚假」和「虚假新闻判成真实」的数量分别列出来——在很多场景里,宁可信错真实新闻,也不放过一条虚假新闻,这个代价偏好可以直接体现在阈值上:把判断阈值从 0.5 降到 0.4,查全率会提升但误报也会增加,具体看你的业务诉求。

第二是把 web.py 的预测接口做成批量模式,因为真实业务往往是一次判断几千条:

# 批量预测示意 import joblib model = joblib.load("model.pkl") vectorizer = joblib.load("vectorizer.pkl") def batch_predict(news_list, threshold=0.5): vec = vectorizer.transform(news_list) probs = model.predict_proba(vec)[:, 1] return [(prob > threshold).item() for prob in probs], probs

用 CSV 列表输入、直接输出检测结果和置信度,比一条条贴到网页里快太多。从那以后我每次拿到这类带 web.py 的项目,都会先跑通最小数据子集验证链路,再上全量数据训练,最后把评估脚本和调参记录整理进文档——这三步走完,项目无论是答辩还是交付都稳了。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 12:44:27

Docker部署Elasticsearch与Kibana:从单节点到Compose实战全指南

如果问十个人"第一次部署Elasticsearch你卡在哪",答案大概率不是ES本身难,而是环境碎:要装匹配的JDK、要对版本、要改配置文件、要处理各种系统参数。上上周同事还在官网下载几百MB的tar包手动解压配JDK,折腾一下午才勉…

作者头像 李华
网站建设 2026/9/28 12:43:42

OpenCV烟丝图像分割与轮廓统计实践

简介:这是一套基于Python与OpenCV的烟丝检测分割项目代码,面向计算机视觉初学者及烟草行业质检场景,解决图像中烟丝自动识别、轮廓提取与面积宽度测量等问题。项目涵盖图像读取、颜色空间转换、滤波去噪、Canny边缘检测、轮廓发现、形态学优化…

作者头像 李华
网站建设 2026/9/28 12:43:42

虚拟化平台部署与平台化演进:从资源池化到双轨架构实战解析

平台化这个词,在IT圈里被念了十几年,每一个阶段的含义其实都不太一样。十年前大家在喊平台化,多数是想着把一堆手工操作的服务器、存储、网络收拢到一个统一管理界面里,用虚拟化技术让资源池化、调度自动化;这十年我经…

作者头像 李华
网站建设 2026/9/28 12:43:08

安路TD 5.0.3许可证安装避坑指南:驱动、License与服务全链路排错

1. 为什么安路TD 5.0.3的安装过程像在解一道多层嵌套的谜题?安路TD 5.0.3——这个被国内FPGA工程师私下称为“国产替代急先锋”的综合布局布线工具,最近半年在高校实验室和中小FPGA设计团队中热度陡增。但几乎每个第一次接触它的人都会卡在同一个地方&am…

作者头像 李华
网站建设 2026/9/28 12:42:37

300款H5小游戏合集整理实战:从单文件HTML到部署全攻略

前阵子整理完一个300款H5小游戏的合集资源包,朋友圈发了个截图,结果一下午有十几个朋友来问怎么做的、在哪下载、怎么部署到自己的网站。说实话,这活儿看起来就是“收集网页游戏再打包”,但真正动手之后才发现,从选游戏…

作者头像 李华
网站建设 2026/9/28 12:42:17

SpringBoot+Vue前后端分离实战:心理咨询管理系统从设计到部署

这两年只要刷编程相关的社区,十有八九能看到SpringBoot Vue的痕迹。不夸张地说,它已经成了Java后端和前端工程化之间最稳妥的“通用语”。如果你正在做课程设计、毕业设计,或者公司需要一个快速落地的小型业务系统,基于SpringBoo…

作者头像 李华