부스트캠프 AI Tech 4기
(NLP 기초대회) NL Data 관리 및 처리 툴 소개
쉬엄쉬엄블로그
2023. 7. 17. 11:01
728x90
이 색깔은 주석이라 무시하셔도 됩니다.
NL Data 관리 및 처리 도구 소개 - Pandas
Pandas
Pandas
About Pandas
- 대용량 데이터 처리 가능
- Pandas를 이용하면 GB 단위 이상의 대용량 처리
- 테이블과 시계열을 조작하기 위한 데이터 구조와 연산을 제공
- 데이터를 합치고 관계 연산을 수행하는 기능들, 누락 데이터 등을 처리할 수 있는 기능들 외 다양한 기능들을 제공
- 대용량 데이터 처리 가능
Excel-like data form
- Pandas는 기본적으로 “엑셀”과 비슷한 형태의 자료구조들을 지원
- Pandas에서는 “Series”와 “DataFrame”이라는 자료구조를 제공함으로써 데이터 분석을 도와준다.
Series & DataFrame
Series : 1차원 배열의 형태
- 인덱스에 의해 데이터가 저장되고 검색
DataFrame : 2차원 배열의 형태
- 인덱스와 컬럼에 의해 데이터가 저장되고 검색
Series 생성
DataFrame 생성
데이터 선택
Column 명과 Row의 범위를 이용하여 데이터 선택
- 주의) ‘가’와 같이 인덱스 이름을 통해 데이터를 가져오기 위해서 df[’가’]라고 하면 KeyError가 발생
- DataFrame은 Column을 Key 값으로 갖기 때문
- 따라서, df[컬럼명]의 형태로만 사용 가능
- df[시작 위치 : 마지막위치 + 1]
- df[”시작 index 이름” : “마지막 index 이름”]
Index의 이름(Row의 이름)으로 데이터 선택
다양한 범위의 위치를 기준으로 데이터 선택
조건을 이용하여 데이터 선택
데이터 분석
행방향으로의 또는 열방향으로의 합 구하기
- reduce function
그 외 함수들
Pandas with NLP
Pandas with NLP
데이터 읽고, 쓰기
- Pandas는 간단한 함수로 데이터를 쉽게 읽고, 쓰게 지원
- 매우 많은 형태의 데이터를 기본적으로 지원
활용할 데이터
- Korean Language Understanding Evaluation(KLUE)의 Natural Language Inference (NLI) 데이터
- 가설 문장과 전체 문장 간의 관계를 추론
- 입력 : premise(전제), hypothesis(가정)
- 출력 : gold_label [진실(entailment), 거짓(contradiction), 미결정(neutral)]
- 3,000개의 문장 쌍
데이터 탐색
Row의 범위와 Column 명으로 데이터 탐색
- 3,000개의 문장 쌍 데이터 중 Row의 범위로 1000개를 선택
- 선택된 데이터의 Column = gold_label 선택
다양한 Column 명으로 데이터 탐색
조건을 이용한 특정 단어가 있는 데이터 탐색
데이터 분석
조건을 이용한 데이터 분석
PyTorch Dataset
PyTorch Dataset에 적용하기
class DF2DataSet(Dataset): def __init__(self, df, max_len=512, truncate=True): # label만 있는 데이터 생성 self.label = df['gold_label'] # label을 숫자로 변환하기 위한 label 모음 self.get_labels = set(self.label) # 문자열을 tensor vector로 변환해주는는 tokenizer 준비 self.tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) # tokenizer로 두 문장 (premise, hypothesis)을 변환하여 입력 데이터 생성 ## 두 문장을 string 타입의 list로 변환 p_text = pd.Series(df['premise'], dtype="string").tolist() h_text = pd.Series(df['hypothesis'], dtype="string").tolist() self.input_data = self.tokenizer(text = p_text, text_pair = h_text, padding='max_length', truncation=truncate, return_tensors='pt', max_length=max_len) def __len__(self): return len(self.label) def __getitem__(self, idx): item = {"inputs": self.input_data[idx], # label을 id로 변환 "labels": torch.tensor(self.get_labels.index(self.label.iloc[idx])), } return item
자연어 데이터셋 불러오고 분할하기
# 데이터셋 생성 df_dataset = DF2DataSet(df) # 데이터셋 분할 train_data, test_data = random_split(df_dataset, [2700, 300]) train_data, valid_data = random_split(train_data, [2400, 300]) print('Number of Train data: ',len(train_data)) print('Number of Valid data: ',len(valid_data)) print('Number of Test data: ',len(test_data))
출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)