Краткое руководство по использованию библиотеки наборов данных Hugging Face!

Наука о данных - это все о данных. В Интернете можно найти различные источники данных для вашего проекта анализа данных или машинного обучения. Одним из самых популярных источников является Kaggle, который, я уверен, каждый из нас, должно быть, использовал в своем путешествии к данным.

Недавно я наткнулся на новый источник данных для моих проектов НЛП, и я хотел бы поговорить об этом. Это библиотека наборов данных Hugging Face, быстрая и эффективная библиотека для простого обмена и загрузки наборов данных и показателей оценки. Итак, если вы работаете с обработкой естественного языка (NLP) и хотите получить данные для своего следующего проекта, не ищите ничего, кроме Hugging Face. 😍

Мотивация: Формат набора данных, предоставляемый Hugging Face, отличается от нашего фрейма данных pandas, поэтому изначально использование набора данных Hugging Face может показаться устрашающим. 😱 Hugging Face - отличный вариант. документация, но это много информации. Я только что написал несколько основных шагов, которые мы выполняем при работе с нашим набором данных. 😄 Статья ни в коем случае не является исчерпывающей, и я настоятельно рекомендую вам ознакомиться с их документацией, если вы хотите сделать больше с вашим набором данных.

Давайте сначала узнаем немного о Hugging Face и библиотеке наборов данных, а затем рассмотрим пример, чтобы узнать, как использовать набор данных из этой библиотеки. 😎

Hugging Face 🤗 - поставщик технологий обработки естественного языка (NLP) с открытым исходным кодом. Вы можете использовать современные модели обнимающего лица (в библиотеке Transformers) для создания и обучения своих собственных моделей. Вы можете использовать библиотеку наборов данных обнимающих лиц для обмена и загрузки наборов данных. Вы даже можете использовать эту библиотеку для оценки показателей.

Библиотека наборов данных

Согласно веб-сайту Hugging Face, библиотека наборов данных в настоящее время насчитывает более 100 общедоступных наборов данных. 😳 Наборы данных не только на английском, но и на других языках и диалектах. 👌 Он поддерживает однострочные загрузчики данных для большинства этих наборов данных, что делает загрузку данных простой задачей. 🏄🏻 Согласно информации, представленной на веб-сайте, помимо легкого доступа к набору данных, библиотека имеет следующие интересные особенности:

  • Преуспевайте на больших наборах данных: наборы данных естественным образом освобождают пользователя от ограничения оперативной памяти, все наборы данных отображаются в памяти с использованием эффективного бэкенда с нулевой сериализацией (Apache Arrow).
  • Умное кеширование: никогда не ждите, пока ваши данные будут обработаны несколько раз.
  • Легкий и быстрый с прозрачным и питоническим API (множественная обработка / кеширование / отображение памяти).
  • Встроенная совместимость с NumPy, pandas, PyTorch, Tensorflow 2 и JAX.

Ух ты! Это довольно много преимуществ. 👏

В этой статье я покажу некоторые шаги, которые мы обычно выполняем в наших задачах анализа данных или анализа, чтобы понять наши данные или преобразовать наши данные в требуемый формат. Итак, давайте быстро погрузимся в эту библиотеку и напишем простой код Python. 🐍 Обратите внимание, что в этой статье рассматриваются только наборы данных, но не показатели.

Версия набора данных: 1.7.0

Установка с помощью pip

!pip install datasets

Импорт

from datasets import list_datasets, load_dataset
from pprint import pprint

Из библиотеки наборов данных мы можем импортировать list_datasets, чтобы увидеть список наборов данных, доступных в этой библиотеке. Модуль pprint предоставляет возможность красивой печати. Подробнее об этом модуле вы можете узнать здесь. 👈🏼

По состоянию на 7 июня 2021 г. в библиотеке наборов данных содержится 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 () выполнил следующие действия:

  1. Загрузил и импортировал в библиотеку скрипт обработки Python SQuAD из репозитория Hugging Face на GitHub или из корзины AWS (если он еще не сохранен в библиотеке).
  2. Запустите сценарий SQuAD, чтобы загрузить набор данных. Обработанный и кэшированный SQuAD в кеш-таблице Arrow.
  3. Вернул набор данных на основе разделения, запрошенного пользователем. По умолчанию он возвращает весь набор данных.

Давайте разберемся с набором данных, который мы получили.

print(squad_dataset)

Набор данных отряда состоит из двух частей - для обучения и проверки. Объект features содержит информацию о столбцах - имя столбца и тип данных. Мы также можем видеть количество строк (num_rows) для каждого разделения. Достаточно информативно!

