kcELECTRA-absa-none / README.md
jxchlee's picture
Update README.md
b20c345 verified
metadata
library_name: transformers
language:
  - ko
license: mit
base_model: beomi/KcELECTRA-base
tags:
  - absa
  - sentiment-analysis
  - aspect-based-sentiment-analysis
  - generated_from_trainer
metrics:
  - accuracy
  - f1
model-index:
  - name: kcELECTRA-absa-none
    results: []

kcELECTRA-absa-none

kcELECTRA-absa-none์€
beomi/KcELECTRA-base๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ
AI Hub ์†์„ฑ๊ธฐ๋ฐ˜ ๊ฐ์ •๋ถ„์„ ๋ฐ์ดํ„ฐ์„ ํ™œ์šฉํ•ด ํ•™์Šต๋œ
Aspect-Based Sentiment Analysis (ABSA) ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

์ด ๋ชจ๋ธ์€ ์ „์ž๊ธฐ๊ธฐ ๋ฆฌ๋ทฐ ๋ฌธ์žฅ์—์„œ ํŠน์ • aspect(์†์„ฑ)์— ๋Œ€ํ•œ ๊ฐ์ •(๊ธ์ •, ๋ถ€์ •, ์ค‘๋ฆฝ/๋ฏธ์–ธ๊ธ‰)์„ ๋ถ„์„ํ•˜๋„๋ก ํ•™์Šต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿงฉ Model description

๐Ÿง  ํ•™์Šต ๋ชฉ์ 

์†Œ๋น„์ž ๋ฆฌ๋ทฐ์—๋Š” ๋‹ค์–‘ํ•œ ์ œํ’ˆ ์†์„ฑ(aspect)์ด ๋“ฑ์žฅํ•˜๋ฉฐ, ๋ฌธ์žฅ ์ „์ฒด์˜ ๊ธ๋ถ€์ •๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํžˆ ์„ธ๋ฐ€ํ•œ ๋ถ„์„์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์žฅ์„ ๋ด…์‹œ๋‹ค.

โ€œํ™”๋ฉด์€ ์ •๋ง ์„ ๋ช…ํ•˜๊ณ  ๋ฐฐํ„ฐ๋ฆฌ๋Š” ์˜ค๋ž˜๊ฐ€์ง€๋งŒ, ๋ฐœ์—ด์ด ์กฐ๊ธˆ ์žˆ์–ด์š”.โ€

  • ํ™”๋ฉด: ๊ธ์ •
  • ๋ฐฐํ„ฐ๋ฆฌ: ๊ธ์ •
  • ๋ฐœ์—ด: ๋ถ€์ •

์ด ๋ชจ๋ธ์€ ์ด๋Ÿฐ ์„ธ๋ถ€ ๊ฐ์ •์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ Aspect ๊ธฐ๋ฐ˜ ๊ฐ์„ฑ๋ถ„์„(ABSA) ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
๊ฐ ๋ฆฌ๋ทฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์ „์— ์ •์˜๋œ ์ „์ž๊ธฐ๊ธฐ ๊ด€๋ จ aspect ๋ชฉ๋ก์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ์ •์„ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.


โš™๏ธ Intended uses & limitations

โœ… Intended uses

  • ์ „์ž๊ธฐ๊ธฐ ๊ด€๋ จ ๋ฆฌ๋ทฐ์˜ aspect-level ๊ฐ์„ฑ๋ถ„์„
  • ์ œํ’ˆ ์†์„ฑ๋ณ„ ๋งŒ์กฑ๋„ ๋ถ„์„ ๋ฐ ์ธ์‚ฌ์ดํŠธ ์ถ”์ถœ
  • ๋ฆฌ๋ทฐ ์š”์•ฝ, ๋ธŒ๋žœ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง, AI ๊ณ ๊ฐ ์‘๋Œ€ ์‹œ์Šคํ…œ ๋“ฑ๊ณผ์˜ ๊ฒฐํ•ฉ

โš ๏ธ Limitations

  • AI Hub ์ „์ž๊ธฐ๊ธฐ ๋ถ„์•ผ ๋ฐ์ดํ„ฐ์— ๋งž์ถฐ ํ•™์Šต๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—,
    ๋‹ค๋ฅธ ๋„๋ฉ”์ธ(์˜ˆ: ์Œ์‹, ์—ฌํ–‰ ๋“ฑ)์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงพ Training and evaluation data

๐Ÿ“Š ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜

