如何使用Hugging Face实现torchtext的Example.fromJSON等价功能?
你查询到的load_dataset加载JSON的方案完全匹配你的需求,Example.fromJSON的等价实现可以按以下步骤完成:
1 加载原始JSON数据集
对应你原来的逐文件读JSON逻辑,datasets库支持直接传入批量文件路径,底层自动完成IO和JSON解析,等价于原来的Example.fromJSON读取单条JSON的基础功能:
import os from datasets import load_dataset # 替换为你实际的文件路径列表 reading_path = "你的数据目录" file_list = [os.path.join(reading_path, fname) for fname in 你的文件名列表] raw_datasets = load_dataset("json", data_files=file_list)
2 等价替换Fields预处理逻辑
原来torchtext的RawField、NestedField、Field定义的字段处理规则,对应到Hugging Face生态中用map方法执行自定义预处理函数实现,你可以完全复用原来的分句、分词逻辑,只需要适配Transformer输入格式即可:
from transformers import AutoTokenizer # 替换为你使用的预训练模型对应的分词器 tokenizer = AutoTokenizer.from_pretrained("你的预训练模型名") # 对应原来的NestedField固定长度配置 MAX_SENTENCES = 50 MAX_SENTENCE_LENGTH = 80 def preprocess_function(examples): # 对应RawField逻辑:直接保留原始字段 outputs = { "raw_content": examples["article"], "raw_abstract": examples["abstract"], "id": examples["id"] } # 对应content字段的NestedField逻辑:分句后逐句分词定长 # 此处分句逻辑可直接替换为你原有代码的实现 sentences = examples["article"].split("。") sentences = sentences[:MAX_SENTENCES] # 逐句分词 tokenized_sents = tokenizer( sentences, truncation=True, max_length=MAX_SENTENCE_LENGTH, padding="max_length", return_attention_mask=True ) # 补全到固定句子数 while len(tokenized_sents["input_ids"]) < MAX_SENTENCES: tokenized_sents["input_ids"].append([0]*MAX_SENTENCE_LENGTH) tokenized_sents["attention_mask"].append([0]*MAX_SENTENCE_LENGTH) outputs["content"] = tokenized_sents["input_ids"] outputs["content_attention_mask"] = tokenized_sents["attention_mask"] # 对应abstract字段的NestedField逻辑 tokenized_abs = tokenizer( examples["abstract"], truncation=True, padding="longest", return_attention_mask=True ) outputs["abstract"] = tokenized_abs["input_ids"] outputs["abstract_attention_mask"] = tokenized_abs["attention_mask"] return outputs # 批量预处理,num_proc参数对应原来joblib的并行逻辑 processed_datasets = raw_datasets.map( preprocess_function, num_proc=os.cpu_count() )
3 效果说明
- 处理后的
processed_datasets中每条样本等价于原来的Example实例,可直接通过字段名访问对应内容,无需额外封装 - 输出格式可直接对接Transformers的模型输入,不需要额外做格式转换
- 支持后续直接调用
train_test_split、shuffle、format等内置方法完成数据集划分、打乱、转张量等操作
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

