어렵다 어려워
학습시간 09:00~03:00(당일19H/누적1333H)
목표
데이터
가이드라인

이번에 받은 데이터는 train, valid로 이루어진 3쌍의 JSON 파일이다.

지난 미션 때보다 파일 용량이 더 크다. 어쩌면 전처리에 5시간을 부어야할지도 모른다는 뜻이다...
그렇다면 가장 용량이 적은 law 파일만 가지고 진행해 보아야겠다. 원하는 문서 종류를 선택할 수 있다고 했으니까! 법률 데이터를 학습한 자연어 모델이 궁금하기도 하고.
if 'google.cloud' in sys.modules:
from google.colab import drive; drive.mount('/content/drive')
import drive.MyDrive.develop.projects.autoconfig as config
config.directory('text-summarization')
개발환경 및 경로설정을 먼저 했다.
train_dir = "data/train_original_law.json"
valid_dir = "data/valid_original_law.json"
def load_json(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)['documents']
return data
load_json(train_dir)[0]
파일 내부가 어떤 식으로 되어 있는지 먼저 확인해 보자.

확실히 법률 관련 용어가 많이 들어가 있다. 한국어인데 이해가 안 되네 ㅋㅋㅋㅋ
근데 평소 보던 데이터와 다르게 text 데이터가 많다. 이걸로 문서 요약을 어떻게 한다는 거지...? index 노드와 abstractive 노드의 상관관계를 학습시키는 건가...?
일단,, 어쩐 것을 위주로 살펴보면 좋을까?
category, size, char_count 이건 기본적으로 확인해야 할 것 같고,,,
document_quality_scores, accurate, informative, trustworthy, extractive 까지 살펴보면 좋을 것 같다!
print(f"데이터 수: Train {len(train_json)}, Valid {len(valid_json)}")
데이터 수: Train 24329, Valid 3004 가 나왔다. 7:3 비율 정도 되는 듯?
print("")
print("카테고리별 문서 수")
print(df['category'].value_counts())
plt.figure(figsize=(10, 6))
sns.countplot(x=df['category'], order=df['category'].value_counts().index)
plt.title('카테고리별 문서 수')
plt.show()


카테고리는 민사관련 법이 가장 많다.
print("크기별 문서 수")
print(df['size'].value_counts())
plt.figure(figsize=(10, 6))
sns.countplot(x=df['size'], order=df['size'].value_counts().index)
plt.title('문서 크기 분류별 개수')
plt.show()


size가 small로 분류된 데이터가 가장 많다. 좋다고 해야할지...?
print("글자 수")
print(df['char_count'].describe())
plt.figure(figsize=(10, 6))
sns.histplot(df['char_count'], bins=50)
plt.title('문서 글자 수 분포')
plt.show()


평균 675자다. small의 기준이 500자 정도인 것 같다.
print("발행 연도 분석")
df['publish_date'] = pd.to_datetime(df['publish_date'], format='%Y%m%d', errors='coerce')
df['publish_year'] = df['publish_date'].dt.year
plt.figure(figsize=(12, 6))
sns.histplot(df['publish_year'].dropna(), bins=50)
plt.title('문서 발행 연도 분포')
plt.show()

이건 재미로 확인해 봤다.
근데 생각해 보니까 법률이라서 오히려 연도가 굉장히 중요하지 않나 싶다. 시대가 흐르면서 법이 바뀌기도 하니까... 법을 모르니까 데이터를 판단할 수가 없네.
print("문서 품질 점수 분포")
quality_cols = ['readable', 'accurate', 'informative', 'trustworthy']
plt.figure(figsize=(16, 4))
for i, col in enumerate(quality_cols, 1):
plt.subplot(1, 4, i)
sns.countplot(x=df[col])
plt.title(f'{col} 점수 분포')
plt.tight_layout()
plt.show()

