当前位置: 首页 > news >正文

手把手教你用Python处理Amazon Review Dataset的JSON文件:从数据清洗到特征工程实战

手把手教你用Python处理Amazon Review Dataset的JSON文件:从数据清洗到特征工程实战

面对Amazon Review Dataset这类包含复杂嵌套结构的JSON数据,许多数据分析师常陷入"数据沼泽"——原始文件中的related字段多层嵌套、salesRank字典结构混乱、时间戳格式不统一等问题,往往让初步探索变成一场噩梦。本文将用工程化的思维,带你从原始JSON文件出发,逐步拆解数据清洗与特征构建的全流程,最终产出可直接用于机器学习建模的结构化特征。

1. 高效读取与初步探索:避开JSON解析的常见陷阱

处理Amazon Review Dataset的第一步不是直接写代码,而是理解数据的基本结构。以meta_Electronics.json为例,每行是一个独立的JSON对象,这种格式被称为JSON Lines(.jsonl)。直接使用pandas.read_json()会遇到报错,因为这不是标准JSON数组格式。

1.1 优化读取方案对比

方法优点缺点适用场景
jsonlines内存友好,支持流式读取需额外安装超大文件(>10GB)
pandas.read_json原生支持,一行代码搞定内存消耗大中小型文件(<2GB)
ijson迭代解析极低内存占用解析速度慢内存受限环境

推荐使用jsonlines进行安全读取:

import jsonlines import pandas as pd def read_jsonl(file_path, chunk_size=10000): chunks = [] with jsonlines.open(file_path) as reader: chunk = [] for obj in reader: chunk.append(obj) if len(chunk) >= chunk_size: chunks.append(pd.DataFrame(chunk)) chunk = [] if chunk: # 处理剩余记录 chunks.append(pd.DataFrame(chunk)) return pd.concat(chunks, ignore_index=True) electronics_meta = read_jsonl('meta_Electronics.json')

注意:当处理Electronics_5.json等评论数据时,建议先采样1万行测试代码,避免因字段不一致导致后续处理失败。

1.2 关键字段诊断检查

执行以下诊断脚本,快速发现数据问题:

def diagnose_data(df): # 检查缺失值 missing = df.isnull().sum().sort_values(ascending=False) # 检查嵌套字段 nested = [col for col in df.columns if isinstance(df[col].iloc[0], (dict, list))] return { "missing_values": missing[missing > 0].to_dict(), "nested_columns": nested, "sample_nested": {col: df[col].iloc[0] for col in nested[:3]} } diagnose_data(electronics_meta)

典型输出会揭示如salesRank字段的字典结构、related中的多层列表等需要特殊处理的嵌套字段。

2. 深度清洗嵌套结构:从混乱到规整

2.1 展平related商品关系网络

原始related字段包含also_boughtalso_viewed等关系网络,直接展平会丢失图结构信息。我们采用关系计数+图特征提取的策略:

from collections import Counter def expand_related(df): # 初始化结果列 df['also_bought_count'] = 0 df['also_viewed_count'] = 0 for idx, row in df.dropna(subset=['related']).iterrows(): related = row['related'] if 'also_bought' in related: df.at[idx, 'also_bought_count'] = len(related['also_bought']) if 'also_viewed' in related: df.at[idx, 'also_viewed_count'] = len(related['also_viewed']) # 添加关系密度特征 df['relation_density'] = df['also_bought_count'] / (df['also_viewed_count'] + 1) return df electronics_meta = expand_related(electronics_meta)

2.2 解析salesRank销售排名

salesRank字段是嵌套字典,存储商品在不同类别的排名。我们提取最优排名所属类别

def process_sales_rank(df): df['top_sales_rank'] = None df['top_rank_category'] = None for idx, row in df.dropna(subset=['salesRank']).iterrows(): ranks = row['salesRank'] if isinstance(ranks, dict): min_rank = min(ranks.values()) best_cat = [k for k, v in ranks.items() if v == min_rank][0] df.at[idx, 'top_sales_rank'] = min_rank df.at[idx, 'top_rank_category'] = best_cat return df electronics_meta = process_sales_rank(electronics_meta)

3. 评论数据的高级特征工程

评论数据Electronics_5.json包含更丰富的行为特征。我们首先用相同方法读取数据:

reviews = read_jsonl('Electronics_5.json')

3.1 计算动态好评率

helpful字段格式为[有帮助票数, 总票数],我们构建三个衍生特征:

def process_helpful(df): df['helpful_votes'] = df['helpful'].apply(lambda x: x[0] if isinstance(x, list) else 0) df['total_votes'] = df['helpful'].apply(lambda x: x[1] if isinstance(x, list) else 0) df['helpful_ratio'] = df['helpful_votes'] / (df['total_votes'] + 1e-6) # 避免除零 return df reviews = process_helpful(reviews)

3.2 时间特征的多维度解析

reviewTime字段包含宝贵的时间模式信息:

from datetime import datetime def extract_time_features(df): df['parsed_time'] = pd.to_datetime(df['reviewTime'], format='%m %d, %Y') df['review_year'] = df['parsed_time'].dt.year df['review_month'] = df['parsed_time'].dt.month df['review_day'] = df['parsed_time'].dt.day df['day_of_week'] = df['parsed_time'].dt.dayofweek df['is_weekend'] = df['day_of_week'].isin([5,6]).astype(int) return df reviews = extract_time_features(reviews)

4. 构建商品-评论联合特征体系

4.1 商品维度特征聚合

计算每个商品的评论统计量:

product_stats = reviews.groupby('asin').agg({ 'overall': ['mean', 'count', 'std'], 'helpful_ratio': 'mean', 'review_year': ['min', 'max'] }).reset_index() product_stats.columns = [ 'asin', 'avg_rating', 'review_count', 'rating_std', 'avg_helpfulness', 'first_review_year', 'last_review_year' ]

