huggingface的数据集加载方式

加载huggingface上的数据集

假设数据集长这样

通过下面的代码进行加载

rom datasets import load_dataset
from transformers import AutoModelForSequenceClassification, AutoTokenizer
#加载模型
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# 加载数据
dataset = load_dataset("glue", "mrpc", split="train")
# 数据token
def encode(examples):
    return tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, padding="max_length")
#修改        
dataset = dataset.map(lambda examples: {"labels": examples["label"]}, batched=True)
# 添加数据
dataset = dataset.map(encode, batched=True)
dataset[0]
---------------每个数据行都是用dict的形式输出的
{'sentence1': 'Amrozi accused his brother , whom he called " the witness " , of deliberately distorting his evidence .',
'sentence2': 'Referring to him as only " the witness " , Amrozi accused his brother of deliberately distorting his evidence .',
'label': 1,
'idx': 0,
'input_ids': array([  101,  7277,  2180,  5303,  4806,  1117,  1711,   117,  2292, 1119,  1270,   107,  1103,  7737,   107,   117,  1104,  9938, 4267, 12223, 21811,  1117,  2554,   119,   102, 11336,  6732, 3384,  1106,  1140,  1112,  1178,   107,  1103,  7737,   107, 117,  7277,  2180,  5303,  4806,  1117,  1711,  1104,  9938, 4267, 12223, 21811,  1117,  2554,   119,   102]),
'token_type_ids': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
'attention_mask': array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])}

加载本地数据集

情况1

如果无法使用huggingface上的数据集,比如网络的连接存在问题,那么可以将数据集从huggingface上通过浏览器的方式下载到本地,进行类似的方式进行读取,唯一的区别是将load_dataset函数的第一个参数改为本地的路径。

情况2

如果数据本身就是本地的数据集。只能通过下面的方式进行加载

纯文本格式数据

如果数据集是本地的数据集,且是txt文本,且是纯文本,一行为一个样本。

我们如何在日常生活中减少用水?1. 使用节水装置,如节水淋浴喷头和水龙头。 
2. 使用水箱或水桶收集家庭废水,例如洗碗和洗浴。 
3. 在社区中提高节水意识。 
4. 检查水管和灌溉系统的漏水情况,并及时修复它们。 
5. 洗澡时间缩短,使用低流量淋浴头节约用水。 
6. 收集雨水,用于园艺或其他非饮用目的。 
7. 刷牙或擦手时关掉水龙头。 
8. 减少浇水草坪的时间。 
9. 尽可能多地重复使用灰水(来自洗衣机、浴室水槽和淋浴的水)。 
10. 只购买能源效率高的洗碗机和洗衣机。

此时可以这样加载:

import datasets
from datasets import load_dataset

data_file = '/home/14192/2023/LLM/Chinese-LLaMA-Alpaca/data/pt_sample_data.txt'
raw_dataset = load_dataset("text",data_files = data_file)

raw_datase
---------------
DatasetDict({
    train: Dataset({
        features: ['text'],
        num_rows: 125987
    })
})

raw_dataset["train"][0]["text"]
--------------------
'我们如何在日常生活中减少用水?1. 使用节水装置,如节水淋浴喷头和水龙头。 '

json格式的数据

假设数据是这样的json格式

[
  {
    "instruction": "我们如何在日常生活中减少用水?",
    "input": "",
    "output": "1. 使用节水装置,如节水淋浴喷头和水龙头。 \n2. 使用水箱或水桶收集家庭废水,例如洗碗和洗浴。 \n3. 在社区中提高节水意识。 \n4. 检查水管和灌溉系统的漏水情况,并及时修复它们。 \n5. 洗澡时间缩短,使用低流量淋浴头节约用水。 \n6. 收集雨水,用于园艺或其他非饮用目的。 \n7. 刷牙或擦手时关掉水龙头。 \n8. 减少浇水草坪的时间。 \n9. 尽可能多地重复使用灰水(来自洗衣机、浴室水槽和淋浴的水)。 \n10. 只购买能源效率高的洗碗机和洗衣机。"
  },
  {
    "instruction": "编辑文章,使其更吸引读者。",
    "input": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入。自主机器人在各个行业中被越来越广泛地应用,从制造业到医疗保健再到安全。",
    "output": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入,从而实现了新的效率、精确度和可靠性水平。自主机器人在各个行业中被越来越广泛地应用,从制造业,它们可以使用精度和一致的质量组装复杂的组件,到医疗保健,可以协助进行医疗测试和处理,再到安全,可以监控大面积地区,保障人们和财产的安全。自主机器人还可以减少在危险或有害环境中的错误和增加安全,在工业流程的检查或维修期间等。由于其多样性,自主机器人将彻底改变我们工作方式的方式,使任务变得更加简单、快速,最终更加愉悦。"
  }
]

