heegyu's picture
Update README.md
9f19247
metadata
license: apache-2.0
language:
  - ko
pipeline_tag: text-classification
widget:
  - text: 예전에는 주말마다 극장에 놀러갔는데 요새는  안가는 편이에요 [SEP] 댓글 주제를 분류하세요 [SEP] 시네마
  - text: >-
      인천발 KTX와 관련한 송도역 복합환승센터가 사실상 무산, 단순 철도·버스 위주 환승시설로 만들어진다. 이 때문에 인천시의 인천발
      KTX 기점에 앵커시설인 복합환승센터를 통한 인근 지역 경제 활성화를 이뤄낸다는 계획의 차질이 불가피하다. [SEP] 경제에 긍정적인
      뉴스인가요? [SEP] 아니요
  - text: 마지막에는 k팝 공연보고 좋은 추억 남았으면 좋겠네요 [SEP] 욕설이 포함되어있나요? [SEP] 아니요
datasets:
  - nsmc
  - jason9693/APEACH
  - KETI-AIR/korquad
  - klue
  - smilegate-ai/kor_unsmile
  - kor_nlu
  - skt/kobest_v1

사용 예시

# Load model directly
from transformers import AutoTokenizer, AutoModelForSequenceClassification

tokenizer = AutoTokenizer.from_pretrained("iknow-lab/ko-flan-zero-v0-0731")
model = AutoModelForSequenceClassification.from_pretrained("iknow-lab/ko-flan-zero-v0-0731")

def inference(instruction, input, labels):
    instruction = f"{input} [SEP] {instruction}"
    inputs = tokenizer([instruction] * len(labels), labels, truncation=True, padding=True, return_tensors="pt")
    
    scores = model(**inputs).logits.squeeze(1).tolist()
    output = dict(zip(labels, scores))

    print(instruction, output)

inference(
    "문장을 감성분류해주세요",
    "아 영화 개노잼",
    ["긍정적", "부정적"]
)

inference(
    "글과 관련된 내용을 만들어주세요",
    "예전에는 주말마다 극장에 놀러갔는데 요새는 좀 안가는 편이에요",
    ["영화에 관한 글이다", "드라마에 관한 글입니다"]
)


inference(
    "글을 읽고 시장에 미칠 영향을 판단해보세요",
    """인천발 KTX와 관련한 송도역 복합환승센터가 사실상 무산, 단순 철도·버스 위주 환승시설로 만들어진다. 이 때문에 인천시의 인천발 KTX 기점에 앵커시설인 복합환승센터를 통한 인근 지역 경제 활성화를 이뤄낸다는 계획의 차질이 불가피하다.

25일 시에 따르면 연수구 옥련동 104 일대 29만1천725㎡(8만8천평)에 추진 중인 2만8천62가구 규모의 송도역세권구역 도시개발사업과 연계, KTX 송도역 복합환승센터와 상업시설·업무시설 등의 조성을 추진 중이다. """,
    ["긍정", "부정", "중립"]
)

실행 결과

아 영화 개노잼 [SEP] 문장을 감성분류해주세요
{'긍정적': -7.878206253051758, '부정적': 50.96009826660156}

예전에는 주말마다 극장에 놀러갔는데 요새는 좀 안가는 편이에요 [SEP] 글과 관련된 내용을 만들어주세요
{'영화에 관한 글이다': 25.37109375, '드라마에 관한 글입니다': -31.869916915893555}

인천발 KTX와 관련한 송도역 복합환승센터가 사실상 무산, 단순 철도·버스 위주 환승시설로 만들어진다. 이 때문에 인천시의 인천발 KTX 기점에 앵커시설인 복합환승센터를 통한 인근 지역 경제 활성화를 이뤄낸다는 계획의 차질이 불가피하다.

25일 시에 따르면 연수구 옥련동 104 일대 29만1천725㎡(8만8천평)에 추진 중인 2만8천62가구 규모의 송도역세권구역 도시개발사업과 연계, KTX 송도역 복합환승센터와 상업시설·업무시설 등의 조성을 추진 중이다.  [SEP] 글을 읽고 시장에 미칠 영향을 판단해보세요
{'긍정': -61.86758804321289, '부정': 23.72732925415039, '중립': -70.4837417602539}

학습 데이터 구성

{
    "splits": "train",
    "tasks": "nsmc,apeach,korquad_v1.0,klue_mrc,klue_nli,klue_ynat,kor_nlu,unsmile,klue_re,kobest_copa,kobest_hellaswag,kobest_boolq,kobest_wic,niklex,nikl_absa",
    "max_instance_per_task": 20000,
    "split_train": {
        "nsmc": 20000,
        "apeach": 7895,
        "korquad_v1.0": 20000,
        "klue_mrc": 17553,
        "klue_nli": 8046,
        "klue_ynat": 20000,
        "kor_nlu": 20000,
        "unsmile": 15002,
        "klue_re": 20000,
        "kobest_copa": 3075,
        "kobest_hellaswag": 499,
        "kobest_boolq": 3664,
        "kobest_wic": 3317,
        "niklex": 20000,
        "nikl_absa": 2139
    },
    "split_train_total": 181190
}

평가(test set)

