Hugging Face数据集的简单使用

一、参考资料

Hugging Face快速入门(重点讲解模型(Transformers)和数据集部分(Datasets))

【huggingface】数据集及模型下载并保存至本地

HuggingFace | 如何下载数据集并加载

二、Hugging Face数据集

Datasets类库(github, 官方文档)可以让你非常方便的访问和分享数据集,也可以用来对NLP、CV、语音等任务进行评价(Evaluation metrics)。

1. 安装Datasets库

pip install datasets

# 如果使用语音(Audio)数据集
pip install datasets[audio]

# 如果使用图片(Image)数据集
pip install datasets[vision]

2. 查找数据集

数据集(Dataset)

数据集(Dataset)文档

在这里插入图片描述

3. (在线)加载数据集

3.1 函数原型
def load_dataset(
    path: str,
    name: Optional[str] = None,
    data_dir: Optional[str] = None,
    data_files: Union[Dict, List] = None,
    split: Optional[Union[str, Split]] = None,
    cache_dir: Optional[str] = None,
    features: Optional[Features] = None,
    download_config: Optional[DownloadConfig] = None,
    download_mode: Optional[GenerateMode] = None,
    ignore_verifications: bool = False,
    save_infos: bool = False,
    script_version: Optional[Union[str, Version]] = None,
    **config_kwargs,
) -> Union[DatasetDict, Dataset]:

参数解释

  • path:参数path表示数据集的名字或者路径。可以是如下几种形式(每种形式的使用方式后面会详细说明)
    • 数据集的名字,比如 imdbglue
    • 数据集文件格式,比如 jsoncsvparquettxt
    • 数据集目录中的处理数据集的脚本(.py)文件,比如 glue/glue.py
  • name:参数name表示数据集中的子数据集,当一个数据集包含多个数据集时,就需要这个参数,比如glue数据集下就包含 sst2colaqqp 等多个子数据集,此时就需要指定name来表示加载哪一个子数据集。
  • data_dir:数据集所在的目录。
  • data_files:数据集文件。
  • cache_dir:构建的数据集缓存目录,方便下次快速加载。
3.2 加载数据集(方式一)
from datasets import load_dataset

dataset = load_dataset(path="glue", name='ax')
print(dataset)

输出结果

DatasetDict({
    test: Dataset({
        features: ['premise', 'hypothesis', 'label', 'idx'],
        num_rows: 1104
    })
})
3.2 3 加载数据集(方式二)

先下载到本地,然后再加载本地数据集。

下载默认路径

可以通过 cache_dir 属性指定下载路径。

Windows路径:C:\Users\[用户名]\.cache\huggingface\datasets

Linux路径:~/.cache/huggingface/datasets

from datasets import load_dataset, load_from_disk

# glue数据集的cola子集
dataset = load_dataset(path='glue', name='cola', cache_dir='./raw_datasets')
# 保存到本地
dataset.save_to_disk('/root/Downloads/datasets/glue/cola')

# 加载本地数据集
raw_dataset = load_from_disk("/root/Downloads/datasets/glue/cola")
print(raw_dataset )

输出结果

DatasetDict({
    train: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 8551
    })
    validation: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1043
    })
    test: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1063
    })
})

在这里插入图片描述

数据集目录

-- glue_cola
    |-- dataset_dict.json
    |-- test
    |   |-- data-00000-of-00001.arrow
    |   |-- dataset_info.json
    |   `-- state.json
    |-- train
    |   |-- data-00000-of-00001.arrow
    |   |-- dataset_info.json
    |   `-- state.json
    `-- validation
        |-- data-00000-of-00001.arrow
        |-- dataset_info.json
        `-- state.json

4. (离线)加载数据集

如果 load_dataset 加载在线数据集失败,可下载数据集到本地,再加载本地数据集。

注意:手动离线下载的是原始数据,没有匹配datasets库的格式,导致 load_dataset() 加载失败。

关于如何本地下载Hugging Face原始数据,可参考博客:如何批量下载hugging face模型和数据集文件

4.1 GLUE数据集

数据集地址: nyu-mll/glue,有原始数据文件。

4.1.1 下载原始数据

mainscript 两个不同分支上分别下载原始数据和 .py脚本数据,下载之后合并这两个文件夹。

