如何用Python解析JSON文件中的复合键值并拆分对应字段?
问题与解决方案
问题概述
需要将包含拼接字段的JSON数据,拆分为独立的ANIMAL_NAME、FOOD、HOUSENAME字段。原始JSON示例:
[{ "ANIMAL_NAME FOOD HOUSENAME": "Jack Cat Chewy Food Owners House" }, { "ANIMAL_NAME FOOD HOUSENAME": "Harry Parrot Bird Chewy Food Good A Owners House" }, { "ANIMAL_NAME FOOD HOUSENAME": "Fred Dog Dog Fun Steak Rack Dog" }, { "ANIMAL_NAME FOOD HOUSENAME": "Fred Dog Dog Some Kind of Food Some Kind of House" }]
目标格式:
[{ "ANIMAL_NAME": "Jack Cat", "FOOD": "Chewy Food", "HOUSENAME": "Owners House" }, { "ANIMAL_NAME": "Harry Parrot Bird", "FOOD": "Chewy Food Good", "HOUSENAME": "A Owners House" }, { "ANIMAL_NAME": "Fred Dog Dog", "FOOD": "Fun Steak Rack", "HOUSENAME": "Dog" }, { "ANIMAL_NAME": "Fred Dog Dog", "FOOD": "Some Kind of Food", "HOUSENAME": "Some Kind of House" }]
现有代码存在结构错误,且缺少字段拆分逻辑。
修正后的基础代码框架
首先修复原代码的结构问题(data是列表,需遍历每个字典元素):
import json # 读取原始数据 with open('data.json', 'r') as file: data = json.load(file) processed_data = [] for item in data: # 获取拼接的字符串并去除首尾空白 full_text = item["ANIMAL_NAME FOOD HOUSENAME"].strip() # 拆分逻辑将在这里实现 processed_item = {} processed_data.append(processed_item) # 保存处理后的结果 with open('processed_data.json', 'w') as outfile: json.dump(processed_data, outfile, indent=4)
字段拆分方案
由于数据无固定拆分规律,提供以下三种可行思路:
1. 基于关键词匹配的规则拆分
观察示例数据的特征,利用食物(如Food)、住所(如House)相关关键词定位拆分位置:
import json def split_by_keywords(full_text): words = full_text.split() food_pos = None # 找到第一个"Food"的位置 for idx, word in enumerate(words): if word.lower() == "food": food_pos = idx break house_pos = None # 找到"House"的位置(从Food之后开始找) if food_pos: for idx, word in enumerate(words[food_pos:], start=food_pos): if word.lower() == "house": house_pos = idx break # 处理不同情况的拆分 if food_pos and house_pos: animal_name = ' '.join(words[:food_pos-1]) food = ' '.join(words[food_pos-1:house_pos]) housename = ' '.join(words[house_pos:]) elif food_pos: # 没有House关键词的情况(如第三个示例) animal_name = ' '.join(words[:food_pos-1]) food = ' '.join(words[food_pos-1:-1]) housename = words[-1] else: # 极端情况,返回原始值(可根据实际调整) animal_name = full_text food = "" housename = "" return { "ANIMAL_NAME": animal_name, "FOOD": food, "HOUSENAME": housename } # 读取并处理数据 with open('data.json', 'r') as file: data = json.load(file) processed_data = [split_by_keywords(item["ANIMAL_NAME FOOD HOUSENAME"].strip()) for item in data] # 保存结果 with open('processed_data.json', 'w') as outfile: json.dump(processed_data, outfile, indent=4)
该方案对示例数据可准确拆分,若关键词变化,只需调整关键词列表。
2. 交互式人工拆分
数据量较小时,人工确认拆分位置是最准确的方式:
import json def interactive_split(full_text): words = full_text.split() print(f"\n原始内容:{' '.join(words)}") print(f"单词索引:{list(enumerate(words))}") # 输入各字段的结束索引 animal_end = int(input("输入ANIMAL_NAME的最后一个单词索引:")) food_end = int(input("输入FOOD的最后一个单词索引:")) animal_name = ' '.join(words[:animal_end+1]) food = ' '.join(words[animal_end+1:food_end+1]) housename = ' '.join(words[food_end+1:]) return { "ANIMAL_NAME": animal_name, "FOOD": food, "HOUSENAME": housename } # 读取并处理数据 with open('data.json', 'r') as file: data = json.load(file) processed_data = [interactive_split(item["ANIMAL_NAME FOOD HOUSENAME"].strip()) for item in data] # 保存结果 with open('processed_data.json', 'w') as outfile: json.dump(processed_data, outfile, indent=4)
运行后会逐个展示原始内容和单词索引,输入对应索引即可完成拆分。
3. 机器学习序列标注拆分
若数据量较大,可训练序列标注模型(如BERT-CRF),将每个单词标注为ANIMAL、FOOD、HOUSENAME三类,自动完成拆分。此方案需要准备标注好的训练数据,适合大规模无规律数据处理。
内容的提问来源于stack exchange,提问作者user18774110
相关产品推荐
相关产品推荐

