--- 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 --- ## 사용 예시 ```python # 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} ``` ## 학습 데이터 구성 ```json { "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](https://huggingface.co/datasets/nsmc) | 85.92 | | [jason9693/APEACH](https://huggingface.co/datasets/jason9693/APEACH) | 32.12 | | [klue-ynat](https://huggingface.co/datasets/klue) | 77.59 | | [kobest-boolq](https://huggingface.co/datasets/skt/kobest_v1) | 76.99 | | [kobest-copa](https://huggingface.co/datasets/skt/kobest_v1) | 61.2 | | [kobest-hellaswag](https://huggingface.co/datasets/skt/kobest_v1) | 코드 버그 있어서 제외 | | [kobest-sentineg](https://huggingface.co/datasets/skt/kobest_v1) | 55.92 | | [kobest-wic](https://huggingface.co/datasets/skt/kobest_v1) | 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 ) } ```