|
--- |
|
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) | 77.6 | |
|
| [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 |
|
) |
|
} |
|
|
|
``` |