Giter Site home page Giter Site logo

level2_nlp_datacentric-nlp-07's Introduction

주제 분류 프로젝트

모델 구조의 변경 없이 Data-Centric 관점으로 텍스트의 주제를 분류


지은

재연

영준

다혜

윤진

📏 Process

  1. 개발 전에 github issue를 생성해주세요!
    1. 템플릿에 맞게 내용을 작성한다
      • title : [태그 전부 대문자]/제목 ex) [FEAT]/세팅
    2. Assignees, Label을 단다
  2. feature branch를 생성해주세요!
    1. 브랜치명은 태그 소문자/기능 로 한다. ex) feat/setting
    2. 예시는 다음과 같다 브랜치명: feat/setting
  3. 로컬에서 작업하고 기능단위로 쪼개서 커밋을 해주세요!
  4. 해당 issue에 대한 작업이 완료되었다면 github에 해당 브랜치를 올려주세요!
  5. PR을 템플릿에 맞춰서 올려주세요!

📌 커밋 컨벤션

[태그 그대로] 간략 설명

- 기능 1
- 기능 2

#{이슈번호}

ex)

[Feat] 데이터 전처리

- 데이터 맞춤법 처리

#1


📌 PR 컨벤션

  1. 템플릿에 맞게 내용을 작성한다
    • title : [태그 전부 대문자]/제목 ex) [FEAT]/데이터 전처리
  2. Assignees, Label을 단다


🌴 태그

태그 이름 설명
[Data] 데이터 관련 이슈, EDA 관련 작업
[Exp] 모델 실험 관련 작업
[Util] 로그 등 모델 성능에는 관련 없는 기능들
[Feat] 새로운 기능 구현
[Fix] 버그, 오류 해결
[Refactor] 전면 수정이 있을 때 사용
[Doc] README나 WIKI 등의 문서 개정
[Chore] 코드 수정, 내부 파일 수정
[Add] FEAT 이외의 부수적인 코드 추가, 라이브러리 추가, 새로운 파일 생성
[Hotfix] issue나 QA에서 급한 버그 수정에 사용
[Del] 쓸모 없는 코드 삭제
[Correct] 주로 문법의 오류나 타입의 변경, 이름 변경에 사용
[Move] 프로젝트 내 파일이나 코드의 이동
[Rename] 파일 이름 변경이 있을 때 사용
[Impove] 향상이 있을 때 사용

level2_nlp_datacentric-nlp-07's People

Contributors

yunjinchoidev avatar

Watchers

Jieun Kwon avatar  avatar

level2_nlp_datacentric-nlp-07's Issues

[FEAT] 파파고 API 사용 방법

Background

  • 데이터 증강을 위해 파파고 API 사용 방법

To Do

  • 파파고 API 사용 코드 스니펫 작성

See Also

import os
import sys
import urllib.request
import json


client_id = "" # 개발자센터에서 발급받은 Client ID 값
client_secret = "" # 개발자센터에서 발급받은 Client Secret 값



'''
영어로 1차 번역
'''
encText = urllib.parse.quote("아시아나여객기, 문 열린채 대구공항 착륙…승객들 공포(종합)")
data = "source=ko&target=en&text=" + encText
url = "https://openapi.naver.com/v1/papago/n2mt"
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request, data=data.encode("utf-8"))
rescode = response.getcode()

en_result = ''
if(rescode==200):
    response_body = response.read()
    en_result = json.loads(response_body.decode('utf-8'))["message"]["result"]["translatedText"]
else:
    print("Error Code:" + rescode)




'''
영어로 번역된 것을 다시 한국어로 재번역
'''
data2 = "source=en&target=ko&text=" + en_result
url = "https://openapi.naver.com/v1/papago/n2mt"
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request, data=data2.encode("utf-8"))
rescode = response.getcode()


result = ''
if(rescode==200):
    response_body = response.read()
    result = json.loads(response_body.decode('utf-8'))["message"]["result"]["translatedText"]
