MR2多模态谣言检测数据集实战指南:从数据预处理到模型训练

张开发
2026/4/13 13:40:23 15 分钟阅读

分享文章

MR2多模态谣言检测数据集实战指南:从数据预处理到模型训练
1. MR2数据集初探多模态谣言检测的利器第一次接触MR2数据集是在去年做社交媒体内容审核项目时当时我们需要一个同时包含文本、图像和网页信息的数据集来训练模型。市面上大多数谣言检测数据集要么只有纯文本要么就是图片配简单描述直到发现了这个由清华大学团队开源的多模态数据集。MR2的全称是Multimodal Rumor Detection专为多模态谣言检测任务设计。它最吸引我的地方在于真实场景的还原度——每条数据都像你在朋友圈看到的完整谣言传播链条耸人听闻的标题文字、配图、以及相关的网页链接。这种多模态的组合方式让模型能像人类一样综合判断信息的可信度。数据集包含约15万条中英文样本覆盖政治、科技、娱乐等八大领域。标签系统也很实用除了简单的谣言/非谣言二分法还增加了未验证这个现实场景中常见的中间状态。记得第一次加载数据集时我被其中一些样本的迷惑性震惊了——有些谣言用的官方媒体截图几乎可以以假乱真。2. 数据获取与环境准备2.1 获取数据集的最佳实践官方提供了三种获取方式GitHub仓库、Google Drive和AI Studio竞赛页面。我推荐通过GitHub的THU-BPM/MR2项目页获取因为这里能同时下载到最新数据、基线代码和详细文档。第一次下载时我犯了个错误——只下载了主数据集而忽略了img_html_news子目录结果训练时发现部分图片路径无法解析。下载后的目录结构是这样的MR2/ ├── dataset_items_train.json ├── dataset_items_val.json ├── dataset_items_test.json ├── train/ │ ├── 0001.jpg │ └── ... ├── val/ ├── test/ ├── img_html_news/ └── inverse_search/提示建议下载后立即校验文件完整性。我遇到过网盘下载中断导致JSON文件损坏的情况可以用这个命令检查md5sum dataset_items_*.json2.2 搭建开发环境推荐使用Python 3.8和PyTorch 1.12环境。这是我常用的环境配置命令conda create -n mr2 python3.8 conda activate mr2 pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu113 pip install pandas pillow beautifulsoup4 matplotlib对于GPU加速建议至少准备8GB显存的显卡。我在RTX 3060上测试时batch_size32的情况下显存占用约6.5GB。如果显存不足可以尝试混合精度训练scaler torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs model(inputs) loss criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()3. 数据预处理全流程3.1 处理文本模态的实战技巧MR2中的文本内容直接来自社交媒体包含大量噪声。我总结了一套预处理流程中文特殊处理去除微信特有的[表情]标记和URLimport re def clean_wechat_text(text): text re.sub(r\[.*?\], , text) # 去除表情标签 text re.sub(rhttps?://\S, , text) # 去除URL return text.strip()英文处理统一缩写形式并纠正常见拼写错误from spellchecker import SpellChecker spell SpellChecker() def correct_spelling(text): words text.split() corrected [spell.correction(word) for word in words] return .join(filter(None, corrected))关键信息提取使用正则表达式抓取可能的关键词def extract_keywords(text): patterns { money: r\d亿|\d万|美元|人民币, time: r\d月\d日|昨天|今日, org: r[A-Za-z]公司|集团|研究院 } return {k: re.findall(v, text) for k,v in patterns.items()}3.2 图像处理的那些坑数据集中的图片尺寸参差不齐从几十像素到4K分辨率都有。经过多次实验我发现这样的预处理流程效果最好from torchvision import transforms train_transform transforms.Compose([ transforms.Resize(256), transforms.RandomCrop(224), transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) val_transform transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])特别注意约5%的图片在加载时会报错建议使用健壮的图片加载方法from PIL import Image, ImageFile ImageFile.LOAD_TRUNCATED_IMAGES True def safe_load_image(path): try: img Image.open(path).convert(RGB) return img except: return None # 返回占位图像或跳过3.3 网页信息的高效提取html_path字段指向的网页HTML文件是个宝库但解析起来很麻烦。我推荐使用bs4自定义规则from bs4 import BeautifulSoup def parse_html(html_path): with open(html_path, r, encodingutf-8) as f: soup BeautifulSoup(f.read(), html.parser) # 提取关键区域 main_content soup.find(article) or soup.find(div, class_content) # 清理脚本和样式 for tag in soup([script, style, iframe]): tag.decompose() return { title: soup.title.string if soup.title else , text: .join(main_content.stripped_strings) if main_content else , links: [a[href] for a in soup.find_all(a, hrefTrue)], meta: {meta[name]:meta[content] for meta in soup.find_all(meta, attrs{name: True})} }4. 模型构建与训练策略4.1 多模态融合架构设计经过多次迭代这个三流融合架构在验证集上达到了87.3%的准确率import torch.nn as nn class MultimodalModel(nn.Module): def __init__(self): super().__init__() # 图像分支 self.img_encoder nn.Sequential( nn.Conv2d(3, 64, kernel_size3, stride2, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size3, padding1), nn.ReLU(), nn.AdaptiveAvgPool2d(1) ) # 文本分支 self.text_encoder nn.Sequential( nn.Embedding(50000, 300), nn.Conv1d(300, 256, kernel_size3), nn.ReLU(), nn.AdaptiveMaxPool1d(1) ) # 网页分支 self.web_encoder nn.Sequential( nn.Linear(768, 512), # 假设使用BERT提取的网页特征 nn.ReLU() ) # 融合层 self.fusion nn.Linear(128256512, 512) self.classifier nn.Linear(512, 3) def forward(self, img, text, web): img_feat self.img_encoder(img).squeeze() text_feat self.text_encoder(text).squeeze() web_feat self.web_encoder(web) fused torch.cat([img_feat, text_feat, web_feat], dim-1) fused self.fusion(fused) return self.classifier(fused)4.2 训练技巧与调参经验学习率策略采用余弦退火配合热启动from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts optimizer torch.optim.AdamW(model.parameters(), lr1e-4) scheduler CosineAnnealingWarmRestarts(optimizer, T_010, T_mult2)损失函数设计针对类别不平衡问题class_weight torch.tensor([1.0, 2.5, 1.8]) # 根据你的数据集分布调整 criterion nn.CrossEntropyLoss(weightclass_weight.to(device))早停策略当验证集损失连续3个epoch不下降时停止from copy import deepcopy best_loss float(inf) patience 0 for epoch in range(100): # ...训练过程... val_loss validate(model, val_loader) if val_loss best_loss: best_loss val_loss best_weights deepcopy(model.state_dict()) patience 0 else: patience 1 if patience 3: break5. 评估与部署实战5.1 多维度评估指标除了常规的准确率在谣言检测中这些指标更重要from sklearn.metrics import classification_report def evaluate(model, loader): model.eval() all_preds, all_labels [], [] with torch.no_grad(): for batch in loader: outputs model(*batch[:-1]) preds outputs.argmax(dim-1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(batch[-1].cpu().numpy()) print(classification_report( all_labels, all_preds, target_names[非谣言, 谣言, 未验证], digits4 )) # 特别关注谣言类的召回率 report classification_report(all_labels, all_preds, output_dictTrue) return report[1][recall] # 返回谣言类的召回率5.2 部署优化技巧模型量化在不显著影响精度的情况下减小模型体积quantized_model torch.quantization.quantize_dynamic( model, {nn.Linear}, dtypetorch.qint8 ) torch.jit.save(torch.jit.script(quantized_model), quantized.pt)API服务化使用FastAPI创建推理服务from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class Request(BaseModel): text: str image_url: str webpage_url: str app.post(/predict) async def predict(request: Request): # 预处理输入 inputs preprocess(request.text, request.image_url, request.webpage_url) # 推理 with torch.no_grad(): output model(*inputs) return {label: int(output.argmax())}在实际项目中我还发现模型对图文不符这类谣言的检测效果特别好。有次测试时模型成功识别出了一条用美食图片配某地爆发疫情文字的典型谣言案例这正是多模态模型的优势所在。

更多文章