AI Hub: โ€œ์†์„ฑ๊ธฐ๋ฐ˜ ๊ฐ์ •๋ถ„์„ ๋ฐ์ดํ„ฐโ€
(https://aihub.or.kr/aihubdata/data/view.do?dataSetSn=71603)

๐Ÿ“ ํ•™์Šต ๋„๋ฉ”์ธ

์ „์ž๊ธฐ๊ธฐ ๋ถ„์•ผ ์„ธ๋ถ€ ์นดํ…Œ๊ณ ๋ฆฌ:

  • ๊ณ„์ ˆ๊ฐ€์ „
  • ์ปดํ“จํ„ฐ์ฃผ๋ณ€๊ธฐ๊ธฐ
  • ํœด๋Œ€ํฐ์ฃผ๋ณ€๊ธฐ๊ธฐ
  • ์ž๋™์ฐจ๊ธฐ๊ธฐ
  • ๊ฐ€์ „
  • IT๊ธฐ๊ธฐ
  • ์˜์ƒ์Œํ–ฅ๊ฐ€์ „
  • ์ƒํ™œ๋ฏธ์šฉ์š•์‹ค๊ฐ€์ „
  • ์ฃผ๋ฐฉ๊ฐ€์ „
  • ์นด๋ฉ”๋ผยท๊ฒŒ์ž„๊ธฐยทํƒœ๋ธ”๋ฆฟ

๐Ÿงฉ ์‚ฌ์šฉ๋œ ์ฃผ์š” Aspect ๋ชฉ๋ก

์ œํ’ˆ ์ „๋ฐ˜: ํ’ˆ์งˆ, ๋””์ž์ธ, ๊ฐ€๊ฒฉ, ์„ฑ๋Šฅ
์‚ฌ์šฉ์„ฑ: ์กฐ์ž‘์„ฑ, ํœด๋Œ€์„ฑ, ๋ฌด๊ฒŒ, ์†Œ์Œ
๊ธฐ๋Šฅ: ํ™”๋ฉด, ๋ฐฐํ„ฐ๋ฆฌ, ๋ฐœ์—ด, ์ถฉ์ „, ์—ฐ๊ฒฐ์„ฑ
๊ธฐํƒ€: ๋‚ด๊ตฌ์„ฑ, ๊ตฌ์„ฑํ’ˆ, ๋ฐฐ์†ก, ํฌ์žฅ ๋“ฑ


๐Ÿงฎ Training procedure

๐Ÿ”ง Hyperparameters

learning_rate: 3e-5
train_batch_size: 16
eval_batch_size: 16
seed: 42
optimizer: AdamW (betas=(0.9, 0.999), eps=1e-8)
lr_scheduler_type: linear
num_epochs: 3


๐Ÿง  Training results

Training Loss Epoch Step Validation Loss Accuracy F1
0.2011 1.0 5008 0.2402 0.5967 0.3407
0.1394 2.0 10016 0.1429 0.7954 0.4230
0.1408 3.0 15024 0.1459 0.8261 0.4985

๐Ÿงฐ Framework versions

Transformers 4.57.1
PyTorch 2.8.0+cu126
Datasets 4.0.0
Tokenizers 0.22.1


๐Ÿ’ก Example usage

1. pipeline ์‚ฌ์šฉ ๋ฒ„์ „

from transformers import pipeline

# 1. ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
checkpoint = "jxchlee/kcELECTRA-absa-none"
absa_pipeline = pipeline(
    task="text-classification",
    model=checkpoint,
    tokenizer=checkpoint,
    return_all_scores=True
)


# 2. ๋ถ„์„ ๋Œ€์ƒ ๋ฆฌ๋ทฐ
review = "ํ™”๋ฉด์€ ์„ ๋ช…ํ•˜๊ณ  ๋ฐฐํ„ฐ๋ฆฌ๋„ ์˜ค๋ž˜๊ฐ€์ง€๋งŒ ๋ฐœ์—ด์ด ์กฐ๊ธˆ ์žˆ์–ด์š”."
aspect_list = ['๊ฐ€๊ฒฉ', '๊ธฐ๋Šฅ', '๋‚ด๊ตฌ์„ฑ', '๋””์ž์ธ', '๋ฌด๊ฒŒ', '๋ฐฐํ„ฐ๋ฆฌ',
               '์‚ฌ์ด์ฆˆ', '์ƒ‰์ƒ', '์†Œ๋น„์ „๋ ฅ', '์†Œ์Œ', '์†Œ์žฌ',
               '์‹œ๊ฐ„/์†๋„', '์šฉ๋Ÿ‰', '์Œ๋Ÿ‰/์Œ์งˆ', '์ œ์กฐ์ผ/์ œ์กฐ์‚ฌ',
               '์ œํ’ˆ๊ตฌ์„ฑ', '์กฐ์ž‘์„ฑ', 'ํŽธ์˜์„ฑ', 'ํ’ˆ์งˆ', 'ํ™”์งˆ']

# 3. ์˜ˆ์ธก ์ˆ˜ํ–‰
results = {}
for aspect in aspect_list:
    input_text = f"{aspect}: {review}"
    preds = absa_pipeline(input_text)
    label = max(preds[0], key=lambda x: x["score"])
    results[aspect] = {"label": label["label"], "score": round(label["score"], 4)}

  # 4. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
label_map = {"LABEL_0": "๋ถ€์ •", "LABEL_1": "์ค‘๋ฆฝ", "LABEL_2": "๊ธ์ •", "LABEL_3": "์–ธ๊ธ‰์—†์Œ"}
print(review)
label3 = {}
for k, v in results.items():
    if v['label'] == 'LABEL_3':
      label3[k] = v
    else:
      print(f"{k:10s} โ†’ {label_map[v['label']]} ({v['score']})")
for k, v in label3.items():
  print(f"{k:10s} โ†’ {label_map[v['label']]} ({v['score']})")

2. model ์‚ฌ์šฉ ๋ฒ„์ „

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# 1๏ธโƒฃ ๋ชจ๋ธ ๋กœ๋“œ
model_name = "jxchlee/kcELECTRA-absa-none"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)