else:
    print("Error Code:" + rescode)



print('*'*100)
print(result)
print('*'*100)

[FEAT] kogpt를 활용한 데이터 생성

Background

  • 생성 모델을 활용한 데이터 생성
  • 기학습 데이터셋에 뉴스 데이터가 포함된 skt kogpt가 뉴스 관련 문장을 잘 생성할 것이라 예상.

To Do

  • [ ]
  • [ ]

See Also

  • baseline model : skt/ko-gpt-trinity-1.2B-v0.5
  • train data : 기존에 주어진 학습 데이터에서 노이즈를 제거한 데이터. '{label_text}.{input_text}'의 형식을 input으로 함
  • 파인튜닝 모델 허깅페이스 업로드 완료
from transformers import GPT2LMHeadModel, AutoTokenizer
import torch

def generate(input_text, tokenizer, model, num):
    sentence_list = []
    for _ in range(num):
        token_ids = tokenizer(input_text + '|', return_tensors = 'pt')['input_ids'].to(device)
        gen_ids = model.generate(token_ids, max_length=32,
                                 repetition_penalty=2.0,
                                 pad_token_id=tokenizer.pad_token_id,
                                 eos_token_id=tokenizer.eos_token_id,
                                 bos_token_id=tokenizer.bos_token_id,
                                 use_cache=True,
                                 # temperature=2.0,
                                 do_sample=True,
                                )
        sentence = tokenizer.decode(gen_ids[0])
        sentence = sentence[sentence.index('|')+1:]
        if '<' in sentence:
            sentence = sentence[:sentence.index('<')].rstrip()
        sentence_list.append(sentence)
    return sentence_list

device = torch.device("cuda")
model = GPT2LMHeadModel.from_pretrained('JLake310/ko-gpt-trinity-1.2B-ynat-gen').to(device)
tokenizer = AutoTokenizer.from_pretrained('JLake310/ko-gpt-trinity-1.2B-ynat-gen')

gen_result = generate("IT과학", tokenizer, model, 10)
print(gen_result)
'''
['카메라 앱이 사진 선명하세요...LG전자 AI 카메라 출시',
 '올레tv 스마트홈',
 '네이버 앱 내 사용자 평점 공개...자사 서비스 홍보나선다',
 '올인원 게임 추천 프로그램 등장...게임로프트가 공식 출시',
 '다빈치 코덱 3D로 복원했다...논문 표절 논란 속 출간종합',
 '자발적으로 삭제한 인터넷 게시물 5년간 17만건...4배',
 '이번에 나온 스마트워치',
 '국방부 군공항에 드론도 배치',
 '삼성 갤럭시A90 출시...LTE 지원',
 'LG전자 V30S 체험 공간 개소']
'''

gen_result = generate("생활문화", tokenizer, model, 10)
print(gen_result)
'''
['신간 현대문학사 100주년과 한국현대소설론',
 '동네한바퀴...세종마을 옛사진 보물로 승격',
 "연극 '라이어' 막다른 집 결말에 극적 반전이...",
 '인천 옹진군 바다 쓰레기 불법투기 상시감시체계 구축',
 '시베리아 한파특보...눈구름 주의보, 내륙 영하 30도 이상 강하',
 '가을, 단풍도 들겠다...전국 27개 관측소서 첫 가을산책 행사',
 '섬진강',
 '예술의전당 미술관 5월 황금연휴 전시회 풍성...국립현대미술관은 연휴 이틀 뒤인 28일부터 운영',
 '경인일보 시화집 제1부 인천의 추억',
 '대나무로 만든 멧돼지 퇴치제 등장']
'''

generate 함수에 라벨과 토크나이저, 모델, 생성할 문장 개수를 입력으로 줍니다.
모든 라벨에 대해서 잘 생성하긴 하지만, 길이가 너무 짧은 문장들이 생겨 너무 짧은 문장들만 제외하고 사용하면 될 것 같습니다.

5/28 01:54 에러 추가

