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)
参考文章