CoolFace
Modelpublic

maninglearchine/kobert-article-classifier

sourceHugging Facemitupdated 3mo agoView on Hugging Face
0likes29downloads
Model Card

어린이 교육 적합성 경제·금융 기사 분류 모델

maninglearchine/kobert-article-classifier는 한국어 경제·금융 기사를 만 13세 이하 어린이의 학습 목적에 적합한지 자동으로 판별하는 이진 분류 모델입니다.

klue/bert-base를 GPT-4o-mini로 라벨링한 한국어 경제·금융 데이터 5,000건으로 파인튜닝했습니다.


라벨 체계

라벨ID설명예시 키워드
적절1어린이 학습에 적합한 기사저축, 용돈, 물가, 세금, 무역, 협동조합
부적절0어린이에게 부적합한 기사ELS, 레버리지, 공매도, DSR, 파생상품, 강제청산

적절 기준

  • 기초 경제 개념 (저축, 물가, 수요·공급, 세금의 역할 등)
  • 기업 성장 스토리, 창업 이야기
  • 환경경제, 공정무역, 사회적기업
  • 일상 속 경제 원리를 쉽게 설명한 콘텐츠

부적절 기준

  • 파생상품 (ELS, DLS, CFD, 선물·옵션)
  • 레버리지·공매도·마진콜 등 투기성 거래
  • 복잡한 금융 규제 (바젤Ⅲ, IFRS17, DSR 등)
  • 기업 구조조정·부도·법정관리

사용 방법

빠른 시작 (pipeline)

python
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)

python
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 파일)

python
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)

학습 정보

데이터셋

항목내용
원본 데이터한국어 경제·금융 기사 합성 데이터 5,000건
라벨링 방법GPT-4o-mini 자동 라벨링
클래스 분포적절(1): 2,500건 / 부적절(0): 2,500건 (50:50 균형)
학습 샘플균형 샘플링 2,000건 (클래스당 1,000건)
데이터 분할Train 1,600 / Val 200 / Test 200 (8:1:1, stratified)

학습 설정

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별 학습 로그

EpochTrain LossVal LossVal AccuracyVal F1 Macro
10.12410.0004091.00001.0000
20.00890.0002331.00001.0000
30.00040.0002061.00001.0000

성능 평가

Test 셋 결과 (200건)

지표
Accuracy1.0000 (100%)
F1 Macro1.0000
Precision (Macro)1.0000
Recall (Macro)1.0000
F1 (부적절)1.0000
F1 (적절)1.0000

Confusion Matrix

              예측: 부적절   예측: 적절
실제: 부적절      100           0
실제: 적절          0         100

TF-IDF 모델과 비교

모델F1 Macro학습 시간문맥 이해추가 학습
LR + Word TF-IDF1.00000.3초X어려움
LinearSVC + Word1.00000.2초X어려움
RandomForest1.00001.1초X어려움
KoBERT (본 모델)1.00001,598초O파인튜닝 가능
합성 데이터의 어휘 분리가 명확해 모든 모델이 100%를 달성했으나, 실제 뉴스 기사(복합 주제, 문맥 의존 표현)에서는 KoBERT가 훨씬 유리합니다.

한계점 및 주의사항

  • 합성 데이터 학습: 실제 뉴스 기사가 아닌 템플릿 기반 합성 데이터로 학습됐습니다. 실서비스 적용 전 실제 기사 데이터로 추가 파인튜닝을 권장합니다.
  • 최대 길이 64 토큰: 짧은 텍스트에 최적화되어 있습니다. 긴 기사는 제목 + 첫 단락만 입력하세요.
  • 이진 분류만 지원: 적절/부적절 두 클래스만 지원하며, 연령별 세분화 분류는 지원하지 않습니다.

추가 파인튜닝

python
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 — 자유롭게 사용, 수정, 배포 가능합니다.