去掉后面的 /tree/main,然后增添 .git,即可使用git下载。

# 下载原始数据(main分支)
git lfs clone https://huggingface.co/datasets/nyu-mll/glue.git -b main

# 下载.py文件(script分支)
git lfs clone https://huggingface.co/datasets/nyu-mll/glue.git -b script

在这里插入图片描述

在这里插入图片描述

4.1.2 加载数据集
from datasets import load_dataset

dataset = load_dataset(path="/root/Downloads/glue", name='cola')
print(dataset)

输出结果

DatasetDict({
    train: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 8551
    })
    validation: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1043
    })
    test: Dataset({
        features: ['sentence', 'label', 'idx'],
        num_rows: 1063
    })
})

4.2 ChnSentiCorp数据集

用于中文情感分析,标记了每条评论的情感极性(0或1)。

数据集地址: seamew/ChnSentiCorp,有原始数据文件。

在这里插入图片描述

4.2.1 下载原始数据
git lfs clone https://huggingface.co/datasets/seamew/ChnSentiCorp.git
4.2.2 保存数据集

git下载的文件无法直接使用

  • load_dataset 会执行 .python文件,通过 https://drive.google.com 下载数据导致下载失败报错。
  • load_from_disk会执行失败,因为该文件夹非dist数据集格式。

在这里插入图片描述

解决办法:通过 save_to_disk() 保存为本地数据集。

# 设置data_files 
data_files = {
    'train': '/root/Downloads/ChnSentiCorp/chn_senti_corp-train.arrow',
    'test': '/root/Downloads/ChnSentiCorp/chn_senti_corp-test.arrow',
    'validation': '/root/Downloads/ChnSentiCorp/chn_senti_corp-validation.arrow'}
# 加载arrow数据集
dataset = load_dataset(path='arrow', data_files=data_files)
# 保存至本地
dataset.save_to_disk('/root/Downloads/datasets/chn_senti_corp')

保存本地数据集后,数据集目录如下所示:

`-- chn_senti_corp
    |-- dataset_dict.json
    |-- test
    |   |-- data-00000-of-00001.arrow
    |   |-- dataset_info.json
    |   `-- state.json
    |-- train
    |   |-- data-00000-of-00001.arrow
    |   |-- dataset_info.json
    |   `-- state.json
    `-- validation
        |-- data-00000-of-00001.arrow
        |-- dataset_info.json
        `-- state.json
4.2.3 加载数据集
dataset = load_from_disk('/root/Downloads/datasets/chn_senti_corp')
print(dataset)

输出结果

DatasetDict({
    train: Dataset({
        features: ['label', 'text'],
        num_rows: 9600
    })
    test: Dataset({
        features: ['label', 'text'],
        num_rows: 1200
    })
    validation: Dataset({
        features: ['label', 'text'],
        num_rows: 1200
    })
})

4.3 peoples_daily_ner数据集

用于中文命名实体识别(NER),来自人民日报的文本数据,标记了人名、地名 、组织机构等。

数据集地址: peoples-daily-ner/peoples_daily_ner ,并无原始数据文件。

在这里插入图片描述

通过查看 .py 文件,可知数据集下载地址为:

_URL = "https://raw.githubusercontent.com/OYE93/Chinese-NLP-Corpus/master/NER/People's%20Daily/"

但是,https://raw.githubusercontent.com 无法访问,可通过 https://github.com 下载原始数据。

在这里插入图片描述

在这里插入图片描述

4.3.1 下载原始数据

分别下载原始数据以及数据集,并将原始数据拷贝到数据集文件夹中。

# 下载数据集
git lfs clone https://huggingface.co/datasets/peoples_daily_ner.git

# 下载原始数据
example.dev、example.train、example.test

# 拷贝原始数据
cp example.dev /root/Downloads/peoples_daily_ner
cp example.train /root/Downloads/peoples_daily_ner
cp example.test /root/Downloads/peoples_daily_ner
4.3.2 修改.py 文件
_URL = "https://raw.githubusercontent.com/OYE93/Chinese-NLP-Corpus/master/NER/People's%20Daily/"
改为
_URL = ""
4.3.3 保存数据集

_URL 修改为本地路径。

dataset = load_dataset('/root/Downloads/peoples_daily_ner')
dataset.save_to_disk('/root/Downloads/datasets/peoples_daily_ner')

保存本地数据集后,数据集目录如下所示:

`-- peoples_daily_ner
    |-- dataset_dict.json
    |-- test
    |   |-- data-00000-of-00001.arrow
    |   |-- dataset_info.json
    |   `-- state.json
    |-- train
    |   |-- data-00000-of-00001.arrow
    |   |-- dataset_info.json
    |   `-- state.json
    `-- validation
        |-- data-00000-of-00001.arrow
        |-- dataset_info.json
        `-- state.json