가독성, 정확성, 정보성, 신뢰성에 대한 점수다. 은근히 1~2점인 데이터가 있다.
일반적인 머신러닝이면 이상치로 생각하고 제거했을 것 같은데,, 자연어 학습이라 살려둬야 하는 건지 잘 모르겠다. 안 좋은 데이터가 뭔지도 함께 학습시키면 기준을 잡아줄 수 있는 거려나..!?
일단 포함해서 학습해 봐야지..
허깅페이스에서 트랜스포머를 사용하라고 하는데 무슨 말인지 모르겠다...
허깅페이스가 뭔지부터 공부해 보자...!
A. 정의
B. 비전과 미션
C. 이름의 유래
A. 주요 기능
AutoTokenizer, AutoModel, 등): 모델 아키텍처를 몰라도 체크포인트 이름만으로 적절한 토크나이저와 모델 클래스를 자동으로 로드하는 스마트 기능B. 지원 아키텍처
BERT, GPT, T5, BART 등 수백 가지 트랜스포머 기반 모델ViT(Vision Transformer), DETR, CLIP, Stable DiffusionWhisper, Wav2Vec2, HuBERT(pipeline을 이용한 제로샷 분류 코드 예시)
from transformers import pipeline
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
sequence_to_classify = "이 옷은 내 스타일이 아니야"
candidate_labels = ['패션', '음식', '정치', '스포츠']
result = classifier(sequence_to_classify, candidate_labels)
A. 핵심 특징
B. 주요 기능
load_dataset 함수 하나로 허브에 있는 수만 개의 데이터셋은 물론, 로컬 파일(CSV, JSON, 텍스트 등)까지 동일한 방식으로 로드map, filter, shuffle 등 직관적인 함수를 통해 대규모 데이터셋을 병렬로 빠르게 전처리(데이터셋 로드 및 전처리 코드 예시)
from datasets import load_dataset
# SQuAD 데이터셋 로드 (스트리밍 모드)
squad_dataset = load_dataset("squad", split="train", streaming=True)
# 데이터셋의 첫 5개 샘플 확인
for i, example in enumerate(squad_dataset):
if i == 5:
break
A. 역할과 중요성
B. 주요 알고리즘
(AutoTokenizer 코드 예시)
from transformers import AutoTokenizer
# 한국어 BERT 모델의 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained("klue/bert-base")
# 텍스트 토큰화
text = "허깅페이스는 정말 강력한 도구입니다."
encoded_input = tokenizer(text)
# 원래 텍스트로 디코딩
decoded_text = tokenizer.decode(encoded_input["input_ids"])
A. 목적
B. 사용법
Accelerator 객체를 생성하고, 학습 루프 시작 전에 모델, 옵티마이저, 데이터 로더를 accelerator.prepare() 메서드로 감싸기loss.backward() 대신 accelerator.backward(loss)를 사용(Accelerate 코드 예시)
from accelerate import Accelerator
import torch
# 가상의 모델과 데이터로더
model = torch.nn.Linear(10, 2)
optimizer = torch.optim.Adam(model.parameters())
dataloader = [torch.randn(8, 10) for _ in range(10)]
# Accelerator 초기화 및 준비
accelerator = Accelerator()
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
# 학습 루프 (기존 코드와 거의 동일)
for batch in dataloader:
optimizer.zero_grad()
output = model(batch)
loss = output.sum()
accelerator.backward(loss)
optimizer.step()
A. 모델 검색 및 필터링
Text Classification, Image-to-Text, Text-to-Speech 등 20가지가 넘는 세부 태스크로 원하는 기능의 모델을 정확히 필터링PyTorch, TensorFlow, JAX, Safetensors 등 특정 프레임워크나 모델 형식으로 검색B. 모델 카드 (Model Card)
pipeline 이나 AutoClass를 이용한 구체적인 코드 예시 제공| 활용 수준 | 활동 내용 |
|---|---|
| 초급 | 관심 있는 태스크의 모델을 검색하고, 온라인 추론 API로 성능 테스트 |
| 중급 | pipeline으로 모델을 불러와 사용하고, 모델 카드를 읽으며 모델의 특징 파악 |
| 고급 | 자신의 목적에 맞게 모델을 파인튜닝하고, 결과를 커뮤니티에 다시 공유 |