使用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
相关产品推荐
相关产品推荐

