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

使用Hugging Face load_dataset加载JSONLine数据集字段不匹配报错解决

解决Hugging Face load_dataset加载JSONLine时保留原字段且忽略处理的问题

问题场景

你用Hugging Face的load_dataset加载JSONLine格式数据集时遇到字段匹配错误,数据样例如下:

{"tokens": ["На", "місці", "трагедії", "Безсмертний", "заявив", ",", "що", "«", "нелюдські", "вчинки", "можуть", "оцінюватися", "лише", ",", "як", "звірство", "»", ".", "Нагадаємо", ",", "11", "квітня", "на", "станції", "метро", "«", "Жовтнева", "»", "у", "Мінську", "стався", "вибух", ",", "в", "результаті", "якого", "загинули", "12", "людей", ",", "більше", "150", "отримали", "поранення", ".", "13", "квітня", "Лукашенко", "заявив", "про", "розкриття", "теракту", ".", "Інша", "справа", ",", "що", "немає", "ясності", ",", "хто", "за", "цим", "стоїть", ".", "Багато", "хто", "звертає", "увагу", "на", "те", ",", "що", "вибух", "скоєно", "неподалік", "адміністрації", "президента", ".", "Сам", "Олександр", "Лукашенко", "учора", "увечері", "провів", "термінову", "нараду", "і", "наказав", "знайти", "тих", ",", "кому", "потрібно", "зруйнувати", "стабільність", "."], "source_start": 31, "source_end": 31, "target_start": 73, "target_end": 73, "topic_id": "255715", "source_id": "T10", "target_id": "T129", "doc_ids": [0, 1], "label": 1}

加载时触发错误:

ValueError: Couldn't cast
tokens: list<item: string>
  child 0, item: string
source_start: int64
source_end: int64
target_start: int64
target_end: int64
label: int64
to
{'tokens': Sequence(feature=Value(dtype='string', id=0), length=-1, id=None), 'label': Value(dtype='int32', id=1), 'source_start': Value(dtype='int32', id=2), 'source_end': Value(dtype='int32', id=3), 'target_start': Value(dtype='int32', id=3), 'target_end': Value(dtype='int32', id=4), 'topic_id': Value(dtype='string', id=5), 'doc_id': Sequence(feature=Value(dtype='int32', id=6), length=-1, id=None), 'source_id': Value(dtype='string', id=7), 'target_id': Value(dtype='string', id=8)}
because column names don't match

你的加载代码:

custom_features = Features(
    {
        "tokens": Sequence(Value("string", id=0)),
        "label": Value("int32", id=1),
        "source_start": Value("int32", id=2),
        "source_end": Value("int32", id=3),
        "target_start": Value("int32", id=3),
        "target_end": Value("int32", id=4),
        'topic_id': Value("string", id=5),
        'doc_id': Sequence(Value("int32", id=6)),
        'source_id': Value("string", id=7),
        'target_id': Value("string", id=8),
    }
)

raw_datasets = load_dataset('json', data_files={
    'train': args.train_file,
    'dev': args.dev_file,
    'test': args.test_file
},features=custom_features)

错误根源:自定义Features里的doc_id和数据中的doc_ids字段名不匹配;同时你希望保留JSON文件中的额外字段(topic_id、source_id、target_id、doc_ids),仅在加载处理时忽略它们。


可行解决方案

方案1:仅加载核心字段,忽略额外字段

直接在Features中只定义需要处理的核心字段,再添加ignore_unknown_columns=True参数,加载时自动忽略数据中存在但未定义的字段,同时原JSON文件的字段不会被修改。

代码示例:

from datasets import Features, Sequence, Value, load_dataset

# 仅定义需要处理的核心字段
custom_features = Features(
    {
        "tokens": Sequence(Value("string")),
        "label": Value("int32"),
        "source_start": Value("int32"),
        "source_end": Value("int32"),
        "target_start": Value("int32"),
        "target_end": Value("int32"),
    }
)

raw_datasets = load_dataset(
    'json',
    data_files={'train': args.train_file, 'dev': args.dev_file, 'test': args.test_file},
    features=custom_features,
    ignore_unknown_columns=True  # 关键参数:忽略未在Features中定义的字段
)

方案2:加载所有字段,后续处理时过滤

先修正Features中的字段名(把doc_id改为doc_ids,和数据一致),正常加载所有字段,之后用remove_columns在预处理阶段过滤掉不需要的字段,适合需要暂时保留额外字段做日志或分析的场景。

代码示例:

from datasets import Features, Sequence, Value, load_dataset

# 修正字段名,匹配数据中的doc_ids
custom_features = Features(
    {
        "tokens": Sequence(Value("string", id=0)),
        "label": Value("int32", id=1),
        "source_start": Value("int32", id=2),
        "source_end": Value("int32", id=3),
        "target_start": Value("int32", id=3),
        "target_end": Value("int32", id=4),
        'topic_id': Value("string", id=5),
        'doc_ids': Sequence(Value("int32", id=6)),
        'source_id': Value("string", id=7),
        'target_id': Value("string", id=8),
    }
)

# 正常加载所有字段
raw_datasets = load_dataset(
    'json',
    data_files={'train': args.train_file, 'dev': args.dev_file, 'test': args.test_file},
    features=custom_features
)

# 预处理时移除不需要的字段(替换lambda为你的实际预处理逻辑)
processed_datasets = raw_datasets.map(
    lambda example: example,
    remove_columns=["topic_id", "doc_ids", "source_id", "target_id"]
)

内容的提问来源于stack exchange,提问作者user3070752

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:14:54