아침까지만 해도 잘 돌아가던 코드가 갑자기 에러가 나네요,, 확인 중에 있습니다.

5/28 02:08 디버깅 내용 추가

이번에 새로 받은 requirement.txt와 저번에 받았던 파일 사이의 패키지 충돌이 있는듯합니다.
생성을 하기 위해서는 이전에 받았던 requirement.txt로 설치해야할 것 같습니다.

[Fix] Heatmap이 제대로 안 그려지는 오류(Fixed)

Background

  • heatmap이 아래 사진과 같이 제대로 그려지지 않는 오류 발생.

image

To Do

  • Heatmap 작성 코드 수정
  • wandb 자체 heatmap 사용해보기

See Also

  • 지난번 코드와 동일하게 작성했음에도 왜 제대로 안 그려지는지 모르겠습니다 ..
  • 심지어 셀에서 돌린 후에 다시 그려보면 제대로 그려지는데, 어떻게 해결해야할지 감이 안 옵니다.

[FEAT] Self-training으로 외부데이터셋 활용

Background

  • 외부 데이터셋 활용에서 label이 annotator가 라벨링한것이 아닌 뉴스기사의 실제 카테고리임
  • annotator가 라벨링한 train set으로 학습한 모델로 외부 데이터셋 라벨링 결정

To Do

  • 모델 앙상블, 외부 데이터셋(TS_span_extraction.json) 라벨링

[FEAT] wandb confusion matrix 추가

Background

  • wandb에 이미지를 기록할 수 있는 것을 확인
  • 분류 작업이다보니 confusion matrix를 한 번에 볼 수 있으면 좋지 않을까 하는 발상

To Do

  • ConfusionMatrix 그리고 저장하는 코드 추가
  • wandb에 이미지 저장하는 코드 추가

See Also

[FEAT] kogpt2를 활용한 라벨별 생성 모델 제작 및 데이터 증강

Background

  • 기존 ko gpt trinity 모델에 입력을 줄 때 {라벨. 텍스트}의 형식으로 입력을 주었는데, 생성 결과가 라벨이 맞지 않는 경우가 꽤 많이 생김
  • 라벨 별로 생성하는 모델을 다르게 두면 각 라벨에 해당하는 텍스트를 잘 생성할 것이라는 가설 수립
  • 데이터셋을 라벨별로 분리한 후 학습 진행

To Do

  • 각 라벨별 모델 생성 및 데이터 생성

See Also

  • 베이스 모델을 skt/ko-gpt-trinity-1.2B-v0.5에서 skt/kogpt2-base-v2로 교체
  • 데이터셋이 작아진만큼 큰 모델을 사용할 필요가 없다고 판단
  • 모델을 학습하고 저장한 후에 모델을 불러오니 생성이 제대로 안 되는 이슈가 있어
    학습 -> 문장 생성 -> 저장의 프로세스를 거치도록 함

[DATA]/ChatGPT를 활용한 train데이터 증강

Background

  • ChatGPT API - gpt-3.5-turbo 가 존재하나 유료임
  • 다양한 prompt로 기사제목 직접 생성
target count plot

To Do

  • ChatGPT를 활용하여 다양한 prompt로 기사제목 생성 (사회, IT과학)

[DOC] 데이터 어노테이션 문서

Background

  • 뉴스 기사 라벨 노이즈 분리를 위한 어노테이션 문서

To Do

  • 뉴스 기사 라벨 노이즈 분리를 위한 어노테이션 문서 만들기
주제 설명 예시 문장
생활문화 일상 생활과 관련된 다양한 흥미로운 이야기와 문화적 현상을 다룸 - 도시에서 자연으로 향하는 힐링 트레킹의 인기가 높아지고 있음
    - 한자리에서 만날 수 있는 다양한 미술작품을 소개함
    - 맛있는 음식과 함께하는 특별한 가족 모임의 시간을 만들어보세요