Мы также можем указать разделение при загрузке набора данных.

squad_train = load_dataset('squad', split='train')
squad_valid = load_dataset('squad', split='validation')

Это сохранит тренировочный набор в squad_train и набор проверки в squad_valid.

Однако вы поймете, что при загрузке нескольких наборов данных возникает ошибка, а при проверке ошибки вы понимаете, что вам нужен второй параметр config.

Вот пример:

amazon_us_reviews = load_dataset('amazon_us_reviews')

Сообщение об ошибке:

Некоторые наборы данных содержат несколько конфигураций, которые определяют часть набора данных, которую необходимо выбрать.

Решение:

amazon_us_reviews = load_dataset('amazon_us_reviews', 'Watches_v1_00')

Это загрузит набор данных amazon_us_reviews с отслеживанием конфигурации.

Итак, если загрузка любого набора данных вызывает ошибку, просто следуйте трассировке, поскольку Hugging Face предоставил полезную информацию об ошибке. 👍

Перейдем к нашему набору данных. 🏃🏻

Мы увидели количество строк в информации о наборе данных. Мы даже можем получить это с помощью нашей стандартной функции len.

print("Length of training set: ", len(squad_train))

Длина обучающего набора: 87599

Проверка набора данных

Чтобы увидеть пример набора данных:

print("First example from the dataset: \n")
pprint(squad_train[0])

Хотите получить фрагменты с несколькими примерами, код такой же, как мы используем с фреймом данных pandas.

print("Two examples from the dataset using slice operation: \n")
pprint(squad_train[14:16])

Хотите увидеть значения в столбце? Проиндексируйте набор данных по имени столбца. Вот фрагмент столбца «вопрос».

print("A column slice from the dataset: \n")
pprint(squad_train['question'][:5])

Вы можете видеть, что часть строк содержит словарь, а часть столбца - список. Метод __getitem__ возвращает другой формат в зависимости от типа запроса. Например, такие элементы, как набор данных [0], вернут словарь элементов, фрагменты, такие как набор данных [2: 5], вернут словарь списка элементов, а столбцы, такие как набор данных ['вопрос'] или фрагмент столбца, вернут список элементов. Сначала это выглядит удивительно, но Hugging Face сделал это, потому что на самом деле его проще использовать для обработки данных, чем возвращать один и тот же формат для каждого из этих представлений.

Посмотрите этот интересный пример:

print(squad_train[‘question’][0])
print(squad_train[0][‘question’])

Выход:

Кому якобы явилась Дева Мария в 1858 году в Лурде, Франция?
Кому якобы явилась Дева Мария в 1858 году в Лурде, Франция?

Оба вернули одинаковый результат. Давайте проверим! 🕵

print(squad_train['question'][0] == squad_train[0]['question'])

Результатом будет True. Отлично! Распространенная ошибка, которую мы делаем при использовании фрейма данных pandas, здесь не является ошибкой.

Примечание. Набор данных поддерживается одной или несколькими типизированными таблицами Apache Arrow, которые обеспечивают быстрое извлечение и доступ. Вы можете загружать наборы данных произвольного размера, не беспокоясь об ограничении ОЗУ, поскольку набор данных не занимает места в ОЗУ и напрямую считывается с диска по мере необходимости.

Давайте подробнее рассмотрим набор данных.

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)

Выход:

Количество строк: 87599
Количество столбцов: 5
Форма: (87599, 5)

Обратите внимание, что вы также можете получить количество строк с помощью функции 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. Мы можем применить эту функцию только к одному примеру или даже к группе примеров или даже создать новые строки или столбцы.

Модифицируя пример на примере:

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])

Выход:

Вы можете использовать карту для множества операций с вашим набором данных. Попробуйте новые вещи, исходя из ваших требований. 🙃

Помимо этого, вы также можете обрабатывать данные партиями.

Примеры отображения, например фрейм данных Pandas

Нам всегда нравится видеть наш набор данных в виде красиво отформатированной таблицы, как будто мы видим фрейм данных pandas. Мы можем преобразовать наш набор данных в тот же формат для отображения.

import random
import pandas as pd
from IPython.display import display, HTML
def 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.

Ссылки:

  1. Для наборов данных: https://huggingface.co/datasets
  2. Для документации по наборам данных: https://huggingface.co/docs/datasets/

Всем спасибо, что прочитали эту статью. Поделитесь своими ценными отзывами или предложениями. Приятного чтения! 📗 🖌