آموزش پردازش زبان طبیعی با اکوسیستم هاگینگ فیس؛ بارگذاری دیتاستها (قسمت اول فصل پنجم)
اگر دیتاستتان در Hub نباشد، چه رویکردی در پیش میگیرید؟ میدانید که برای دانلود دیتاستها چگونه از Hugging Face Hub استفاده کنید. اما اغلب با دادههایی سر و کار دارید که یا در لپتاپتان یا در سرور از راه دوری ذخیره شدهاند. در بخش حاضر، نحوهی استفاده از ? Datasets را به منظور بارگذاری دیتاستهایی که در Hugging Face Hub قرار ندارند، یاد خواهید گرفت.
کار با دیتاستهای محلی و از راه دور
? Datasets اسکریپتهای بارگذاری را به منظور کار با دیتاستهای محلی و از راه دور ارائه میکند. این کتابخانه از فرمتهای داده پرکاربرد پشتیبانی میکند. از جمله این فرمتها میتوان به موارد زیر اشاره کرد:
فرمت داده | اسکریپت بارگذاری | مثال |
CSV & TSV | csv | load_dataset(“csv”, data_files=”my_file.csv”) |
Text files | text | load_dataset(“text”, data_files=”my_file.txt”) |
JSON & JSON Lines | json | load_dataset(“json”, data_files=”my_file.jsonl”) |
Pickled DataFrames | pandas | load_dataset(“pandas”, data_files=”my_dataframe.pkl”) |
همانطور که در جدول مشاهده میکنید، نوع اسکریپت بارگذاری در تابع load_dataset () را باید در هر فرمت داده مشخص کرد. در کنار آن، باید به آرگومان data_files نیز توجه داشت که مسیر منتهی به یک یا چند فایل را نشان میدهد. حال، بیایید کار را با بارگذاری دیتاست از فایلهای محلی آغاز کنیم. سپس، نحوهی پیادهسازی همین رویکرد را با فایلهای از راه دور توضیح خواهیم داد:
بارگذاری دیتاست محلی
در این نمونه، از SQuAD-it dataset استفاده خواهیم کرد که دیتاست بزرگی برای پرسش و پاسخ در زبان ایتالیایی است. فرایند آموزش و test split در گیتهاب قرار گرفته است. بنابراین، میتوان آنها را با دستور سادهی wget دانلود کرد:
!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-train.json.gz !wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-test.json.gz
دو فایل فشرده به نامهای SQuAD_it-train.json.gz و SQuAD_it-test.json.gz دانلود میشود که میتوانیم با فرمان Linux gzip
آن را از حالت فشردگی خارج کنیم:
!gzip -dkv SQuAD_it-*.json.gz
SQuAD_it-test.json.gz: 87.4% -- replaced with SQuAD_it-test.json SQuAD_it-train.json.gz: 82.2% -- replaced with SQuAD_it-train.json
همانطور که ملاحظه میکنید، فایلهای فشرده با SQuAD_it-train.json و جایگزین شدهاند و دادهها با فرمت JSON ذخیره شدهاند. اگر این پرسش برایتان به وجود آمده که چرا کاراکتر a! در دستورهای فوق وجود دارد، باید بدانید که این دستورها در نوتبوک Jupyter به اجرا در میآیند. اگر میخواهید دیتاست موجود در terminal را دانلود و باز کنید، میتوانید پیشوند را حذف کنید. به منظور بارگذاری فایل JSON با تابع load_dataset()، باید دید که با JSON عادی سر و کار دارید یا با JSON Lines. به مانند بسیاری از دیتاستهای پرسش و پاسخ، SQuAD-it از فرمت nested استفاده میکند. همه دادهها در فیلد data ذخیره شدهاند. به تعبیری، میتوان دیتاست را با تصریح آرگومان field بارگذاری کرد. جزئیات کار در زیر نشان داده شده است:
from datasets import load_dataset squad_it_dataset = load_dataset("json", data_files="SQuAD_it-train.json", field="data")
طبق پیشفرض، بارگذاری فایلهای محلی منجر به ایجاد شیء DatasetDict با اسپلیت train میشود. این کار با بازبینی شیء squad_it_dataset انجام میشود:
squad_it_dataset
DatasetDict({ train: Dataset({ features: ['title', 'paragraphs'], num_rows: 442 }) })
بنابراین، تعداد سطرها و نام ستونهای مرتبط با مجموعه آموزشی را میبینید. با ایندکس کردن در train میتوانید یکی از مثالها را به ترتیب زیر مشاهده کنید:
squad_it_dataset["train"][0]
{ "title": "Terremoto del Sichuan del 2008", "paragraphs": [ { "context": "Il terremoto del Sichuan del 2008 o il terremoto...", "qas": [ { "answers": [{"answer_start": 29, "text": "2008"}], "id": "56cdca7862d2951400fa6826", "question": "In quale anno si è verificato il terremoto nel Sichuan?", }, ... ], }, ... ], }
بسیار خوب! اولین دیتاست محلیمان را بارگذاری کردهایم. علیرغم اینکه این روش در مجموعه آموزشی موثر واقع شد، اما هدف این است که train و test را در شیء DatasetDict بگنجانیم. به این ترتیب، میتوان توابع Dataset.map() را به طور همزمان به کار ببرید. برای انجام این کار، میتوان یک دیکشنری برای آرگومان data_files اضافه کرد. کارکرد آن به شرح زیر میباشد:
data_files = {"train": "SQuAD_it-train.json", "test": "SQuAD_it-test.json"} squad_it_dataset = load_dataset("json", data_files=data_files, field="data") squad_it_dataset
DatasetDict({ train: Dataset({ features: ['title', 'paragraphs'], num_rows: 442 }) test: Dataset({ features: ['title', 'paragraphs'], num_rows: 48 }) })
این همان چیزی است که در نظر داریم. اکنون، امکانِ استفاده از روشهای گوناگونِ پیشپردازش برای پاکسازی دادهها، توکن کردن و غیره وجود دارد. آرگومانdata_files در تابع load dataset() انعطافپذیری بالایی دارد و میتواند یک مسیر فایل، لیستی از مسیرهای فایل یا یک دیکشنری باشد که نامهای split را در مسیرهای فایل نگاشت میکند. بنا به قوانین مورد استفادهیِ Unix shell، میتوانید فایلهایی را که با الگوی تصریح شده همخوانی دارند، کنار هم بگذارید. جزئیات بیشتر در ? Datasets documentation قرار گرفته است.
اسکریپتهای بارگذاری در ? Datasets از تجزیهی خودکارِ فایلهای ورودی پشتیبانی میکنند. بنابراین، میتوان با هدایت مستقیم آرگومان data_files به فایلهای فشرده، از بهکارگیریِ gzip اجتناب کرد:
data_files = {"train": "SQuAD_it-train.json.gz", "test": "SQuAD_it-test.json.gz"} squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
این کار زمانی مفید واقع میشود که نخواهید فایلهای GZIP بسیاری را از حالت فشرده در بیاورید. اگر این عمل به صورت خودکار انجام گیرد، امکان پیادهسازی آن در سایر فرمتهای رایج از قبیل ZIP و TAR نیز وجود دارد. پس باید data_files را در فایلهای فشرده قرار دهید تا روال کار ادامه یابد. حال که با نحوهی بارگذاری فایلهای محلی در لپتاپ یا دسکتاپ آشنا شدهاید، نوبت به بررسی بارگذاری فایلهای ریموت (از راه دور) رسیده است.
بارگذاری دیتاست از راه دور
اگر به عنوان دانشمند داده یا کدنویس در شرکتی کار میکنید، احتمالاً دیتاستی که قصد تحلیل آن را دارید، در سرور از راه دور ذخیره شده است. خوشبختانه، بارگذاری فایلهای از راه دور مثل بارگذاری فایلهای محلی آسان است. به جای تعیین مسیر برای فایلهای محلی، آرگومانdata_files برای یک یا چند URL در نظر گرفته میشود؛ یعنی جایی که فایلهای از راه دور در آن ذخیره شدهاند. برای مثال، در خصوص دیتاست SQuAD-it که در گیتهاب قرار دارد، data_files در اختیار SQuAD_it-*.json.gz URL قرار میگیرد. جزئیات بیشتر در زیر نشان داده شده است:
url = "https://github.com/crux82/squad-it/raw/master/" data_files = { "train": url + "SQuAD_it-train.json.gz", "test": url + "SQuAD_it-test.json.gz", } squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
بنابراین، شیء DatasetDict به دست میآید و دیگر نیاز نیست فایلهایSQuAD_it-*.json.gz را به صورت دستی دانلود کرده و از حالت فشرده خارج کنید. از این رو، لازم نیست راههای گوناگونی را برای بارگذاری دادههایی امتحان کنید که در هاگینگفیس هاب نیستند. حال که به دیتاست مورد نظرتان دست یافتهاید، نوبت به امتحان روشهای مختلف کار با داده رسیده است.
اینک دیتاست دیگری را که در گیتهاب یا UCI Machine Learning Repository قرار دارد انتخاب کنید. میتوانید آن را به صورت دستی یا خودکار با استفاده از روشهای فوق بارگذاری کنید. دیتاستی را بارگذاری کنید که به صورت CSV یا متنی ذخیره شده است.
برای دسترسی به دیگر فصلها و قسمتهای این دوره آموزشی به لینک زیر مراجعه کنید.