스포츠 다양한 종목의 스포츠와 관련된 기사를 다룸 - 월드컵 준비에 나선 국가대표팀의 최신 소식을 전함
    - 지난 주말에 열린 야구 경기에서 팀 A가 승리함
    - 스포츠 인기 증가에 따라 많은 청소년들이 스포츠 동아리에 참여함
세계 국제 사건, 세계 이슈, 국제 정치 등 세계적인 관점을 다룸 - 미국과 중국의 무역 전쟁이 확전되면서 국제 경제에 영향을 미침
    - 세계 각국의 정상들이 회담을 개최하여 긴밀한 국제 협력 모색함
    - 전 세계적으로 확산된 전염병으로 인해 다양한 국가들이 대응함
정치 국내외 정치 동향, 정치인의 활동, 정책 변화 등을 다룸 - 다가올 지방 선거에서 주요 정당들이 경쟁함
    - 정부가 사회안전망 구축을 위한 새로운 정책을 발표함
    - 국제 정세 변화로 인해 정부의 외교 전략에 변화가 예상됨
경제 국내외 경제 동향, 기업 소식, 금융 시장 등을 다룸 - 주요 기업이 실적 호조로 경제 활성화에 기여함
    - 금융 시장에서 발생한 변동으로 인해 투자자들은 안정성을 추구함
    - 국제 무역의 활발한 수출이 국내 경제에 긍정적인 영향을 미침
IT 과학 정보 기술, 컴퓨터 과학, 과학 기술, 인공지능 등을 다룸 - 인공지능 기술을 활용한 자율주행 자동차의 시범운행이 시작됨
    - 과학자들이 새로운 치료법을 개발하여 암 치료의 효과를 높임
    - 클라우드 컴퓨팅 기술의 발전으로 인해 기업들은 더욱 효율적인 데이터 관리 가능
사회 사회적 이슈, 사회 문제, 문화적 다양성, 사회 변화 등을 다룸 - 코로나19로 인한 사회적 거리두기 정책의 시행에 대한 반응 분석
    - 다문화 가정의 증가로 사회적 다양성이 확대됨
    - 경제 격차로 인한 사회 문제 해결을 위한 정책 방안 모색함

[FEAT] [정치-경제], [사회 - 정치], [사회 - 경제], [사회 - 문화], [사회 - 스포츠] 을 중심으로 처리

Background

  • 히트맵을 봤을 때 [정치-경제], [사회 - 정치], [사회 - 경제], [사회 - 문화], [사회 - 스포츠] 에서 오차가 많이 발생하는 듯 함.
  • 특히 사회 부분을 중심으로 데이터를 정제 해야 할 필요성이 있어 보인다.
  • 이 부분을 중심으로 라벨링 에러를 삭제하고, 증강하고 정제하는 방식이 모델의 성능을 높일 거 같다.

To Do

  • [정치-경제], [사회 - 정치], [사회 - 경제], [사회 - 문화], [사회 - 스포츠] 을 중심으로 데이터 증강, 라벨 에러 삭제, 정제

[FEAT] soft voting ensemble을 통한 라벨 에러 필터링

Background

  • roberta로 라벨 필터링을 하는 성능이 좋다. roberta도 노이즈에 영향을 받기 때문에 여러 모델을 사용해서 노이즈를 분산시키면 라벨을 더 잘 필터링할 수 있을 것 같다.
  • 다른 데이터셋으로 학습한 분류기 여러개로 soft voting을 해서 라벨 에러를 찾으려 한다

방법 1. soft voting으로 예측한 레이블과 기존 레이블이 다른 데이터 제거
방법 2. cleanlab으로 label qualty score가 낮은 데이터 제거

To Do

  • [ ]
  • [ ]

See Also

[FEAT] 나름 짜본 ChatGPT 생성 프롬프트

Background

  • 생성 프롬프트

To Do

  • 생성 프롬프트
