当前位置: 首页 > 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.rkmt.cn/news/1444408.html

相关文章:

  • 2026年当前新疆市场100吨地磅优秀直销厂商综合实力解析 - 2026年企业资讯
  • 基于Arduino与Blynk的智能任务助手:物联网自动化办公实践
  • 别再只调包了!手把手教你用Python复现经典跨模态哈希算法(以CMFH/SCRATCH为例)
  • 深入fDSST代码细节:手把手解析特征提取与矩阵运算中的那些‘坑’(Python版)
  • 不只是安装:用VMware 16在AMD电脑上搭建macOS BigSur后的优化与备份实战
  • 告别在线版卡顿!手把手教你在Windows本地部署Lama Cleaner去水印神器(附模型下载加速技巧)
  • 点云补全论文复现避坑指南:手把手教你用Python计算CD、EMD、F-Score(附代码)
  • 免费网盘直链下载助手:八大网盘一键获取下载地址的终极指南
  • Dell R730老当益壮:ESXi 8.0 vs 7.0 版本选择与性能实测指南(含驱动兼容性分析)
  • [智能体-212]:大模型:LangChain 与 LangGraph 智能体的灵魂与核心基石。没有大模型,就没有 LangChain 和 LangGraph 构建的任何智能体。
  • Hyperledger Fabric医疗病历上链系统毕设全套:源码可运行+论文答辩材料齐全
  • STM32 ADC实战避坑:从菜鸟到老手,这10个配置细节你踩过几个?
  • Pointwise V18脚本实战:从‘录制宏’到‘定制化批量工具’的升级之路
  • 数学建模小白也能搞定!用Python+机器学习预测快递运输量(附五一赛B题完整代码)
  • Django表格革命:django-tables2的智能化数据展示解决方案
  • 告别卡顿!4GB内存老电脑升级实战:从Win10 LTSC到Linux,哪个更适合你?
  • [智能体-213]:有向无环图 (DAG) 与有向有环图 (Cyclic Graph) 概述
  • 从.dynamic到.debug_info:一次搞懂Linux下ELF文件的‘隐藏’数据段(readelf/objdump实战)
  • Windows Server 2022下iSCSI存储连接实战:从MPIO配置到磁盘挂载的保姆级避坑指南
  • MATLAB自动驾驶换道控制实战包:五次多项式轨迹生成+安全决策逻辑+Simulink联合仿真
  • 手把手教你用AutoDock Vina完成分子对接:从蛋白处理到结果分析全流程(附常见报错解决)
  • 决策树实战避坑指南:从鸢尾花数据集到模型过拟合,我的调参踩坑实录
  • 2026年杭州转学实操全解析:杭州落户、杭州转学、杭州上学、杭州借房入学、杭州入学、杭州升学规划、杭州择校、杭州插班选择指南 - 优质品牌商家
  • WinSCP vs FileZilla:哪个才是你Windows SFTP文件同步的‘最佳拍档’?
  • 6G ISAC成像技术:无线通信与环境感知的融合
  • 全国高强涤纶土工格栅供应企业实力排行盘点:玻纤格栅、短丝土工布、聚酯经编涤纶土工格栅、钢塑复合土工格栅、钢塑格栅选择指南 - 优质品牌商家
  • 别再被官网坑了!手把手教你搞定Acer SpatialLabs View Pro在UE5里的裸眼3D显示
  • 手把手教你为Ubuntu 22.04编译安装蓝牙驱动:以解决RTL8852BE搜索失灵为例
  • CKKS自举算法演进史:从CHKKS18到Meta-BTS,我们是如何一步步把精度“磨”出来的?
  • KOReader插件扩展开发深度解析:模块化架构设计与自定义功能实现