那么可以通过下面的方式进行数据集的加载,

    data_file = '/home/14192/2023/LLM/Chinese-LLaMA-Alpaca/data/alpaca_data_zh_51k.json'
    dataset = datasets.load_dataset("json", data_files=data_file)
    print(dataset)
    print(dataset['train'][0])

#输出展示

'''
DatasetDict({
    train: Dataset({
        features: ['output', 'instruction', 'input'],
        num_rows: 51179
    })
})
{'output': '1. 使用节水装置,如节水淋浴喷头和水龙头。 \n2. 使用水箱或水桶收集家庭废水,例如洗碗和洗浴。 \n3. 在社区中提高节水意识。 \n4. 检查水管和灌溉系统的漏水情况,并及时修复它们。 \n5. 洗澡时间缩短,使用低流量淋浴头节约用水。 \n6. 收集雨水,用于园艺或其他非饮用目的。 \n7. 刷牙或擦手时关掉水龙头。 \n8. 减少浇水草坪的时间。 \n9. 尽可能多地重复使用灰水(来自洗衣机、浴室水槽和淋浴的水)。 \n10. 只购买能源效率高的洗碗机和洗衣机。', 'instruction': '我们如何在日常生活中减少用水?', 'input': ''}

Process finished with exit code 0


'''

默认加载的数据为train集合,可以将多条本地数据整合到一个train数据集

from datasets import load_dataset 
squad_it_dataset = load_dataset("json", data_files="./data/SQuAD_it-train.json", field="data")  #也可以加载文本文件 
dataset = load_dataset('text', data_files={'train': ['my_text_1.txt', 'my_text_2.txt'], 'test': 'my_test_file.txt'})

默认的数据是在train这个split中,如果想要结果被加载到dataset的其他自定义的分支中,那么手动打印的结果指定一下data_files:

path= '/2023/LLM_evaluate/chinese-eval/lm-evaluation-harness/dataset/ARC-Easy/ARC-Easy-Dev.jsonl'
# dev_data=datasets.load_dataset("csv",data_files=path)  

test_data = datasets.load_dataset("csv",data_files={"test":path})
print(test_data)
print(test_data['test'])
print(test_data['test'][0])

打印的结果

DatasetDict({
    test: Dataset({
        features: ['id', 'question', 'answerKey'],
        num_rows: 570
    })
})
Dataset({
    features: ['id', 'question', 'answerKey'],
    num_rows: 570
})
{'id': 'MCAS_2000_4_6', 'question': {'stem': 'Which technology was developed most recently?', 'choices': [{'text': 'cellular telephone', 'label': 'A'}, {'text': 'television', 'label': 'B'}, {'text': 'refrigerator', 'label': 'C'}, {'text': 'airplane', 'label': 'D'}]}, 'answerKey': 'A'}

csv格式的数据集

简单的本地csv数据加载和json的加载方式类似,只是load_datasets的第一个关键字变为"csv"

复杂一点的本地CSV数据加载情况,比如csv文件没有列名的情况。可以通过加载pandas.DataFrame的方式加载

import pandas as pd
from datasets import Dataset
path = '/home/wenting/14192/2023/LLM_evaluate/chinese-eval/lm-evaluation-harness/dataset/mmlu/test/abstract_algebra_test.csv'
column_names =["query","A","B","C","D","answer"]
df = pd.read_csv(path,header=None,names=column_names)
df = pd.DataFrame(df)
print(dataset)
dataset = Dataset.from_pandas(df)
print(dataset[0])

打印格式

Dataset({
    features: ['query', 'A', 'B', 'C', 'D', 'answer'],
    num_rows: 100
})
{'query': 'Find the degree for the given field extension Q(sqrt(2), sqrt(3), sqrt(18)) over Q.', 'A': '0', 'B': '4', 'C': '2', 'D': '6', 'answer': 'B'}

从内存中加载数据

支持从内存中加载字典或者DafaFrame(pandas)数据结构的数据,具体操作示例如下:


# 从字典导入数据 
from datasets import Dataset 
my_dict = {"a": [1, 2, 3]} 
dataset = Dataset.from_dict(my_dict) # 从dataFrame导入数据 
import pandas as pd 
df = pd.DataFrame({"a": [1, 2, 3]}) 
dataset = Dataset.from_pandas(df)

参考文章

Huggingface详细入门介绍之dataset库 - 知乎

https://huggingface.co/docs/datasets/tabular_load#csv-files