딥러닝 학습을 위해서 데이터를 생성해야 한다.
생활문화, 스포츠, 세계, 정치, 경제, IT 과학, 사회 주제에 해당하는 기사 제목 창작해서 2개씩 알려주세요. 기사 제목 옆에는 , 를 붙이고 주제를 올바르게 넣어서 출력해야한다.
최대한 내가 준 예시와 겹치지 않게 다채롭고 정확한 기사 제목을 선정하도록 해.

예시 :
유튜브 내달 2일까지 크리에이터 지원 공간 운영,생활문화

[FEAT] lable noise, input text noise 행만 추출해내는 코드

Background

  • lable noise 추출해내는 코드가 필요하다.

To Do

  • lable noize 추출해내는 코드, input text noise 행만 추출해내는 코드 (train-2.csv 에 대해 적용하면됨)
import pandas as pd

# 원본 데이터 파일을 읽어옵니다.
df = pd.read_csv('duplicates.csv')

# 중복된 행을 찾습니다. (라벨 중복)
label_noise = df[df.duplicated(subset='input_text', keep=False)]


# 중복된 행들을 별도의 CSV 파일로 저장합니다.
label_noise.to_csv('label_noise.csv', index=False)


# df 에서 중복된 input text 를 제외한 코드
input_text_noise = df.drop_duplicates(subset=['input_text'], keep=False)
input_text_noise.to_csv('input_text_noise.csv', index=False)

실험/제시

  • input_text_noise.csv 에 대해서는 사람이 수기로 노이즈를 제거하는 건 어떨까 생각해봅니다. (일단 hanspell 해서 중복 된 것을 제거하는 방식으로 해볼 예정입니다.)
  • label_noise.csv 에 대해서는 저희 끼리 문서를 만들어서 label 을 부여 해보는건 어떨까 생각해봅니다.

[FEAT] 뉴스 기사 제목을 맞춤법 검사를 적용해주는 코드

Background

  • 뉴스 기사 제목을 맞춤법 검사를 적용해주는 코드

To Do

  • 뉴스 기사 제목을 맞춤법 검사를 적용해주는 코드
import pandas as pd
from hanspell import spell_checker

train = pd.read_csv("../data/train.csv")

# input_text 에 대해서 맞춤법 검사를 적용해주기.
train["input_text"] = train["input_text"].apply(
    lambda x: spell_checker.check(x).checked
)

train.to_csv("spell_check.csv", index="first")

[FEAT] url 크롤링을 활용한 g2p 제거

Background

  • 데이터셋에 url이 있음을 확인하고, newspaper 라이브러리를 활용한 기사 제목 크롤링
  • train 데이터셋에 적용한 동일한 전처리 과정 적용

To Do

  • 말줄임표('…') 처리 방법 논의
  • 성능 확인하기

See Also

강의 내용 중에 등장했던 newspaper 라이브러리가 생각나서 사용해보았습니다.

크롤링 코드

import pandas as pd
from newspaper import Article
from tqdm import tqdm

train = pd.read_csv('./new_data/train.csv')
texts = []
for news_url in tqdm(train['url']):
    try:
        article = Article(news_url, language='ko')
        article.download()
        article.parse()
        texts.append(article.title)
    except:
        texts.append("except")

전처리 함수

from soynlp.normalizer import *
import re