task accuracy
nsmc 85.92
jason9693/APEACH 32.12
klue-ynat 77.59
kobest-boolq 76.99
kobest-copa 61.2
kobest-hellaswag 코드 버그 있어서 제외
kobest-sentineg 55.92
kobest-wic 58.49

평가 방식

  • 모델에 [CLS] {input} [SEP] {instruction} [SEP] label [SEP] 형식으로 넣고 나온 positive와 negative끼리 비교함.
  • positive는 정답 라벨을 사용하고, negative는 정답 라벨이 아닌 모든 라벨을 사용
  • 정답 라벨의 점수가 모든 negative보다 높을 경우 맞춘 것으로 간주함. 이런 식으로 accuracy 측정.

테스트에 사용한 매핑 코드

klue_ynat_labelToTextDict = {
    0: "IT과학",
    1: "경제",
    2: "사회",
    3: "생활문화",
    4: "세계",
    5: "스포츠",
    6: "정치",
}
klue_ynat_labels = set(klue_ynat_labelToTextDict.values())

def klue_ynat_mapper(item):
    positives = [klue_ynat_labelToTextDict[item["label"]]]
    return {
        "instruction": "문장을 읽고 주제를 분류하세요",
        "input": item["title"],
        "positives": positives,
        "negatives": klue_ynat_labels - set(positives)
    }

kobest_wic_labels = ["아니오", "예"]

def kobest_wic_mapper(item):
    return {
        "instruction": "주어진 두 문장에서 단어 {word}은(는) 동일한 의미로 사용되었나요?".format(word=item["word"]),
        "input": "문장1: {context_1}\n문장2: {context_2}".format(**item),
        "positives": [kobest_wic_labels[item['label']]],
        "negatives": [kobest_wic_labels[1 - item['label']]]
    }

copa_question = {
    "결과": "이후에 이어질 결과는?",
    "원인": "이러한 일이 일어난 원인은?"
}

def kobest_copa_mapper(item):
    answers = [item["alternative_1"], item["alternative_2"]]
    return {
        "instruction": copa_question[item["question"]],
        "input": item["premise"],
        "positives": [answers[item['label']]],
        "negatives": [answers[1 - item['label']]]
    }


def kobest_hellaswag_mapper(item):
    answers = [item[f"ending_{i}"] for i in range(1, 5)]
    label = answers[item['label']]
    answers.remove(label)

    return {
        "instruction": "이후에 이어질 내용으로 가장 적절한 것은?",
        "input": item["context"],
        "positives": [label],
        "negatives": answers
    }

kobest_boolq_labels = ["아니오", "예"]
def kobest_boolq_mapper(item):
    return {
        "instruction": item["question"],
        "input": item["paragraph"],
        "positives": [kobest_boolq_labels[item['label']]],
        "negatives": [kobest_boolq_labels[1 - item['label']]]
    }

kobest_sentineg_labels = ["부정", "긍정"]
def kobest_sentineg_mapper(item):
    return {
        "instruction": "주어진 문장의 감정을 분류하세요",
        "input": item["sentence"],
        "positives": [kobest_boolq_labels[item['label']]],
        "negatives": [kobest_boolq_labels[1 - item['label']]]
    }

nsmc_labels = ["부정", "긍정"]
def nsmc_mapper(item):
    return {
        "instruction": "주어진 문장의 감정을 분류하세요",
        "input": item["document"],
        "positives": [nsmc_labels[item['label']]],
        "negatives": [nsmc_labels[1 - item['label']]]
    }

apeach_labels = ["혐오 표현이 아닙니다", "혐오표현"]
def apeach_mapper(item):
    return {
        "instruction": "혐오성을 분류해보세요.",
        "input": item["text"],
        "positives": [nsmc_labels[item['class']]],
        "negatives": [nsmc_labels[1 - item['class']]]
    }



EVAL_LIST = {
    "klue-ynat": dict(
        load_args=dict(
            path="klue",
            name="ynat",
            split="validation"
        ),
        mapper=klue_ynat_mapper
    ),
    "nsmc": dict(
        load_args=dict(
            path="nsmc",
            split="test"
        ),
        mapper=nsmc_mapper
    ),
    "apeach": dict(
        load_args=dict(
            path="jason9693/APEACH",
            split="test"
        ),
        mapper=apeach_mapper
    ),
    "kobest-wic": dict(
        load_args=dict(
            path="skt/kobest_v1",
            name="wic",
            split="test"
        ),
        mapper=kobest_wic_mapper
    ),
    "kobest-copa": dict(
        load_args=dict(
            path="skt/kobest_v1",
            name="copa",
            split="test"
        ),
        mapper=kobest_copa_mapper
    ),
    "kobest-hellaswag": dict(
        load_args=dict(
            path="skt/kobest_v1",
            name="hellaswag",
            split="test"
        ),
        mapper=kobest_hellaswag_mapper
    ),
    "kobest-boolq": dict(
        load_args=dict(
            path="skt/kobest_v1",
            name="boolq",
            split="test"
        ),
        mapper=kobest_boolq_mapper
    ),
    "kobest-sentineg": dict(
        load_args=dict(
            path="skt/kobest_v1",
            name="sentineg",
            split="test"
        ),
        mapper=kobest_sentineg_mapper
    )
}