多模态虚假新闻检测:数据集解析与PyTorch双塔模型实践

发布时间:2026/9/16 14:05:53
多模态虚假新闻检测:数据集解析与PyTorch双塔模型实践 简介面向虚假新闻检测的社交媒体多模态数据集适合自然语言处理与计算机视觉交叉方向的研究者、数据科学初学者及算法工程师使用。包内以CSV标注数据为核心同时涵盖文本与图像等多模态信息可直接用于多模态分类模型的训练与验证有助于快速搭建虚假新闻检测实验基线。压缩包内共包含5个文件主要包含2个CSV数据文件、1个Python爬虫脚本、1张图像样本及1份说明文档整体体积仅654KB便于快速部署与本地实验。目前已有75人学习下载。配套的说明文档对数据集结构进行了系统梳理爬虫脚本便于读者按需扩展数据来源图像样本和CSV字段设计能帮助理解多模态特征的组织方式非常适合作为入门实践、课程设计或课题预研的轻量级数据资源。1. 为什么虚假新闻检测必须落到多模态数据上只靠文本特征做虚假新闻检测在今天的社交媒体环境下越来越吃力。一条典型谣言往往是「真实图片 捏造描述」或者「真实新闻 移花接木的旧图」文本单独看逻辑通顺、语气正常必须把图像与文本放到同一个判别框架里才能暴露不一致。这个面向虚假新闻检测的社交媒体多模态数据集核心就是解决这个问题它提供成对组织的文本与图像数据配合 JSON 与 CSV 双重标注结构让研究者可以直接越过数据收集阶段把精力放在跨模态特征建模上。数据用 NewsCrawler 从公开社交平台新闻源采集包含较完整的原始字段适合做多模态特征融合、虚假新闻分类、图文一致性判别这几类任务。网盘里拿到的是 zip 包内含介绍文档、爬虫代码、Datasets 目录和 images 分类图片文件夹数据结构上考虑了训练集与测试集的划分对做相关课题或者企业风控场景验证的人来说都比较顺手。2. 拆解数据集的 CSV 标注结构与伪标签策略先把压缩包解压后的目录结构理清楚。主目录下是介绍文档、NewsCrawler 爬虫源码然后是真正的数据主体Datasets 下存放 csv 文件images 文件夹按类别组织图片。CSV 是整个数据集的核心入口几乎每个实验的起点都是从读取这个文件开始的。2.1 CSV 里到底存了哪些字段用文本编辑器打开 CSV 后典型的列结构大致是id、news_title、news_content、image_path、label、publish_time、source_platform、news_url。其中id是全局唯一键image_path指向 images 目录下具体的图片文件label标记虚假或真实。这套结构与常见的社交媒体分析数据集基本同构迁移成本低业界做法是不改动列名直接对接现有训练管线。不同行的label计数分布是首先要检查的因为不少虚假新闻数据集正负样本比例悬殊。比如一个包含 5 万条新闻样本的数据集里真实与虚假的比例可能接近 1:1.2这个比例在后续做交叉验证时对评估指标影响很大。读取并统计 CSV 标签分布的代码如下import pandas as pd df pd.read_csv(Datasets/fake_news_dataset.csv) print(df[label].value_counts()) print(f总样本数: {len(df)}) print(f图片缺失率: {df[image_path].isna().mean():.2%})这段代码做了三件基础但必要的事确认样本总量、核对类别均衡程度、评估图片字段缺失率。如果缺失率高于 5%就需要在数据加载器里设计 missing-image 分支比如用全零张量替代图像特征或者直接从训练批次中过滤。publish_time这个字段容易被忽略实际它是重要的时间戳信号——同一事件在短时间内密集爆发往往是谣言传播的典型模式可以作为一个额外特征拼进模型。2.2 时间戳与来源字段的弱监督价值source_platform记录的是发布平台在不同平台间做分组统计可以快速观察虚假新闻的分布倾向。用pandas按平台分组统计标签均值能直观看到哪些平台虚假比例偏高。这个操作不用建模就有分析价值写报告或者做数据探索时非常实用。另一个容易被低估的是news_url字段。虽然原始 URL 不能直接进模型但它可以用于域名层面的特征抽取——比如解析出顶级域名后用该域名在历史数据中的虚假新闻比例作为先验特征。具体做法是用urllib.parse从 URL 中提取域名再映射回标签做 groupby 聚合生成一个 domain-level 的伪标签概率特征。这个特征在冷启动场景下尤其有效因为新样本如果来自一个历史虚假比例极高的域名模型在没有足够内容特征时也能给出合理偏向。2.3 images 目录的命名规则与对齐方式images 文件夹内部的图片命名与 CSV 的image_path必须严格对应常见格式是train/real/xxx.jpg与train/fake/xxx.jpg这样按标签分子目录存放。这种组织方式的优点是不需要额外解析映射表直接按路径读图即可。但注意不要假设所有平台爬下来的图片格式一致JPG、PNG、WebP 混合出现是这个领域的常态。处理时统一做 RGB 三通道转换与缩放到固定尺寸我在加载器里通常用PIL.Image.open()配合convert(RGB)再 resize 到 224x224 或 256x256。加载策略上推荐在__getitem__里设置lazy loading避免一次性把所有图片读入内存——一个 2 万张图片的数据集如果全部预加载会轻松占满 16GB 内存。配合torchvision.transforms做随机裁剪、水平翻转和颜色抖动既增加样本多样性也让模型对拍摄条件和压缩伪影更鲁棒。3. NewsCrawler 采集流水线与断点续抓设计数据集附带 NewsCrawler 爬虫源码这不是摆设它决定了数据集的可扩展性——你可以用同一套代码补充新样本也不需要完全依赖固定版本的发布包。3.1 爬虫脚本的代码结构分析news_crawler.py的核心是抓取队列管理和页面解析两部分。以下是我从代码中抽出的精简版本import json import time import requests from urllib.parse import urljoin class NewsCrawler: def __init__(self, deep_level2, rate_limit1.5, output_filefull_news_items.json): self.deep_level deep_level self.rate_limit rate_limit self.output_file output_file self.seen_urls set() self.failure_pages [] def fetch(self, url): headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)} try: resp requests.get(url, headersheaders, timeout10) if resp.status_code 200: return resp.text else: self.failure_pages.append({url: url, status: resp.status_code}) return None except requests.RequestException as exc: self.failure_pages.append({url: url, error: str(exc)}) time.sleep(2) return None def parse_article_links(self, html, base_url): # 实际解析逻辑需要结合目标站点的 DOM 结构调整这里只做示例 return [urljoin(base_url, link) for link in self.extract_links(html)] def run(self, seed_urls): queue list(seed_urls) for depth in range(self.deep_level): next_queue [] for url in queue: if url in self.seen_urls: continue self.seen_urls.add(url) html self.fetch(url) if not html: continue article self.parse_article(html) if article: article[crawl_depth] depth yield article next_queue.extend(self.parse_article_links(html, url)) time.sleep(self.rate_limit) queue list(set(next_queue))这个抓取策略相当克制rate_limit设 1.5 秒是防止对目标站点造成访问压力也降低 IP 被临时限制的概率。deep_level控制抓取深度深度设为 2 通常能覆盖首页到详情页两层页面已经能满足多模态数据集中文字与图片成对采集的需求。更关键的是failure_pages列表——它会记住所有失败请求便于跑完后集中排查而不是从头再来一遍。3.2 断点续抓和多线程的取舍seen_urls集合承担了去重职责但脚本如果中途崩溃集合就丢了。常见的改进方案是把已抓取的 URL 实时追加到文件落盘每次启动时先加载历史记录。这个操作的代码量不到十行但在处理几万条链接时能节省大量重抓时间。关于多线程我的建议是谨慎。社交媒体站点对请求频率很敏感线程数从 1 加到 5抓取耗时确实能缩短到原来的三分之一但被封的风险也成倍上升。折中方案是把 threads 数控制在 2 到 3配合随机 sleep 0.5 到 1.5 秒整体效率与稳定性比较平衡。如果目标平台提供了官方 API优先用 API 而不是爬虫——合规性与稳定性都更有保障。数据集里看到的部分图片来自公开新闻源截图这类内容要注意版权与转载规范仅用于研究场景问题不大商用要另行确认授权。4. 用 PyTorch 构建图文双塔基线模型数据集要产生价值得跑通一个可复现的基线。双塔结构是 multimodal fake news detection 最常见的入门方案也是理解和评估后续复杂模型的参照物。它的核心思想很直接文本塔与图像塔分别把各自模态映射到向量表示再拼接送入分类器。4.1 多模态数据加载器实现首先需要把 CSV 描述与图片文件变成 PyTorch 友好的数据管道import torch from torch.utils.data import Dataset from PIL import Image from transformers import AutoTokenizer, AutoModel import torchvision.transforms as T class MultimodalFakeNewsDataset(Dataset): def __init__(self, df, img_dir, text_encoder_namebert-base-uncased): self.df df.reset_index(dropTrue) self.img_dir img_dir self.tokenizer AutoTokenizer.from_pretrained(text_encoder_name) self.transform T.Compose([ T.Resize((224, 224)), T.ToTensor(), T.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) def __len__(self): return len(self.df) def __getitem__(self, idx): row self.df.iloc[idx] text f{row[news_title]}. {row[news_content]} text_inputs self.tokenizer( text, max_length128, paddingmax_length, truncationTrue, return_tensorspt ) img_path f{self.img_dir}/{row[image_path]} try: image Image.open(img_path).convert(RGB) image_tensor self.transform(image) image_valid 1.0 except (FileNotFoundError, OSError): image_tensor torch.zeros((3, 224, 224)) image_valid 0.0 label torch.tensor(float(row[label]), dtypetorch.float32) return { input_ids: text_inputs[input_ids].squeeze(0), attention_mask: text_inputs[attention_mask].squeeze(0), image: image_tensor, image_valid: torch.tensor(image_valid), label: label }逻辑上有几个细节值得注意文本拼接用「标题 内容」的方式比单独用标题多了上下文信息图片读取失败时用零张量代替而不是直接抛异常——这保证一个批次里个别图片损坏不会导致整个训练中断image_valid标记告诉模型哪些样本的视觉通道是可靠的。max_length128的设定基于新闻标题通常较短、正文首段信息密度较高的经验值并不是越长越好超过这个长度的大多是页面底部的推荐链接或者版权声明。4.2 双塔模型的前向过程与融合策略import torch.nn as nn class TextEncoder(nn.Module): def __init__(self, model_namebert-base-uncased): super().__init__() self.bert AutoModel.from_pretrained(model_name) self.projection nn.Linear(768, 256) def forward(self, input_ids, attention_mask): outputs self.bert(input_idsinput_ids, attention_maskattention_mask) cls_vec outputs.pooler_output return self.projection(cls_vec) class ImageEncoder(nn.Module): def __init__(self): super().__init__() from torchvision.models import resnet18, ResNet18_Weights self.cnn resnet18(weightsResNet18_Weights.IMAGENET1K_V1) self.cnn.fc nn.Linear(512, 256) def forward(self, images): return self.cnn(images) class DualTowerFakeNewsDetector(nn.Module): def __init__(self): super().__init__() self.text_encoder TextEncoder() self.image_encoder ImageEncoder() self.classifier nn.Sequential( nn.Linear(512, 128), nn.ReLU(), nn.Dropout(0.3), nn.Linear(128, 1) ) def forward(self, input_ids, attention_mask, image, image_valid): text_feat self.text_encoder(input_ids, attention_mask) image_feat self.image_encoder(image) image_feat image_feat * image_valid.unsqueeze(1) combined torch.cat([text_feat, image_feat], dim1) return self.classifier(combined).squeeze(1)文本向量 256 维、图像向量 256 维、拼接后 512 维这是我在小数据集上常用的配置。隐藏维度降一半用projection线性层完成好处是降低过拟合风险同时让两塔特征在数值尺度上相对均衡。image_feat * image_valid的实现很关键它把缺失图片样本的图像特征归零等效于告诉分类器「这个样本只能靠文本信息做判断」。4.3 评估指标选择与训练技巧虚假新闻检测场景中盲目追求 accuracy 会带来严重问题如果测试集里真实新闻占 75%一个全预测「真实」的模型准确率就有 75%但这个模型没有任何实用价值。所以报告指标应以宏平均 F1macro F1为主配合混淆矩阵观察两类各自的 precision 与 recall。如果业务上更关注「不让谣言漏掉」权重应该偏向 recall反之如果更在意误伤正常内容weighted precision 优先级更高。训练时推荐使用 SGD 或 AdamW学习率从 2e-5 起步做 warmup批次大小 16 到 32在 RTX 3060 12GB 显存上可以稳定跑完 10 个 epoch。每轮保存 checkpoint 不只看 loss结合验证集 macro F1 决定是否保留当前权重。5. 多模态融合进阶相似度偏差与注意力加权双塔拼接只是多模态融合的地板它默认文本特征与图像特征对最终决策的贡献是等权的但现实中不同类型的虚假新闻依赖的模态完全不同。比如「移花接木」类谣言主要靠图像反例「无中生有」类则更多依赖文本逻辑扭曲。这就需要对特征交互做更精细的建模。5.1 用 CLIP 隐空间计算图文一致性与事实一致性一个在虚假新闻检测中被反复验证的思路是先把图文对映射到共享语义空间再计算它们之间的相似度把相似度分数当作辅助特征。如果文本描述的是一架飞机但配图是一只猫这个图文对在共享空间中的相似度必然很低这本身就是强烈的虚假信号。伪代码如下import torch.nn.functional as F clip_text_feat clip_model.encode_text(tokenized_text) clip_image_feat clip_model.encode_image(image_tensor) clip_text_feat F.normalize(clip_text_feat, dim-1) clip_image_feat F.normalize(clip_image_feat, dim-1) sim_score (clip_text_feat * clip_image_feat).sum(dim-1)encode_text与encode_image分别得到 512 维向量归一化后点积范围在 [-1, 1]sim_score接近 1 表示图文高度一致接近 0 或负值说明严重不符。实际业务中我把阈值设在 0.24 左右低于这个值标记为可疑样本有相当高的召回率。这个分数不需要参与训练直接作为一个标量特征拼进分类器即可。但这里有个重要边界CLIP 相似度衡量的是「语义相关性」不等于「事实真实性」。一条图文高度匹配的新闻仍然可能是编造的比如配图确实是一栋大楼但文字说楼着火了——图和文在语义上匹配事实却不存在。因此相似度特征只能作为信号之一不能作为独立的判定标准。业界更完善的做法是同时引入外部知识库或事实核查结果与模态相似度互补。如果使用端到端微调 CLIP 而非固定特征注意设置低学习率1e-6 以下避免破坏预训练模型已经学到的语义对齐能力。5.2 跨模态注意力替代简单拼接简单拼接无法建模细粒度的跨模态交互更可靠的做法是用 cross-attention 让文本 token 去查询图像区域。核心思路是把图像特征作为 Key/Value文本特征作为 Query输出是携带视觉信息的文本向量。这个向量再送入分类器。相比直接拼接它能学习「文本中哪个词与图像哪个区域对应」这一层关系。多头注意力机制的引入让模型能够同时关注局部细节比如图中的人脸、背景中的地标建筑与标题中的地点是否呼应。这类模型在图文不匹配类型的数据上表现明显更好但也需要更长训练时间。6. 实战验证与排错从数据检查到显存优化跑完整流程前先做数据完整性检查再处理训练阶段的典型问题。数据集的 CSV 与图片之间经常存在不对应的情况比如 CSV 里的image_path引用了不存在的文件。用脚本批量核实这些引用关系往往能发现缺失率在 1% 以上的问题这部分数据要么补齐要么剔除否则训练过程中的静默错误会直接影响效果。6.1 验证命令清单以下命令适合在拿到数据后逐一执行# 统计 CSV 行数与标签分布 wc -l Datasets/*.csv # 核对 images 数量与 CSV 引用是否一致 find images -type f | wc -l # 找出 CSV 中引用了但实际不存在的图片 python -c import pandas as pd, os df pd.read_csv(Datasets/fake_news_dataset.csv) missing [p for p in df[image_path] if not os.path.exists(p)] print(fmissing images: {len(missing)}) 如果 missing images 数量较多优先检查是不是路径前缀不一致比如 CSV 里存的是绝对路径但图片实际在相对路径下。这类问题的修复只需要字符串前缀拼接不要手动重命名文件避免引入新的不一致。6.2 常见训练异常与对策异常现象可能原因解决方案loss 下降缓慢双塔特征尺度差异大对两个模态特征分别做 LayerNorm 后再拼接验证集 F1 波动剧烈batch size 过小增大 batch size 并降低学习率显存溢出文本序列过长/图像分辨率过大文本截断到 128 token图像缩至 224x224图片加载阻塞训练磁盘 IO 成为瓶颈用num_workers4预取数据或把图转为内存映射只靠单模态达到高指标某一塔过强对强模态特征施加更大概率 Dropout 以平衡两塔最后一个问题最隐蔽如果文本塔学得很快模型会逐渐忽略图像特征最终等效于纯文本分类器。观察方法是分别用单模态跑一遍验证集再对比双塔结果的提升幅度。差距不足 2% 时就需要考虑增强图像塔表征能力或者像第 5 章那样引入 CLIP 特征作为视觉通道的补充。6.3 对 full_news_items.json 做轻量索引爬虫输出的full_news_items.json是原始采集数据CSV 是从它生成的。实验期间反复读取这个大 JSON 文件并不高效我会在拿到数据后先转换成 SQLite 数据库用id与image_path建立索引。后续查询和过滤操作耗时可以从秒级降到毫秒级处理多轮迭代实验时收益很明显。转换逻辑大概二十行 Python用sqlite3建表并逐条插入即可。之后做数据增强、特征缓存、样本过滤都可以直接走 SQL 查询数据集的使用体验会顺畅很多。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询