def preprocess(text):
    # HTML 태그 제거
    text = re.sub(r"<[^>]+>\s+(?=<)|<[^>]+>", "", text).strip()

    # 이메일 제거
    text = re.sub(r"[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "", text).strip()

    # 해쉬태그 제거
    text = re.sub(r"#\S+", "", text).strip()

    # 멘션 제거
    text = re.sub(r"@\w+", "", text).strip()

    # URL 제거
    text = re.sub(r"(http|https)?:\/\/\S+\b|www\.(\w+\.)+\S*", "", text).strip()
    text = re.sub(r"pic\.(\w+\.)+\S*", "", text).strip()

    # 특수 문자 제거
    text = re.sub(r"[^\w\s…]", "", text)

    # 문제를 일으킬 수 있는 문자 제거
    bad_chars = {"\u200b": "", "…": " ... ", "\ufeff": ""}
    for bad_char in bad_chars:
        text = text.replace(bad_char, bad_chars[bad_char])
    text = re.sub(r"[\+á?\xc3\xa1]", "", text)

    # 언론 정보 제거
    re_patterns = [
        r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)",
        r"[가-힣]{0,4} (기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장) ",  # 이름 + 기자
        r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)",  # (... 연합뉴스) ..
        r"\(\s+\)",  # (  )
        r"\(=\s+\)",  # (=  )
        r"\(\s+=\)",  # (  =)
    ]
    for re_pattern in re_patterns:
        text = re.sub(re_pattern, "", text).strip()

    # 저작권 관련 텍스트 제거
    re_patterns = [
        r"\<저작권자(\(c\)|ⓒ|©|\(Copyright\)|(\(c\))|(\(C\))).+?\>",
        r"저작권자\(c\)|ⓒ|©|(Copyright)|(\(c\))|(\(C\))"
    ]

    for re_pattern in re_patterns:
        text = re.sub(re_pattern, "", text).strip()

    # 사진 라벨 제거
    text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", text).strip()

    # 쓸모없는 괄호 제거
    bracket_pattern = re.compile(r"\((.*?)\)")
    modi_text = ""
    text = text.replace("()", "")  # 수학() -> 수학
    brackets = bracket_pattern.search(text)
    if brackets:
        replace_brackets = {}
        # key: 원본 문장에서 고쳐야하는 index, value: 고쳐져야 하는 값
        # e.g. {'2,8': '(數學)','34,37': ''}
        while brackets:
            index_key = str(brackets.start()) + "," + str(brackets.end())
            bracket = text[brackets.start() + 1 : brackets.end() - 1]
            infos = bracket.split(",")
            modi_infos = []
            for info in infos:
                info = info.strip()
                if len(info) > 0:
                    modi_infos.append(info)
            if len(modi_infos) > 0:
                replace_brackets[index_key] = "(" + ", ".join(modi_infos) + ")"
            else:
                replace_brackets[index_key] = ""
            brackets = bracket_pattern.search(text, brackets.start() + 1)
        end_index = 0
        for index_key in replace_brackets.keys():
            start_index = int(index_key.split(",")[0])
            modi_text += text[end_index:start_index]
            modi_text += replace_brackets[index_key]
            end_index = int(index_key.split(",")[1])
        modi_text += text[end_index:]
        modi_text = modi_text.strip()
        text = modi_text
    

    # 반복 문자 개수 고정
    text = repeat_normalize(text, num_repeats=2).strip()

    # 기호 치환
    punct_mapping = {"‘": "'", "₹": "e", "´": "'", "°": "", "€": "e", "™": "tm", "√": " sqrt ", "×": "x", "²": "2", "—": "-", "–": "-", "’": "'", "_": "-", "`": "'", '“': '"', '”': '"', '“': '"', "£": "e", '∞': 'infinity', 'θ': 'theta', '÷': '/', 'α': 'alpha', '•': '.', 'à': 'a', '−': '-', 'β': 'beta', '∅': '', '³': '3', 'π': 'pi', }
    for p in punct_mapping:
        text = text.replace(p, punct_mapping[p])
    text = text.strip()

    # 연속 공백 제거
    text = re.sub(r"\s+", " ", text).strip()

    return text

clean_texts = [preprocess(text) for text in texts]

기사 삭제 등의 이슈로 인해 크롤링이 되지 않은 항목 수기로 추가

except_idx = [idx for idx, val in enumerate(clean_texts) if val=="except"]
train.iloc[except_idx]['text']
'''
14065       한진해운 글로벌 해운동맹 합류…현대상선 일단 제외 종합2보
21419             81세 부테플리카 알제리 대통령 대선 출마 선언
24213    안테토쿤보 30점 ... 밀워키 보스턴 3연패 밀어 넣고 4연승
25874     朴대통령 내주초 추가 메시지 내놓을듯 ... 국민단합 호소종합
30201            삼성카드 핸드메이드 유통 플랫폼 백패커와 업무제휴
30553               수소위원회 만찬 후 기념촬영하는 3사 CEO
Name: text, dtype: object
'''

