maninglearchine/kobert-article-classifier
029
어린이 교육 적합성 경제·금융 기사 분류 모델
maninglearchine/kobert-article-classifier는 한국어 경제·금융 기사를 만 13세 이하 어린이의 학습 목적에 적합한지 자동으로 판별하는 이진 분류 모델입니다.
klue/bert-base를 GPT-4o-mini로 라벨링한 한국어 경제·금융 데이터 5,000건으로 파인튜닝했습니다.
라벨 체계
적절 기준
- 기초 경제 개념 (저축, 물가, 수요·공급, 세금의 역할 등)
- 기업 성장 스토리, 창업 이야기
- 환경경제, 공정무역, 사회적기업
- 일상 속 경제 원리를 쉽게 설명한 콘텐츠
부적절 기준
- 파생상품 (ELS, DLS, CFD, 선물·옵션)
- 레버리지·공매도·마진콜 등 투기성 거래
- 복잡한 금융 규제 (바젤Ⅲ, IFRS17, DSR 등)
- 기업 구조조정·부도·법정관리
사용 방법
빠른 시작 (pipeline)
from transformers import pipeline
clf = pipeline(
"text-classification",
model="maninglearchine/kobert-article-classifier",
)
samples = [
"용돈으로 배우는 저축의 첫걸음…어린이 경제교실 현장",
"ELS 녹인 구간 진입…레버리지 투자자 강제청산 속출",
]
for text in samples:
result = clf(text)
print(f"{result[0]['label']} ({result[0]['score']:.3f}) | {text[:30]}")
# 출력 예시:
# 적절 (0.999) | 용돈으로 배우는 저축의 첫걸음…어린이
# 부적절 (0.998) | ELS 녹인 구간 진입…레버리지 투자자상세 제어 (AutoModel)
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_id = "maninglearchine/kobert-article-classifier"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id)
model.eval()
def classify(text: str, max_length: int = 64) -> dict:
inputs = tokenizer(
text,
return_tensors="pt",
truncation=True,
padding="max_length",
max_length=max_length,
)
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.softmax(logits, dim=-1)[0]
label = model.config.id2label[logits.argmax(-1).item()]
return {
"label": label,
"score": probs.max().item(),
"부적절_prob": probs[0].item(),
"적절_prob": probs[1].item(),
}
texts = [
"세금은 왜 내야 할까?…학교·도로·소방서가 만들어지는 비밀",
"공매도 잔고 급증…타깃 종목 변동성 심화로 반대매매 위험 고조",
"수요와 공급이란 무엇인가?…시장 가격이 결정되는 원리",
"바젤Ⅲ 자본규제 강화…은행권 수조원 추가 적립 부담",
]
for text in texts:
r = classify(text)
print(f"[{r['label']}] 확률={r['score']:.3f} | {text[:35]}")배치 처리 (Excel 파일)
from transformers import pipeline
import pandas as pd
clf = pipeline(
"text-classification",
model="maninglearchine/kobert-article-classifier",
batch_size=32,
device=-1, # CPU 사용. GPU: device=0
)
df = pd.read_excel("articles.xlsx")
results = clf(df["기사본문"].tolist())
df["label"] = [r["label"] for r in results]
df["confidence"] = [r["score"] for r in results]
df.to_excel("classified_articles.xlsx", index=False)학습 정보
데이터셋
학습 설정
Base Model : klue/bert-base
Max Length : 64 tokens
Batch Size : 32
Epochs : 3
LR : 3e-5
Warmup : 10% (warmup_ratio=0.1)
Weight Decay : 0.01
Optimizer : AdamW
Eval Strategy: epoch (best model by F1 Macro)
Device : CPU
학습 시간 : 약 26.6분 (1,598초)Epoch별 학습 로그
성능 평가
Test 셋 결과 (200건)
Confusion Matrix
예측: 부적절 예측: 적절
실제: 부적절 100 0
실제: 적절 0 100TF-IDF 모델과 비교
합성 데이터의 어휘 분리가 명확해 모든 모델이 100%를 달성했으나, 실제 뉴스 기사(복합 주제, 문맥 의존 표현)에서는 KoBERT가 훨씬 유리합니다.
한계점 및 주의사항
- 합성 데이터 학습: 실제 뉴스 기사가 아닌 템플릿 기반 합성 데이터로 학습됐습니다. 실서비스 적용 전 실제 기사 데이터로 추가 파인튜닝을 권장합니다.
- 최대 길이 64 토큰: 짧은 텍스트에 최적화되어 있습니다. 긴 기사는 제목 + 첫 단락만 입력하세요.
- 이진 분류만 지원: 적절/부적절 두 클래스만 지원하며, 연령별 세분화 분류는 지원하지 않습니다.
추가 파인튜닝
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers import Trainer, TrainingArguments
model_id = "maninglearchine/kobert-article-classifier"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSequenceClassification.from_pretrained(model_id)
training_args = TrainingArguments(
output_dir="./finetuned",
num_train_epochs=2,
per_device_train_batch_size=16,
learning_rate=1e-5, # 낮은 LR으로 점진적 파인튜닝
eval_strategy="epoch",
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=your_train_dataset,
eval_dataset=your_eval_dataset,
)
trainer.train()
model.push_to_hub("maninglearchine/kobert-article-classifier-v2")라이선스
MIT License — 자유롭게 사용, 수정, 배포 가능합니다.