4.3.4 加载数据集
dataset = load_from_disk('/root/Downloads/datasets/peoples_daily_ner')
print(dataset)

输出结果

DatasetDict({
    train: Dataset({
        features: ['id', 'tokens', 'ner_tags'],
        num_rows: 20865
    })
    validation: Dataset({
        features: ['id', 'tokens', 'ner_tags'],
        num_rows: 2319
    })
    test: Dataset({
        features: ['id', 'tokens', 'ner_tags'],
        num_rows: 4637
    })
})

5. 自定义数据集

自定义数据集,主要包括以下步骤:

  1. 首先,使用 Dataset.from_dict 方法定义了一个包含两个样本的数据集。
  2. 其次,将这个数据集添加到 DatasetDict 对象中,并使用键名my_dataset 进行标识。
  3. 然后,打印 DatasetDict 对象中的 my_dataset 数据集。
  4. 最后,使用 save_to_disk 方法将数据集保存到指定位置。

5.1 保存数据集

from datasets import DatasetDict, Dataset

# 定义数据集
my_dataset = Dataset.from_dict({
    "text": ["Hello, world!", "How are you?"],
    "label": [1, 0]
})

# 将数据集添加到DatasetDict中
dataset_dict = DatasetDict({"my_dataset": my_dataset})

# 打印数据集
print(dataset_dict["my_dataset"])

# 将数据集保存到指定位置
my_dataset.save_to_disk("/root/Downloads/datasets/my_dataset")

保存本地数据集后,数据集目录如下所示:

