数据科学是关于数据的。网络上有各种来源可以为您的数据分析或机器学习项目获取数据。最受欢迎的来源之一是 Kaggle,我相信我们每个人都必须在我们的数据旅程中使用它。
最近,我遇到了一个新的来源来为我的 NLP 项目获取数据,我很想谈谈它。这是 Hugging Face 的数据集库,一个快速高效的库,可以轻松共享和加载数据集和评估指标。因此,如果您从事自然语言理解 (NLP) 工作并希望为下一个项目提供数据,那么 Hugging Face 就是您的最佳选择。?
本文的动机:Hugging Face 提供的数据集格式与我们的 Pandas dataframe不同,所以最初使用 Hugging Face 数据集可能看起来令人生畏?。但是 Hugging Face 有很好的文档,虽然信息量很大。? 这篇文章绝不是详尽无遗的,如果你想对你的数据集做更多的事情,我强烈建议你查看他们的文档。
让我们先了解一下 Hugging Face 和数据集库,然后通过一个例子来了解如何使用这个库中的数据集。?
Hugging Face ? 是自然语言处理 (NLP) 技术的开源提供商。您可以使用最先进的Hugging Face 模型(在 Transformers 库下)来构建和训练您自己的模型。您可以使用拥抱人脸数据集库来共享和加载数据集。您甚至可以将此库用于评估指标。
根据 Hugging Face 网站,Datasets 库目前拥有 100 多个公共数据集。? 数据集不仅有英语,还有其他语言和方言。? 它支持大多数这些数据集的数据加载器,并且只需一行代码就可以实现,这使得加载数据成为一项轻松的任务。?? 根据网站上提供的信息,除了可以轻松访问数据集之外,该库还有以下有趣的功能:
哇!这是相当多的好处。?
在本文中,我将展示我们通常在数据科学或分析任务中执行的一些步骤,以了解我们的数据或将我们的数据转换为所需的格式。所以,让我们快速深入这个库并编写一些简单的 Python 代码。? 请注意,本文仅涵盖数据集而非指标。
数据集版本:1.7.0
使用pip安装
!pip install datasets
导入包
from datasets import list_datasets, load_dataset
from pprint import pprint
从数据集库中,我们可以导入list_datasets来查看这个库中可用的数据集列表。打印模块提供了“漂亮打印”的功能。
截至2021年6月7日,数据集库有928个数据集。我们可以使用以下代码看到可用的数据集列表:
datasets = list_datasets()
print("Number of datasets in the Datasets library: ", len(datasets), "\n\n")
#list of datasets in pretty-print format
pprint(datasets, compact=True)
如果在下载数据集之前就想知道它的属性,该怎么办呢?我们可以使用一行代码来实现这一点。☝️只需将索引设置为数据集的名称,就可以了!
#dataset attributes
squad = list_datasets(with_details=True)[datasets.index('squad')]
#calling the python dataclass
pprint(squad.__dict__)
squad_dataset = load_dataset('squad')
这句代码下面发生了什么??datasets.load_dataset()执行了以下操作:
让我们理解一下我们得到的数据集。
print(squad_dataset)
数据集分为两部分:训练和验证。feature对象包含关于列的信息——列名和数据类型。我们还可以看到每次拆分的行数(num_rows)。很丰富!
我们也可以在加载数据集时指定分割。
squad_train = load_dataset('squad', split='train')
squad_valid = load_dataset('squad', split='validation')
这会将训练集保存在squad_train中,验证集保存在squad_valid中。
但是,您会意识到加载一些数据集会抛出一个错误,在检查错误时,可能得到需要第二个参数配置的错误。
下面是一个例子:
amazon_us_reviews = load_dataset('amazon_us_reviews')
一些数据集包含几个配置,这些配置定义了需要被选择的数据集的子部分。
解决方案:
amazon_us_reviews = load_dataset('amazon_us_reviews', 'Watches_v1_00')
这将使用配置加载amazon_us_reviews数据集。
让我们来看看我们的数据集。??
我们看到了数据集信息中的行数。我们甚至可以用标准的len函数得到它。
print("Length of training set: ", len(squad_train))
训练集长度:87599
要查看数据集的示例:
print("First example from the dataset: \n")
pprint(squad_train[0])
要获得带有几个示例的切片,代码与我们使用的pandas dataframe相同。
print("Two examples from the dataset using slice operation: \n")
pprint(squad_train[14:16])
想在列中看到值?用列名索引数据集。下面是“question”栏目的一部分。
print("A column slice from the dataset: \n")
pprint(squad_train['question'][:5])
可以看到,行切片给出了一个字典,而列切片给出了一个列表。getitem方法根据查询的类型返回不同的格式。例如,数据集[0]之类的条目将返回一个元素字典,数据集[2:5]之类的切片将返回一个元素列表字典,而数据集[' question ']之类的列或列的slice将返回一个元素列表。这起初看起来很令人惊讶,但hug Face做到了这一点,因为它实际上更容易用于数据处理,而不是为每个视图返回相同的格式。
请看这个有趣的例子:
print(squad_train[‘question’][0])
print(squad_train[0][‘question’])
输出:
To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?
To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?
两者都返回相同的输出。让我们验证!?
print(squad_train['question'][0] == squad_train[0]['question'])
输出为True。好了!我们在使用pandas dataframe时经常犯的一个错误,但是在这里却不是!
注意:数据集由一个或几个Apache Arrow表支持,这些表是类型化的,允许快速检索和访问。您可以加载任意大小的数据集,而不必担心内存限制,因为数据集在RAM中不占用空间,并且在需要时直接从驱动器读取。
让我们进一步检查数据集。
print("Features: ")
pprint(squad_train.features)print("Column names: ", squad_train.column_names)
print("Number of rows: ", squad_train.num_rows)
print("Number of columns: ", squad_train.num_columns)
print("Shape: ", squad_train.shape)
输出:
注意,您也可以使用len函数获得行数。
添加/删除一个新列
添加一个名为“new_column”的列,条目为“foo”。
new_column = ["foo"] * len(squad_train)
squad_train = squad_train.add_column("new_column", new_column)
print(squad_train)
现在让我们删除这一列。
squad_train = squad_train.remove_columns("new_column")
重命名一个列
squad_train = squad_train.rename_column("title", "heading")
print(squad_train)
修改/更新数据集
要修改或更新数据集,可以使用dataset.map。map()是一个强大的方法,灵感来自于tf.data.Dataset map方法。我们可以将这个函数应用于一个例子,甚至一批例子,甚至生成新的行或列。
通过示例修改示例:
updated_squad_train = squad_train.map(lambda example: {'question': 'Question: ' + example['question']})
pprint(updated_squad_train['question'][:5])
输出
让我们使用现有列添加新列并删除旧列。
updated_squad_train = squad_train.map(lambda example: {'new_heading': "Context: " + example['heading']}, remove_columns=['heading'])
pprint(updated_squad_train.column_names)
pprint(updated_squad_train['new_heading'][:5])
输出
列 " new_heading "已经使用列 " heading "的内容进行了填充,列" heading "已经从数据集中移除
您可以使用映射对数据集执行多个操作。根据你的需求尝试新事物。?
除此之外,您还可以批量处理数据。
我们总是希望我们的数据集是一个格式良好的表格,就像我们看到一个pandas dataframe一样。我们可以将数据集转换为相同的格式。
import random
import pandas as pd
from IPython.display import display, HTMLdef display_random_examples(dataset=squad_train, num_examples=5):
assert num_examples < len(dataset)
random_picks = []
for i in range(num_examples):
random_pick = random.randint(0,len(dataset)-1)
random_picks.append(random_pick)
df = pd.DataFrame(dataset[random_picks])
display(HTML(df.to_html()))
display_random_examples(squad_train, 3)
输出是一个格式很好的表格。?
这就是本文的全部内容。从这里开始,您可以根据项目需求对数据进行预处理,并构建模型或创建良好的可视化效果。不可能在一篇文章中涵盖所有内容。然而,通过阅读本文,您可以了解如何使用数据集库中的可用方法。如果需要对数据集做更多操作,请查看文档。还有很多很多的方法,比如排序,洗牌,分片,选择,过滤,连接数据集等等。您还可以为PyTorch、Tensorflow、Numpy和Pandas格式化数据集。
如果你想看代码,请参考这个链接到我的Github : https://github.com/chetnakhanna16/huggingface_datasets/blob/main/HuggingFace_Datatsets_Library_TDS.ipynb
作者:Chetna Khanna
原文地址:https://towardsdatascience.com/use-the-datasets-library-of-hugging-face-in-your-next-nlp-project-94e300cca850
deephub翻译组
本文分享自 DeepHub IMBA 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!