HuggingFace dataset 사용하기

안녕하세요, 9기 HuggingFace 파트너 정정민입니다.


이번 포스팅에서는 HuggingFace의 데이터를 다뤄보려고 합니다.

HuggingFace는 연구 결과물 이외에

사용자들의 데이터를 업로드 할 수 있는 기능을 제공합니다.

물론 업로드 된 데이터를 다운로드해서 쉽게 사용할 수 있죠.


모든 데이터를 다~ 다룰수는 없지만

일반적으로 많이 사용하는

  • 이미지

  • 텍스트

데이터를 다운로드 받아 사용해 보죠!



HuggingFace datasets

Models 페이지와 마찬가지로 Datasets 라는 페이지가 존재합니다 (링크)

그리고 Models 페이지와 마찬가지로

데이터 종류와 타겟 문제 종류에 따라 데이터를 분류 및 제공하고 있습니다.

또한, 이름을 바탕으로 찾기도 가능합니다.


만약 한글을 다루는 데이터를 찾고 싶다면 검색에 Korean과 같은 검색어를 넣으면 되겠죠?

항공 이미지가 필요하다면 aerial과 같은 검색어를 사용하면 됩니다.


특별히 목표하는 데이터가 없다면

브라우징으로 어떤 데이터가 존재하는지 확인해볼 수도 있겠네요!



이미지 데이터

이미지 데이터를 확인하기 위해 설정한 참고 데이터는 rajistics/indian_food_images 데이터 입니다 (링크)


데이터 페이지에서는,

어떤 데이터를 제공하는지 미리 볼 수 있는 공간이 존재합니다.


선택한 인도 음식 페이지를 살펴보면 어떤 이미지 데이터가 있고,

그것이 어떻게 정답(label)이 작성되어 있는지를 보여주네요.

그 외에도 작성자가 작성한 데이터 설명, 전체 갯수, 파일의 크기 등이 표시됩니다.



이제 코드 단위로 살펴보죠.

사용법은 매우 쉽습니다.


먼저, HuggingFace에서 제공하는 datasets 패키지를 다운로드 합니다.

pip install datasets


그리고 load_dataset 이라는 함수를 활용해 원하는 데이터셋의 이름을 복사 / 붙여넣기 해줍니다.

그러면 자동으로 web 상의 데이터를 다운로드 합니다.

from datasets import load_dataset
img_data = load_dataset("rajistics/indian_food_images")

Downloading readme: 100%|██████████| 660/660 [00:00<00:00, 1.27MB/s]
Downloading metadata: 100%|██████████| 1.20k/1.20k [00:00<00:00, 4.20MB/s]
Downloading data: 100%|██████████| 1.36G/1.36G [09:50<00:00, 2.30MB/s]
Downloading data: 100%|██████████| 241M/241M [01:47<00:00, 2.24MB/s] 
Generating train split: 100%|██████████| 5328/5328 [00:01<00:00, 2690.51 examples/s]
Generating test split: 100%|██████████| 941/941 [00:00<00:00, 5408.05 examples/s]


위 과정을 거치면 ~/.cache/huggingface/datasets 폴더 내부에 저장이 됩니다.


저장 위치를 바꾸고 싶다면 load_dataset 함수에 cache_dir 값을 원하는 위치로 적어주면 됩니다.

img_data = load_dataset("rajistics/indian_food_images", 
                        cache_dir='원하는 저장 위치 경로')


불러온 데이터를 살펴보면

데이터를 업로드 한 작성자가 구분한 기준에 맞춰 데이터를 접근할 수 있습니다.

print(img_data)

>> DatasetDict({
    train: Dataset({
        features: ['image', 'label'],
        num_rows: 5328
    })
    test: Dataset({
        features: ['image', 'label'],
        num_rows: 941
    })
})


Dict라는 용어가 보이네요.

저 데이터도 key, value의 형태로 접근 가능합니다.

print(img_data['train'])

>> Dataset({
    features: ['image', 'label'],
    num_rows: 5328
})


그리고, 적혀있는 features 이름에 맞춰 데이터에 접근 가능합니다.

train_img_data = img_data['train']['image']
print(type(train_img_data)) # <class 'list'>
print(type(train_img_data[0])) # PIL.JpegImagePlugin.JpegImageFile
train_img_data[100].show()


