三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

手把手教你用Python处理Weibo虚假新闻检测数据集(附完整代码与图片爬虫)

手把手教你用Python处理Weibo虚假新闻检测数据集(附完整代码与图片爬虫)

实战指南:Python处理微博虚假新闻检测数据集的完整流程

在信息爆炸的时代,虚假新闻检测已成为数据科学领域的重要课题。微博作为中文社交媒体平台,其公开数据集为研究者提供了宝贵的实验素材。本文将带您从零开始,完整实现微博虚假新闻数据集的预处理流程,涵盖数据清洗、图片爬取、特征提取等关键环节,最终生成可直接用于机器学习模型的结构化数据。

1. 数据集解析与环境准备

微博虚假新闻检测数据集包含约3700条标注样本,每条数据由三行组成:元信息行、图片URL行和文本内容行。原始数据以txt文件存储,需要经过系统化处理才能用于模型训练。

首先配置Python工作环境,推荐使用Anaconda创建虚拟环境:

conda create -n weibo_nlp python=3.8 conda activate weibo_nlp pip install requests pandas tqdm pillow

关键工具库说明:

  • requests:处理HTTP请求,用于图片下载
  • pandas:数据清洗与结构化处理
  • tqdm:进度条显示
  • pillow:图像处理基础库

提示:建议使用Jupyter Notebook进行交互式开发,方便分步调试数据预处理流程。

2. 数据加载与初步清洗

原始数据文件通常命名为rumor.txtnonrumor.txt,分别对应虚假新闻和真实新闻。我们首先定义数据加载函数:

import pandas as pd def load_raw_data(file_path): with open(file_path, 'r', encoding='utf-8') as f: lines = f.readlines() data = [] for i in range(0, len(lines), 3): meta = lines[i].strip().split('|') images = lines[i+1].strip().split('|')[:-1] # 去除末尾null text = lines[i+2].strip() record = { 'tweet_id': meta[0], 'user_name': meta[1], 'publish_time': int(meta[4]), 'is_original': meta[5] == 'true', 'reposts': int(meta[6]), 'comments': int(meta[7]), 'likes': int(meta[8]), 'user_verified': int(meta[10]), 'image_urls': images, 'text': text } data.append(record) return pd.DataFrame(data)

清洗过程中需特别注意:

  • 处理缺失值(如空文本)
  • 统一时间戳格式
  • 验证数值型字段的有效性
  • 过滤无效用户记录

3. 图片爬虫实现与优化

微博数据集中的图片URL存在几个典型问题:

  1. 部分链接已失效
  2. URL大小写不一致
  3. 存在重复图片

我们实现一个健壮的图片下载器:

import os import requests from urllib.parse import urlparse from tqdm import tqdm def download_images(url_list, save_dir='weibo_images'): if not os.path.exists(save_dir): os.makedirs(save_dir) downloaded = set() for url in tqdm(url_list): if not url: continue try: # 统一处理为小写文件名 parsed = urlparse(url) filename = os.path.basename(parsed.path).lower() filepath = os.path.join(save_dir, filename) if filename in downloaded: continue response = requests.get(url, stream=True, timeout=10) if response.status_code == 200: with open(filepath, 'wb') as f: for chunk in response.iter_content(1024): f.write(chunk) downloaded.add(filename) except Exception as e: print(f"Failed to download {url}: {str(e)}") return downloaded

注意:实际应用中应添加重试机制和代理设置,避免因网络问题导致中断。

4. 结构化特征工程

将原始数据转化为机器学习友好格式需要精心设计特征。我们构建包含以下要素的DataFrame:

特征类别具体字段说明
文本特征clean_text经过清洗的推文内容
图像特征image_count推文包含的有效图片数
用户特征user_verified用户认证类型
传播特征reposts转发量标准化值
时间特征hour_of_day发布时间的小时段

特征提取代码示例:

def extract_features(df, image_set): # 文本清洗 df['clean_text'] = df['text'].str.replace(r'【.*?】', '', regex=True) # 图像特征 df['image_count'] = df['image_urls'].apply( lambda x: sum(1 for url in x if url and os.path.basename(urlparse(url).path).lower() in image_set)) # 时间特征 df['publish_dt'] = pd.to_datetime(df['publish_time'], unit='ms') df['hour_of_day'] = df['publish_dt'].dt.hour # 标准化数值特征 df['reposts_norm'] = (df['reposts'] - df['reposts'].mean()) / df['reposts'].std() return df[['tweet_id', 'clean_text', 'image_count', 'user_verified', 'reposts_norm', 'hour_of_day']]

5. 数据集整合与验证

最终我们需要将处理后的数据保存为CSV格式,并验证数据质量:

def build_final_dataset(rumor_df, nonrumor_df, output_path): # 添加标签 rumor_df['label'] = 1 nonrumor_df['label'] = 0 # 合并数据集 final_df = pd.concat([rumor_df, nonrumor_df], ignore_index=True) # 去除空文本样本 final_df = final_df[final_df['clean_text'].str.len() > 0] # 保存结果 final_df.to_csv(output_path, index=False, encoding='utf-8-sig') return final_df

数据验证要点:

  • 检查标签分布是否平衡
  • 验证特征缺失值比例
  • 确保文本编码一致(UTF-8)
  • 确认图像特征与实际下载图片匹配

6. 高级处理技巧与异常处理

在实际操作中,我们经常会遇到一些特殊情况需要处理:

案例1:处理特殊编码问题

import chardet def detect_encoding(file_path): with open(file_path, 'rb') as f: result = chardet.detect(f.read()) return result['encoding']

案例2:增量式图片下载

def get_existing_images(save_dir): return set(f.lower() for f in os.listdir(save_dir) if f.endswith(('.jpg', '.png'))) def incremental_download(url_list, save_dir): existing = get_existing_images(save_dir) new_urls = [url for url in url_list if url and os.path.basename(urlparse(url).path).lower() not in existing] return download_images(new_urls, save_dir)

案例3:多进程加速下载

from multiprocessing import Pool def parallel_download(url_list, save_dir, workers=4): with Pool(workers) as p: results = list(tqdm(p.imap(_download_single, url_list), total=len(url_list))) return [r for r in results if r] def _download_single(url): # 实现单URL下载逻辑 pass

7. 实际应用建议

基于多次实践,总结出以下经验要点:

  • 存储优化:将大型图片数据集存储在HDF5格式中,减少IO开销
  • 缓存机制:对中间结果使用pickle缓存,避免重复处理
  • 版本控制:使用dvc管理数据版本
  • 质量检查:定期验证数据完整性,特别是图片下载成功率

完整项目应包含以下目录结构:

weibo_fake_news/ ├── data/ │ ├── raw/ # 原始txt文件 │ ├── processed/ # 清洗后的CSV │ └── images/ # 下载的图片 ├── notebooks/ # 探索性分析 └── src/ ├── preprocess.py # 预处理脚本 └── utils.py # 工具函数
← 返回列表