|-- my_dataset
|   |-- data-00000-of-00001.arrow
|   |-- dataset_info.json
|   `-- state.json

5.2 加载数据集

# 加载数据集
dataset = load_from_disk('/root/Downloads/datasets/peoples_daily_ner')
print(dataset)

输出结果

Dataset({
    features: ['text', 'label'],
    num_rows: 2
})

三、FAQ

Q:ConnectionError: Couldn't reach

加载(load_dataset)Huggingface/datasets下的数据集遇到网络连接问题解决办法

ConnectionError: Couldn't reach https://raw.githubusercontent.com/huggingface/datasets/2.4.0/datasets/glue/glue.py (ConnectionError(MaxRetryError("HTTPSConnectionPool(host='raw.githubusercontent.com', port=443): Max retries exceeded with url: /huggingface/datasets/2.4.0/datasets/glue/glue.py (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001D31F86E310>: Failed to establish a new connection: [Errno 11004] getaddrinfo failed'))")))
MaxRetryError: HTTPSConnectionPool(host='cdn-lfs.hf-mirror.com', port=443): Max retries exceeded with url: /datasets/glue/2e7538afa2000e63f5343f16a758d75c452661a384208399d2035cd2fce45c33?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27train-00000-of-00001.parquet%3B+filename%3D%22train-00000-of-00001.parquet%22%3B&Expires=1722497068&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMjQ5NzA2OH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9kYXRhc2V0cy9nbHVlLzJlNzUzOGFmYTIwMDBlNjNmNTM0M2YxNmE3NThkNzVjNDUyNjYxYTM4NDIwODM5OWQyMDM1Y2QyZmNlNDVjMzM~cmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=YJ6O6~aOVDbT5hf4b1-ZP-4n1monO755EU9nnA35LSyikLAzMtDRP5ZpfJy1QynV9g3QKmo9ad9KRA9EWGu4qfc-TgYU~B4cctYea~TKfIG7Q7Z1ETL9~eWn~RadiCBcAEeSfdMKW0yvSHuoeyYYdJwk-tuov0PZI4pvX4n8ysnafdfalIjMiWqQSKVuwJ22HAEub6up9IAriUrid3AQDSuz7u49BT0MTYW1y2HdZQHGtIRWxsmjdHlW6Vyrfib-gEvIxI~6zxqkBoXKU3OROOSOnZUfoV0qC2i385q53Y37zZErX2CUDUgSyxa-dG7ctZlZSKzbWuHGHDBzfyStqQ__&Key-Pair-Id=K3ESJI6DHPFC7 (Caused by ProxyError('Cannot connect to proxy.', TimeoutError('_ssl.c:980: The handshake operation timed out')))
ProxyError: (MaxRetryError("HTTPSConnectionPool(host='cdn-lfs.hf-mirror.com', port=443): Max retries exceeded with url: /datasets/glue/2e7538afa2000e63f5343f16a758d75c452661a384208399d2035cd2fce45c33?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27train-00000-of-00001.parquet%3B+filename%3D%22train-00000-of-00001.parquet%22%3B&Expires=1722497068&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMjQ5NzA2OH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9kYXRhc2V0cy9nbHVlLzJlNzUzOGFmYTIwMDBlNjNmNTM0M2YxNmE3NThkNzVjNDUyNjYxYTM4NDIwODM5OWQyMDM1Y2QyZmNlNDVjMzM~cmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=YJ6O6~aOVDbT5hf4b1-ZP-4n1monO755EU9nnA35LSyikLAzMtDRP5ZpfJy1QynV9g3QKmo9ad9KRA9EWGu4qfc-TgYU~B4cctYea~TKfIG7Q7Z1ETL9~eWn~RadiCBcAEeSfdMKW0yvSHuoeyYYdJwk-tuov0PZI4pvX4n8ysnafdfalIjMiWqQSKVuwJ22HAEub6up9IAriUrid3AQDSuz7u49BT0MTYW1y2HdZQHGtIRWxsmjdHlW6Vyrfib-gEvIxI~6zxqkBoXKU3OROOSOnZUfoV0qC2i385q53Y37zZErX2CUDUgSyxa-dG7ctZlZSKzbWuHGHDBzfyStqQ__&Key-Pair-Id=K3ESJI6DHPFC7 (Caused by ProxyError('Cannot connect to proxy.', TimeoutError('_ssl.c:980: The handshake operation timed out')))"), '(Request ID: 17a1f63a-c6f8-4a50-bd28-94480076328a)')
# 错误原因
无法访问外网,导致数据集加载失败

# 解决方法
下载数据集到本地,并加载本地数据集
<think>嗯,用户想了解如何自动化构建高质量的RAG数据集,并且需要具体的流程、工具资源,还有基于API的评估程序。首先,我需要回顾RAG的基本概念,然后考虑数据收集、处理、生成、评估这些步骤。 首先,数据来源。用户可能需要从多种渠道获取数据,比如公开数据集、网页爬取、PDF解析。工具方面,Scrapy和BeautifulSoup适合爬取网页,PyMuPDF处理PDF,还有Unstructured.io的库也不错。另外,像EventKG和UJ这些数据集可能可以作为参考,引用中的信息提到过这些数据集的应用,可能需要结合这些结构化的数据生成文本,比如引用[3]里的方法。 接下来,数据清洗和预处理。需要去重、过滤低质量内容,可能用NLP工具如spaCy进行实体识别和语法检查。结构化处理可能涉及知识图谱构建,比如用Neo4j或者NetworkX,这样能帮助后续生成问答对。 然后,生成问答对。这里可能需要结合大模型,比如GPT-4或Llama 2,用提示工程自动生成问题和答案。用户需要至少1000条数据,所以得确保生成过程的效率和质量。引用[1]提到微调数据集的构建方法,可能涉及多样性和覆盖领域的平衡,需要设计不同的提示模板,覆盖各种类型的问题,比如事实型、推理型等。 评估环节是关键。用户需要基于API的评估程序,可能得用RAGAS这样的工具,它提供了上下文相关性、答案准确性等指标。同时,结合人工审核确保质量。引用[2]提到了Prefect、Weave和RAGAS的应用,可以自动化流程,用Prefect编排任务,Weave做数据处理,RAGAS进行评估。此外,自动数据提取和持续改进也很重要。 工具链整合方面,可能需要用Airflow或Prefect做工作流管理,MLflow跟踪实验,Hugging Face的Datasets库管理数据。API评估部分,可以用FastAPI搭建服务,集成RAGAS的评估逻辑,定期运行测试并生成报告。 用户可能还关心如何保证数据的高质量,比如多样性和准确性,以及评估的自动化程度。需要强调流程中的每个步骤都有对应的工具和检查点,比如在生成问答对时使用多个模型验证,评估时结合自动化和人工审核。另外,引用中的信息提到GraphRAG和本地模型推理,可能涉及到经济高效的方法,比如Ollama这样的工具,适合本地部署,降低成本。 最后,确保整个流程可扩展,能够处理大规模数据,并且评估程序能够通过API方便地集成到现有系统中。可能需要详细说明每个步骤的具体实现,比如如何配置Scrapy爬虫,如何使用PyMuPDF提取文本,以及如何编写提示模板来生成多样的问题。评估API的设计要考虑可扩展性,支持不同的评估指标,并且能够自动化执行测试用例。</think>以下是自动化构建高质量RAG数据集的具体流程与工具方案,结合了最新行业实践和论文方法: ### 一、核心流程框架 $$ \begin{aligned} &\text{数据采集} \rightarrow \text{清洗预处理} \rightarrow \text{知识结构化} \\ &\rightarrow \text{QA生成} \rightarrow \text{质量评估} \rightarrow \text{迭代优化} \end{aligned} $$ ### 二、分阶段实施方法 #### 1. 多源数据采集(工具链) - **网页数据**:使用Scrapy+BeautifulSoup构建定向爬虫,配置自动翻页和动态渲染 ```python class RagSpider(scrapy.Spider): def parse(self, response): yield { "url": response.url, "content": response.css("div.main-content::text").getall() } ``` - **PDF/文档**:PyMuPDF+Unstructured[^1]实现表格/图表识别 - **API接口**:Postman+Apify采集API返回的JSON数据 #### 2. 智能清洗与结构化 - 使用NLP流水线处理: $$ \text{原始文本} \xrightarrow[\text{spaCy}]{\text{NER}} \text{实体关系} \xrightarrow{\text{OpenIE}} \text{三元组} $$ - 知识图谱构建:采用GraphRAG技术[^2]生成领域知识网络 #### 3. 自动化QA生成 - **提示工程模板**(基于LLM): ```markdown [指令]根据下文生成3种类型的问题: 1. 直接事实型问题 2. 多步推理问题 3. 开放讨论问题 [上下文]{{chunk}} ``` - **批量生成工具**: - 使用vLLM加速推理 - 配置HuggingFace的Text Generation Inference API #### 4. 质量评估系统 - **自动化评估API架构**: $$ \begin{cases} \text{上下文相关性} & \text{(RAGAS)} \\ \text{答案准确性} & \text{(BERTScore)} \\ \text{语义连贯性} & \text{(RoBERTa)} \end{cases} \Rightarrow \text{综合评分} $$ - 实现代码框架: ```python def evaluate_qa(context, question, answer): rel_score = ragas_eval(context, question) acc_score = bert_score(answer, gold_standard) return {"score": 0.7*rel_score + 0.3*acc_score} ``` ### 三、关键工具清单 | 类别 | 推荐工具 | 数据量支持 | |------------|-----------------------------------|------------| | 数据采集 | Apify, Scrapy, Unstructured | 10万+ | | 处理 | spaCy, Stanza, NetworkX | 动态扩展 | | QA生成 | GPT-4-Turbo, Claude-3, Mixtral | 1000+/小时 | | 评估 | RAGAS[^2], TruLens, BLEURT | 实时API | ### 四、质量保障机制 1. **多样性控制**:使用MinHash算法确保问题类型分布 $$ sim(A,B) = \frac{|H(A) \cap H(B)|}{|H(A) \cup H(B)|} < 0.7 $$ 2. **持续优化**:通过强化学习动态调整生成策略 3. **人工审核**:构建标注平台(Prodigy/Doccano)设置10%抽样复核 ### 五、扩展建议 - 使用Weave构建数据处理流水线 - 集成MLflow跟踪实验指标 - 采用Active Learning策略提升数据质量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花花少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值