딥러닝 프로젝트를 시작하기 전에 데이터셋을 이해하는 것은 필수적이다.
특히 대규모 텍스트 데이터셋은 그 규모와 복잡성 때문에 체계적인 탐색과 시각화가 필요하다.
이는, cc-100처럼, 너무 큰 규모의 데이터셋은 여는것 조차 불가하기 때문이다.
이번에는 PyTorch와 코드를 활용하여 대규모 텍스트 데이터셋을 로드하고, 탐색하며, 시각화하는 방법을 정리한다.
데이터의 구조를 파악하고 인사이트를 얻는 데 초점을 맞추며, 실무에서 바로 적용할 수 있는 가이드를 제공하고자 한다.
대규모 데이터셋은 효율적인 포맷으로 저장된다.
Parquet 파일은 빠른 읽기와 압축을 지원한다.
import os
import pyarrow.parquet as pq
from tqdm import tqdm
def load_all_parquet_data(folder_path):
data_dict = {}
folders = [f for f in os.listdir(folder_path) if os.path.isdir(os.path.join(folder_path, f))]
for folder in tqdm(folders, desc="폴더 로드 진행"):
folder_full_path = os.path.join(folder_path, folder)
data_dict[folder] = {}
files = [f for f in os.listdir(folder_full_path) if f.endswith('.parquet')]
for file in tqdm(files, desc=f"{folder} 파일 로드", leave=False):
file_path = os.path.join(folder_full_path, file)
data_dict[folder][file] = pq.read_table(file_path).to_pandas()
return data_dict
train_folder_path = './데이터셋/train'
train_data_dict = load_all_parquet_data(train_folder_path)
폴더 구조를 유지하며 데이터를 딕셔너리에 로드한다.
tqdm
으로 진행 상황을 확인하여 대규모 데이터 로드 과정을 모니터링한한다.
데이터셋을 고객 단위로 묶어 탐색 준비를 한다.
def consolidate_customer_data(data_dict):
all_ids = set()
for folder in data_dict:
for file in data_dict[folder]:
if 'ID' in data_dict[folder][file].columns:
all_ids.update(data_dict[folder][file]['ID'].unique())
customer_data = {}
for customer_id in tqdm(all_ids, desc="고객 데이터 통합 진행"):
customer_text = []
for folder in data_dict:
for file in data_dict[folder]:
df = data_dict[folder][file]
if 'ID' in df.columns and customer_id in df['ID'].values:
row = df[df['ID'] == customer_id].iloc[0].drop('ID', errors='ignore')
customer_text.append(f"{folder}/{file}: {' '.join(map(str, row.values))}")
customer_data[customer_id] = " ".join(customer_text) if customer_text else "no_data"
return customer_data
customer_data = consolidate_customer_data(train_data_dict)
고객 ID별로 텍스트를 통합하여 데이터셋의 개별 엔터티를 파악한한다.
탐색을 위해 데이터를 pandas 데이터프레임으로 변환한다.
import pandas as pd
train_df = pd.DataFrame({
'ID': list(customer_data.keys()),
'text': list(customer_data.values())
})
ID와 텍스트를 열로 구성하여 데이터 구조를 한눈에 확인한다.
텍스트 데이터의 길이를 분석하면 데이터셋의 특성을 이해할 수 있다.
train_df['text_length'] = train_df['text'].apply(lambda x: len(x.split()))
print(train_df['text_length'].describe())
describe()
로 평균, 최소, 최대 길이를 확인하여 데이터셋의 분포를 파악한한다.
길이 분포를 시각화하면 직관적인 인사이트를 얻는다.
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.hist(train_df['text_length'], bins=50, color='skyblue', edgecolor='black')
plt.title('텍스트 길이 분포')
plt.xlabel('단어 수')
plt.ylabel('빈도')
plt.grid(True)
plt.show()
히스토그램으로 텍스트 길이의 분포를 시각화하여 이상치나 패턴을 탐지한한다.
텍스트에서 자주 등장하는 단어를 분석한다.
from collections import Counter
all_words = " ".join(train_df['text']).split()
word_counts = Counter(all_words)
top_words = word_counts.most_common(20)
print("상위 20개 단어:", top_words)
Counter
로 상위 20개 단어를 추출하여 데이터셋의 주요 주제를 파악한다.
고빈도 단어를 시각적으로 표현한다.
from wordcloud import WordCloud
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(dict(top_words))
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('상위 단어 워드클라우드')
plt.show()
워드클라우드로 단어 빈도를 시각화하여 데이터셋의 핵심 키워드를 강조한다.
결측값은 데이터 품질에 영향을 미친다.
missing_data = train_df['text'].apply(lambda x: x == "no_data").sum()
print(f"결측 데이터 수: {missing_data}")
"no_data"
로 표시된 결측값의 개수를 확인하여 데이터 완전성을 점검한다.
고객별 데이터 분포를 파악한다.
customer_counts = {folder: sum(len(df) for df in data_dict[folder].values()) for folder in train_data_dict}
print("폴더별 데이터 건수:", customer_counts)
폴더별 데이터 건수를 계산하여 데이터셋의 불균형 여부를 확인한다.
데이터 분포를 시각화한다.
plt.figure(figsize=(12, 6))
plt.bar(customer_counts.keys(), customer_counts.values(), color='lightgreen')
plt.title('폴더별 데이터 건수')
plt.xlabel('폴더')
plt.ylabel('데이터 건수')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()
막대그래프로 폴더별 데이터 건수를 비교하여 데이터셋의 구조를 이해힌다.
실제 데이터를 살펴보면 데이터셋의 내용을 직관적으로 알 수 있다.
for i in range(5):
print(f"샘플 {i+1}: {train_df['text'].iloc[i][:200]}...")
상위 5개 샘플을 출력하여 데이터의 구체적인 내용을 확인한다.
대규모 텍스트 데이터셋을 탐색하고 시각화하는 것은 모델 학습 전 필수 단계이다.
Parquet 파일로 데이터를 로드하고, 고객별로 통합하며, 데이터프레임으로 구조화한다.
텍스트 길이와 고빈도 단어를 분석하고, 히스토그램과 워드클라우드로 시각화하여 데이터셋의 특성을 파악한다.
결측값과 폴더별 분포를 점검하며, 샘플 데이터를 확인하여 데이터의 실체를 이해한다.
이 과정을 통해 데이터셋에 대한 깊은 인사이트를 얻고, 이후 학습 전략을 세우는 데 활용할 수 있다.
아 암튼 알아두면 좋다는 거다.