# 2๏ธโƒฃ ์ž…๋ ฅ ๋ฆฌ๋ทฐ & Aspect
review = "ํ™”๋ฉด์€ ์„ ๋ช…ํ•˜๊ณ  ๋ฐฐํ„ฐ๋ฆฌ๋„ ์˜ค๋ž˜๊ฐ€์ง€๋งŒ ๋ฐœ์—ด์ด ์กฐ๊ธˆ ์žˆ์–ด์š”."
aspect_list = ["ํ™”๋ฉด", "๋ฐฐํ„ฐ๋ฆฌ", "๋ฐœ์—ด"]

# 3๏ธโƒฃ ์˜ˆ์ธก
for aspect in aspect_list:
    text = f"{aspect}: {review}"
    inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=400)
    with torch.no_grad():
        outputs = model(**inputs)
        probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
        pred = torch.argmax(probs, dim=-1).item()

    label_map = {0: "๋ถ€์ •", 1: "์ค‘๋ฆฝ", 2: "๊ธ์ •", 3: "์–ธ๊ธ‰์—†์Œ"}
    print(f"[{aspect}] โ†’ {label_map[pred]} (ํ™•๋ฅ ={probs[0][pred]:.2f})")

๐Ÿงฉ ์˜ˆ์‹œ ์ถœ๋ ฅ

# 1. pipeline
ํ™”๋ฉด์€ ์„ ๋ช…ํ•˜๊ณ  ๋ฐฐํ„ฐ๋ฆฌ๋„ ์˜ค๋ž˜๊ฐ€์ง€๋งŒ ๋ฐœ์—ด์ด ์กฐ๊ธˆ ์žˆ์–ด์š”.
๋‚ด๊ตฌ์„ฑ        โ†’ ๋ถ€์ • (0.9229)
๋ฐฐํ„ฐ๋ฆฌ        โ†’ ๊ธ์ • (0.9567)
ํ™”์งˆ         โ†’ ๊ธ์ • (0.5763)
๊ฐ€๊ฒฉ         โ†’ ์–ธ๊ธ‰์—†์Œ (0.9993)
๊ธฐ๋Šฅ         โ†’ ์–ธ๊ธ‰์—†์Œ (0.9946)
๋””์ž์ธ        โ†’ ์–ธ๊ธ‰์—†์Œ (0.998)
๋ฌด๊ฒŒ         โ†’ ์–ธ๊ธ‰์—†์Œ (0.9994)
์‚ฌ์ด์ฆˆ        โ†’ ์–ธ๊ธ‰์—†์Œ (0.9991)
...

2. model
[ํ™”๋ฉด] โ†’ ๊ธ์ • (ํ™•๋ฅ =0.92)
[๋ฐฐํ„ฐ๋ฆฌ] โ†’ ๊ธ์ • (ํ™•๋ฅ =0.88)
[๋ฐœ์—ด] โ†’ ๋ถ€์ • (ํ™•๋ฅ =0.79)