print(img_data['train']['label'][:5]) # [6, 3, 11, 16, 1]
print(img_data['train']['label'][100]) # 1 
print(img_data['train'].features)
# {'image': Image(decode=True, id=None), 
#  'label': ClassLabel(names=['burger', 'butter_naan', 'chai', 'chapati', 'chole_bhature', 'dal_makhani', 'dhokla', 'fried_rice', 'idli', 'jalebi', 'kaathi_rolls', 'kadai_paneer', 'kulfi', 'masala_dosa', 'momos', 'paani_puri', 'pakode', 'pav_bhaji', 'pizza', 'samosa'], id=None)}

위 이미지가 1이라는 label을 갖고 있고 features의 값을 활용해

1이 의미하는 바가 ‘butter_naan’ 이라는 것을 확인할 수 있었습니다!


다운로드 된 데이터 이야기를 하면,

데이터는 arrow 라는 확장자의 형태로 저장이 됩니다.


이는 huggingface에서 선택한 데이터 압축 포멧입니다. (링크)

column을 기반으로 table의 형태로 데이터를 저장, 관리하는데 특화된 형태인데,

데이터 그 자체로 열어서 내부를 확인하기가 어려운 단점이 있습니다.

예를 들어, 이미지의 경우 png, jpg 와 같은 형태라면 더블 클릭으로 열어서 보고 닫을 수 있는데

arrow는 그게 안되는거죠 ㅠㅠ

그래서 필요하다면 dataset으로 load하고 컨트롤하기 좋은 형태로 저장하는게 추가 작업으로 필요할 수 있어 보입니다!



텍스트 데이터

다음으로 다뤄볼 텍스트 데이터는 yelp_review_full 입니다 (링크)

특정 사용자가 올린 데이터는 아니고,

huggingface 내에서 직접적으로 제공하는 데이터라 사용자 이름이 없는게 특징이네요.



yelp라는 음식점 리뷰 사이트의 리뷰 내용과 별점을 크롤링해 만든 데이터입니다.


text_data = load_dataset("yelp_review_full")

Downloading readme: 100%|██████████| 6.72k/6.72k [00:00<00:00, 12.5MB/s]
Downloading data: 100%|██████████| 299M/299M [02:40<00:00, 1.87MB/s] 
Downloading data: 100%|██████████| 23.5M/23.5M [00:08<00:00, 2.67MB/s]
Generating train split: 100%|██████████| 650000/650000 [00:01<00:00, 615037.63 examples/s]
Generating test split: 100%|██████████| 50000/50000 [00:00<00:00, 917465.58 examples/s]


이미지 데이터와 다루는 데이터의 차이만 있을 뿐

사용하는 방법은 동일합니다.

print(text_data)

>> DatasetDict({
    train: Dataset({
        features: ['label', 'text'],
        num_rows: 650000
    })
    test: Dataset({
        features: ['label', 'text'],
        num_rows: 50000
    })
})
text_data['train']

>> Dataset({
    features: ['label', 'text'],
    num_rows: 650000
})
text_data['train']['text'][0]
# "dr. goldberg offers everything i look for in a general practitioner.  he's nice and easy to talk to without being patronizing; he's always on time in seeing his patients; he's affiliated with a top-notch hospital (nyu) which my parents have explained to me is very important in case something happens and you need surgery; and you can get referrals to see specialists without having to see him first.  really, what more do you need?  i'm sitting here trying to think of any complaints i have about him, but i'm really drawing a blank."

text_data['train']['label'][0]
# 4



Datasets 페이지에서 매력적인 데이터를 찾아보세요~!!

Datasets는 매우 강력한 HuggingFace의 특징 중 하나입니다.

공통된 인터페이스(load_dataset)로 쉽게 다운로드 가능하다는 점이 참 매력적이죠.


연구 혹은 서비스적인 차원에서 필요한 자원이 있을 수 있습니다.

(참고로, 라이센스 이슈가 있을 수 있습니다.

필요시 데이터 설명 페이지 하단의 데이터 마다의 라이센스 정보를 확인해보세요!)


코드 레벨로 살펴보지 않아도

웹 페이지에 들어가셔서 한번 스윽 확인해보면 좋겠습니다 ^^


#9기HuggingFace


작성자 : 정정민

블로그 : 링크

7
3개의 답글

👉 이 게시글도 읽어보세요