clean_texts[14065] = "한진해운 글로벌 해운동맹 합류…현대상선 일단 제외 종합2보"
clean_texts[21419] = "81세 부테플리카 알제리 대통령 대선 출마 선언"
clean_texts[24213] = "안테토쿤보 30점 ... 밀워키 보스턴 3연패 밀어 넣고 4연승"
clean_texts[25874] = "朴대통령 내주초 추가 메시지 내놓을듯 ... 국민단합 호소종합"
clean_texts[30201] = "삼성카드 핸드메이드 유통 플랫폼 백패커와 업무제휴"
clean_texts[30553] = "수소위원회 만찬 후 기념촬영하는 3사 CEO"

전처리한 text 데이터셋에 추가 후 저장

train['text'] = clean_data
train.to_csv('./g2p_clean_train.csv', index=True)

추가적으로 공유할 내용이, 데이터셋에 엄청 자주 등장하는 '…'이 말줄임표가 베이스라인에서 제공되는 토크나이저에서는 unk 토큰으로 토큰화 되는 것을 확인했습니다. 그래서 지금은 ' ... '으로 놔둔 상태인데, 다시 '…'로 바꾸고 스페셜 토큰을 추가하는 방법이 좋을 지, 현재 방법이 좋을 지 실험 해봐야 할 것 같습니다.

그리고 개인적으로는,
url 크롤링은 다시 진행하지 않는 것을 추천드립니다.
45000개 가량 되다보니 전체 코드 실행만 4시간 가량 걸렸습니다 ,,
그리고 중간에 오류가 좀 생겨서 csv를 수기로 수정한 부분이 있어서, 코드를 그대로 돌리면 결과가 재현되지 않을 것 같습니다.
-> 5/28 13:42 추가 : 오류까지 찾아내어서, 다시 돌려도 결과가 재현될 수 있도록 수정해두었습니다 😊

아래는 결과 csv 파일입니다.

g2p_clean_train.csv

[FEAT] 라벨링 에러 처리를 위한 cleanlab 사용

Background

  • g2p 제거한 데이터셋 사용

cleanlab

  • confident learning을 통해 레이블 오류를 예측한다.

when the predicted probability of an example is greater than a per-class-threshold, we confidently count that example as actually belonging to that threshold’s class. The thresholds for each class are the average predicted probability of examples in that class.
- An Introduction to Confident Learning: Finding and Learning with Label Errors in Datasets

  • 각 레이블에 대한 예측 확률을 사용. 예측 확률을 생성할 모델은 제공해야 한다
  • 라벨링 오류를 예측할 데이터는 학습 데이터에 속하지 않은 out-of-sample이야 하므로 cross-validation 사용

코드

# data = 라벨 노이즈 있는 학습 데이터
# labels = 라벨 노이즈 있는 학습 데이터의 라벨
# pred_probs = kfold를 통해 valid set에 대한 예측 확률, size = (데이터 개수, 7)

# 라벨 에러로 탐지된 인덱스 배열 반환
issue_idx = cleanlab.filter.find_label_issues(labels, pred_probs, return_indices_ranked_by="self_confidence", 
                                              filter_by='prune_by_noise_rate') # default

display(data.iloc[issue_idx])

cleanlab 공식문서에서 다음과 같이 라벨 에러 탐지 기준을 제공합니다.

image

To Do

  • kobert로 text embedding 추출 후 classifier만 파인튜닝한 모델 사용
    • LogisticRegression (cleanlab 튜토리얼)
    • nn.Linear classifier (huggingface, 베이스코드에서 사용하는 구조) (코드를 잘못 짰는지 점수가 낮습니다)
  • kobert 전체 파인튜닝한 모델 사용

See Also

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.