You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:50:25