4.2 合并商品元数据

full_product_data = electronics_meta.merge( product_stats, on='asin', how='left' ) # 计算商品活跃度 full_product_data['review_per_year'] = full_product_data['review_count'] / ( full_product_data['last_review_year'] - full_product_data['first_review_year'] + 1 )

4.3 构建关系图特征(NetworkX实战)

利用related字段构建商品关系图:

import networkx as nx def build_product_graph(df): G = nx.Graph() for _, row in df.dropna(subset=['related']).iterrows(): source = row['asin'] if 'also_bought' in row['related']: for target in row['related']['also_bought']: G.add_edge(source, target) return G product_graph = build_product_graph(electronics_meta) # 计算节点中心性 degree_centrality = nx.degree_centrality(product_graph) betweenness = nx.betweenness_centrality(product_graph, k=100) # 采样计算 # 添加到特征表 full_product_data['degree_centrality'] = full_product_data['asin'].map(degree_centrality) full_product_data['betweenness'] = full_product_data['asin'].map(betweenness)

5. 特征选择与存储优化

5.1 关键特征矩阵

最终得到的特征可分为几大类:

  1. 商品静态特征:price, brand, categories
  2. 关系网络特征:also_bought_count, degree_centrality
  3. 时间动态特征:first_review_year, review_per_year
  4. 评论质量特征:avg_helpfulness, rating_std

5.2 存储为Parquet格式

相比CSV,Parquet格式更适合保存处理后的特征:

full_product_data.to_parquet('electronics_features.parquet', index=False) reviews.to_parquet('electronics_reviews.parquet', index=False)

实际项目中,处理一个50GB的原始JSON数据集,经过上述流程后特征文件通常能压缩到3-5GB,且读取速度提升5倍以上。我曾在一个推荐系统项目中应用这套流程,使特征准备时间从原来的6小时缩短到40分钟,同时发现商品关系图的介数中心性特征对提升推荐效果有显著作用。

http://www.jsqmd.com/news/933073/

相关文章:

  • 2026年当前新疆市场100吨地磅优秀直销厂商综合实力解析 - 2026年企业资讯
  • 告别混乱图表!QCustomPlot多轴布局进阶指南:从游标联动到坐标轴标签美化
  • Maglite 2AA手电筒LED改造:恒流升压驱动实现超长续航
  • 2026年国内手机信号屏蔽仪权威品牌TOP5盘点:中考手机信号屏蔽器/中考防作弊器/中高考手机信号屏蔽仪/中高考防作弊器/选择指南 - 优质品牌商家
  • 带图形界面的Python人脸表情识别工具,含ResNet与CNN双模型及一键运行说明
  • 保姆级教程:用Python+TI毫米波雷达开发板,动手实现FMCW测距与测速
  • 基于Arduino与Blynk的智能任务助手:物联网自动化办公实践
  • 2026黄石中专学校评测:浠水中专学校/浠水中等专业学校/浠水中职学校/浠水技工学校/浠水技校/浠水职业中专/浠水职业高中/选择指南 - 优质品牌商家
  • 别再只调包了!手把手教你用Python复现经典跨模态哈希算法(以CMFH/SCRATCH为例)
  • 保姆级教程:用树莓派4B和Python3.9搭建你的第一个智能家居传感器(附完整代码)
  • 基于STM32F103的双量程电子秤方案:KG/g自由切换、单价结算与超重报警
  • Steam下载完成后自动关机:告别熬夜等待的智能解决方案
  • 从传感器到ISP:深入解读gc1084 AE参数表背后的设计逻辑与调优心得
  • 不干胶生产设备实测评测:全自动切管机/全自动模切分条复卷机/半自动复卷机/半自动模切分条复卷机/复卷机设备/无胶复卷机/选择指南 - 优质品牌商家
  • 深入fDSST代码细节:手把手解析特征提取与矩阵运算中的那些‘坑’(Python版)
  • MacBook Pro M1/M2芯片也能跑金蝶EAS 8.2?实测保姆级配置教程(含JDK 1.7避坑指南)
  • 工程机械入侵识别 智慧工地工程车辆装备 高空无人机挖掘机 起重机识别
  • 升级openGauss踩坑记:nvarchar字段突然插不进10个汉字了?手把手教你排查字符集问题
  • DRAM地址映射逆向工程:空空间分析方法与实践
  • 基于ESP32/NodeMCU与Blynk的分布式智能家居系统DIY指南
  • 别再折腾Docker了!一条命令搞定Vaultwarden+HTTPS,顺便聊聊Bitwarden自建的那些‘坑’
  • 2026年至今浙江可靠的二手注塑机定制厂家联系方式专业解析 - 2026年企业资讯
  • Unity项目效率翻倍:RT-Voice PRO 2023.1.0快速集成与5个避坑点(新手必看)
  • 不只是安装:用VMware 16在AMD电脑上搭建macOS BigSur后的优化与备份实战
  • 告别在线版卡顿!手把手教你在Windows本地部署Lama Cleaner去水印神器(附模型下载加速技巧)
  • 点云补全论文复现避坑指南:手把手教你用Python计算CD、EMD、F-Score(附代码)
  • SAP PP实战:用派生BOM管理‘同款不同色’物料,效率提升不止一点点
  • 免费网盘直链下载助手:八大网盘一键获取下载地址的终极指南
  • LVGL v8.3模拟器搭建全记录:从Github下载到VSCode运行,一步步搞定CMake工程
  • [智能体-212]:大模型:LangChain 与 LangGraph 智能体的灵魂与核心基石。没有大模型,就没有 LangChain 和 LangGraph 构建的任何智能体。